Domanda

Stiamo usando PostgreSQL v8.2.3.

Ci sono tavoli coinvolti:. IMPIEGATO e EMAILLIST

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

2 tavoli sono uniti in modo tale che se uno o EMPLOYEE.EMAIL1 EMPLOYEE.EMAIL2 non hanno una voce corrispondente, saranno restituite le righe.

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

EMAIL colonna che è varchar (256) della tabella EMAILLIST è indicizzato. Ora, il tempo di risposta è di 14 secondi.

statistiche di conteggio Tabella:. Attualmente, dipendente ha ottenuto 165,018 record & EMAILLIST ha 1,810,228 record, ed entrambe le tabelle sono destinato a crescere in futuro

  1. E 'una buona idea / approccio per indicizzare una colonna VARCHAR? Questa domanda colpiscono immediatamente nella mia mente a causa del motivo che non abbiamo indicizzato una colonna VARCHAR prima nella nostra applicazione. consigli esperti / suggerimento su questo sono molto apprezzati.
  2. Con questa query corrente e l'indice, il tempo di risposta di 14 secondi è ragionevole o c'è qualche spazio per un'ulteriore messa a punto? Quali sono di altro utente in tempo reale esperienza / parere sulla base di questo tipo di dimensioni tavolo e tempo di risposta?

Nota: Il mio attuale caso requisito / uso è spiegato in dettaglio titolo qui .

È stato utile?

Soluzione

Non c'è niente di sbagliato con l'indicizzazione di una colonna varchar se avete intenzione di fare query basate su di esso. Tuttavia si prega di tenere a mente che ci a limiti di alcuni indici e quanto in grado di indicizzare in un unico campo. Esempio non è possibile indice di una colonna che può contenere una quantità illimitata di testo. Tuttavia si dovrebbe essere in grado di fare un indice su varchar (256) senza alcun problema. Provatelo, e analizzare i miglioramenti nella vostra prestazione query per vedere se aiuta.

Altri suggerimenti

Non v'è alcun problema indicizzare una colonna varchar come tale

Dove si può diventare un problema è quando si ha la colonna varchar come FK in una tabella miliardi di fila. Farebbe quindi dispone di una chiave surrogata per la PK e FK, ma si sarebbe ancora bisogno di un unico vincolo / indice sulla chiave varchar naturale.

I tuoi tavoli sono piuttosto piccole e la performance potrebbe essere correlato alla clausola OR. Purtroppo, lo stesso problema si applica indipendentemente da come si struttura la query (e io non sono abbastanza familiarità con PostgreSQL di offrire molto dispiaciuto)

Prova sbarazzarsi del "OR e2.email IS NULL" parte della query e vedere quanto velocemente si corre. Se si corre più veloce si può essere in grado di eseguire più veloce con una "unione tutti"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top