2011-07-25 4 views
5

"activité" est un champ de bits. Je dois le mettre à true si l'une des lignes avec cette client_id a valeur trueComment optimiser une requête 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 

Cette requête exécute environ 2 minutes. S'il vous plaît aidez-moi à l'optimiser.

+0

'accounts.activity' est un' BIT', est-ce pas? – Quassnoi

+0

oui, c'est un BIT – DmitryB

Répondre

6

Semble activity champ est un BIT et vous ne pouvez pas faire un MIN ou MAX dessus.

Au lieu de cela, utilisez 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 

Créer un index sur accounts (client_id, activity) pour que cela fonctionne rapidement.

Vous pouvez lire cet article:

+0

Quassnoi, merci beaucoup! – DmitryB

-2

La jointure est chère. Au lieu de rejoindre, utilisez memcache et faites des requêtes séparées.

+0

Les gens qui votent vers le bas ma réponse semblent être étranger aux optimisations de demande de sql. – Darm

+1

Je n'ai pas baissé votre réponse. Cependant, le processus est appelé "optimisation de requête", pas "optimisation de requête". Si vous aviez lu plus à ce sujet, vous, d'abord, l'appellerais correctement et, deuxièmement, n'aurait pas donné cette réponse du tout. – Quassnoi

+0

En faisant "optimisation de la requête", je fais "optimisation de la requête", sélectionnez sont en utilisant "WHERE id IN (...)". – Darm