È una buona idea / approccio indicizzare una colonna VARCHAR?


32

Stiamo usando PostgreSQL v8.2.3.

Vi sono tabelle coinvolte: DIPENDENTE ed EMAILLIST .

Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)

2 tabelle vengono unite in modo tale che se EMPLOYEE.EMAIL1 o EMPLOYEE.EMAIL2 non hanno una voce corrispondente, tali righe verranno restituite.

SELECT employee.email1, employee.email2,
        e1.email IS NOT NULL AS email1_matched, e2.email IS NOT NULL AS email2_matched
   FROM employee
   LEFT JOIN emaillist e1 ON e1.email = employee.email1
   LEFT JOIN emaillist e2 ON e2.email = employee.email2
 WHERE e1.email IS NULL OR e2.email IS NULL

La colonna EMAILche è varchar (256) della EMAILLISTtabella è indicizzata. Ora, il tempo di risposta è di 14 secondi.

Statistiche sul conteggio delle tabelle: attualmente EMPLOYEE ha ottenuto 165.018 record e EMAILLIST ha ottenuto 1.810.228 record ed entrambe le tabelle dovrebbero crescere in futuro.

  1. È una buona idea / approccio indicizzare una colonna VARCHAR? Questa domanda mi viene immediatamente in mente a causa del motivo per cui non abbiamo indicizzato una colonna VARCHAR prima nella nostra applicazione. I consigli / suggerimenti degli esperti su questo argomento sono molto apprezzati.
  2. Con questa query e indice attuali, il tempo di risposta di 14 secondi è ragionevole o esiste un margine per l'ulteriore ottimizzazione? Quali sono le esperienze / opinioni in tempo reale di altri utenti basate su questo tipo di dimensioni della tabella e tempi di risposta?

NOTA: il mio requisito / caso reale è spiegato in dettaglio qui .

Risposte:


25

Non c'è niente di sbagliato nell'indicizzare una colonna varchar se farai query basate su di essa. Tuttavia, tieni presente che esiste un limite ad alcuni indici e quanto possono indicizzare in un singolo campo. Esempio non è possibile indicizzare una colonna che può contenere una quantità illimitata di testo. Tuttavia, dovresti essere in grado di fare un indice su varchar (256) senza problemi. Provalo e analizza i miglioramenti nelle prestazioni delle tue query per vedere se aiuta.


Grazie per il tuo prezioso commento. Esiste un margine per l'ulteriore ottimizzazione della mia query al riguardo per ridurre il tempo di risposta da 14 secondi?
Gnanam,

2
Senza i risultati di EXPLAIN, è impossibile dire cosa ottimizzare. Anche la versione 8.2.3 è obsoleta, è necessario eseguire l'aggiornamento a una versione più recente, con 4 anni di ritardo nella manutenzione. Le versioni 8.3, 8.4 e 9.0 sono anche più veloci in molte situazioni. Migliori statistiche aiutano anche a ottenere prestazioni.
Frank Heikens,

5

Non vi è alcun problema a indicizzare una colonna varchar in quanto tale

Dove può diventare un problema è quando hai la colonna varchar come un FK in una tabella di miliardi di righe. Avresti quindi una chiave surrogata per PK e FK, ma avresti comunque bisogno di un vincolo / indice univoco sulla chiave varchar naturale.

Le tabelle sono piuttosto piccole e le prestazioni potrebbero essere correlate alla clausola OR. Sfortunatamente, lo stesso problema si applica a prescindere da come strutturi la query (e non ho abbastanza familiarità con PostgresSQL per offrire molte scuse)


0

Prova a sbarazzarti della parte "OR e2.email IS NULL" della tua query e vedi quanto è veloce. Se corre più veloce potresti essere in grado di farlo più veloce con un "unione tutto"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.