2010-06-09 24 views
6

Tengo una tabla T1 con 60 filas y 5 columnas: ID1, ID2, info1, info2, info3.Acelere una consulta, unión interna simple con una tabla grande y una tabla pequeña

Tengo una tabla T2 con 1,2 millones de filas y otras 5 columnas: ID3, ID2, info4, info5, info6.

Quiero obtener (ID1, ID2, info4, info5, info6) de todas las filas donde coinciden los ID2. Actualmente mi consulta se ve así:

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1, T2 
WHERE T1.ID2 = T2.ID2; 

Esto tarda unos 15 segundos en ejecutarse. Mi pregunta es: ¿debería tomar tanto tiempo, y si no, cómo puedo acelerarlo? Me imagino que no debería, ya que T1 es muy pequeño.

Le pedí a PostgreSQL que EXPLICA la consulta, y dice que tiene hash T2, luego hash une ese hash con T1. Parece que hash T2 es lo que lleva tanto tiempo. ¿Hay alguna forma de escribir la consulta para que no tenga que modificar el hash T2? O bien, ¿hay alguna manera de tenerlo en la memoria caché del hash de T2 para que no vuelva a hacerlo? Las tablas solo se actualizarán cada pocos días.

Si hace la diferencia, T1 es una tabla temporal creada anteriormente en la sesión.

Respuesta

13

No debería tomar tanto tiempo :)

crear un índice en T2(ID2) debería mejorar el rendimiento de su consulta:

CREATE INDEX idx_t2_id2 ON t2 (id2); 
+1

bueno ahora es increíblemente rápido =). – Claudiu

+0

agregué índices al resto de la base de datos también, y ahora puedo agregarle nuevos elementos 50 veces/segundo en vez de ... una vez cada 2 segundos. ¡sweeet! – Claudiu

+0

@PeterLang si pudiera escribir la consulta completa, entendiendo que esto sería mucho más fácil para los principiantes. – 3kstc

0

puede estar usando JOIN aumento de la velocidad de consulta:

SELECT T1.ID1, T2.ID2, 
    T2.info4, T2.info5, T2.info6 
FROM T1 
JOIN T2 ON T2.ID2 = T1.ID2; 

No sé exactamente, pero puede ser su consulta, en primer lugar, una todas las filas en ambas tablas, y luego aplique las condiciones DONDE y su problema.

Y, por supuesto, como vio Peter Lang, debe crear el índice.

+0

ya pensé en esto, pero no hizo la diferencia. Creo que mi camino es el azúcar de sintaxis de esta manera. – Claudiu

+0

Así que no estaba bien :) Pero siempre cuando quiero unir mesas utilizo JOIN en su lugar; –

+0

La sintaxis JOIN se estandarizó mucho más tarde que el uso tradicional de join-conditions-in-the-where-clause. Puedo recordar que recibieron un nuevo soporte en Oracle 8 más o menos. En mi humilde opinión, un caso de un nuevo estándar realmente mejora las cosas (especialmente las uniones externas) por una vez. – araqnid

0

Primero, haz una unión.

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1 
    JOIN T2 ON T1.ID2 = T2.ID2; 

Luego intente crear e indexar en T2.d2.

De lo contrario, si es posible, puede agregar la columna ID1 a T2. Actualícelo según corresponda cada pocos días a medida que afirma. Luego solo una simple consulta en T2 sin uniones.

SELECT T2.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T2 
    WHERE T2.ID2 = A_VALUE; 

Nuevamente, se recomienda un índice en T2.ID2.

Cuestiones relacionadas