2011-07-25 14 views
5

"actividad" es un campo de bit. Tengo que ponerlo en cierto si una de las filas con este client_id tiene verdadero valor¿Cómo optimizar una consulta TSQL?

SELECT c.client_id, u.branch_id, a.account_id, activity 
FROM Clients c INNER JOIN 
     accounts a ON c.id=a.client_id INNER JOIN uso u ON a.uso_id = u.uso_id, 
    (SELECT MAX(CONVERT(int,accounts.activity)) as activity, client_id 
     FROM accounts GROUP BY client_id) activ 
WHERE activ.client_id = c.id 

Esta consulta se ejecuta alrededor de 2 minutos. Por favor, ayúdame a optimizarlo.

+0

'' accounts.activity' es un BIT', ¿no es así? – Quassnoi

+0

sí, es un BIT – DmitryB

Respuesta

6

Seems activity campo es BIT y no puede hacer un MIN o MAX en él.

En lugar de ello, utilice TOP:

SELECT c.client_id, u.branch_id, a.account_id, 
     (
     SELECT TOP 1 activity 
     FROM accounts ai 
     WHERE ai.client_id = c.id 
     ORDER BY 
       activity DESC 
     ) 
FROM clients c 
JOIN accounts a 
ON  c.id = a.client_id 
JOIN uso u 
ON  a.uso_id = u.uso_id 

crear un índice en accounts (client_id, activity) para que esto funcione rápido.

es posible que desee leer este artículo:

+0

Quassnoi, muchas gracias! – DmitryB

-2

Unirse es costoso. En lugar de unirse, use Memcache y realice solicitudes por separado.

+0

Las personas que votaron mi respuesta parecen ser más extrañas a las optimizaciones de solicitud sql. – Darm

+1

No rechacé su respuesta. Sin embargo, el proceso se llama "optimización de consulta", no "optimización de solicitud". Si hubiera leído más al respecto, primero lo llamaría correctamente y, en segundo lugar, no habría dado esta respuesta en absoluto. – Quassnoi

+0

Haciendo "optimización de solicitud", estoy haciendo "optimización de consulta", seleccione usando "WHERE id IN (...)". – Darm

Cuestiones relacionadas