Estamos usando PostgreSQL v8.2.3.
Hay tablas involucradas: EMPLEADO y EMAILLIST .
Table 1: EMPLOYEE (column1, column2, email1, email2, column5, column6)
Table 2: EMAILLIST (email)
2 tablas se unen de tal manera que si EMPLOYEE.EMAIL1 o EMPLOYEE.EMAIL2 no tienen una entrada coincidente, esas filas serán devueltas.
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 columna EMAIL
que es varchar (256) de la EMAILLIST
tabla está indexada. Ahora, el tiempo de respuesta es de 14 segundos.
Estadísticas de conteo de tablas: actualmente, el EMPLEADO tiene 165,018 registros y EMAILLIST tiene 1,810,228 registros, y se espera que ambas tablas crezcan en el futuro.
- ¿Es una buena idea / enfoque indexar una columna VARCHAR? Esta pregunta inmediatamente me llamó la atención por la razón por la que no hemos indexado una columna VARCHAR antes en nuestra aplicación. Los consejos / sugerencias de expertos sobre esto son muy apreciados.
- Con esta consulta e índice actuales, el tiempo de respuesta de 14 segundos es razonable o ¿hay alguna posibilidad de realizar más ajustes? ¿Cuál es la experiencia / opinión en tiempo real de otros usuarios basada en este tipo de tamaño de tabla y tiempo de respuesta?
NOTA: Mi requisito / caso de uso real se explica en detalle aquí .
fuente
No hay problema al indexar una columna varchar como tal
Donde puede convertirse en un problema es cuando tiene la columna varchar como FK en una tabla de miles de millones de filas. Entonces tendría una clave sustituta para PK y FK, pero aún necesitaría una restricción / índice único en la clave varchar natural.
Sus tablas son bastante pequeñas y el rendimiento podría estar relacionado con la cláusula OR. Desafortunadamente, el mismo problema se aplica sin importar cómo se estructura la consulta (y no estoy lo suficientemente familiarizado con PostgresSQL como para ofrecerle mucho)
fuente
Intente deshacerse de la parte "OR e2.email IS NULL" de su consulta y vea qué tan rápido se ejecuta. Si se ejecuta más rápido, puede ejecutarlo más rápido con una "unión de todos"
fuente