it-swarm.it

È una buona idea / approccio indicizzare una colonna VARCHAR?

Stiamo usando PostgreSQL v8.2.3.

Ci sono tabelle coinvolte: [~ # ~] employee [~ # ~] and [~ # ~] 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 EMAIL che è varchar (256) della tabella EMAILLIST è 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 d'uso è spiegato in dettaglio qui .

33
Gnanam

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.

26
xenoterracide

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

Dove può diventare un problema è quando si dispone della colonna varchar come 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 tue tabelle sono piuttosto piccole e le prestazioni potrebbero essere correlate alla clausola OR. Sfortunatamente, lo stesso problema si applica indipendentemente dalla struttura della query (e non ho abbastanza familiarità con PostgresSQL da offrire molto dispiaciuto)

5
gbn

Prova a sbarazzarti della parte "OR e2.email IS NULL" della tua query e vedi quanto è veloce. Se funziona più velocemente potresti essere in grado di eseguirlo più velocemente con un "union all "

0
Joe Love