2011-07-25 124 views
5

「活動」是一個位域。我需要將其設置爲true,如果這個CLIENT_ID該行已值爲true如何優化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 

這個查詢執行約2分鐘。請幫我優化它。

+0

'accounts.activity'是一個'BIT',不是嗎? – Quassnoi

+0

是的,這是一個BIT – DmitryB

回答

6

似乎activity字段是BIT,你不能對它做MINMAX

取而代之的是,使用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 

此創建於accounts (client_id, activity)的索引快速地工作。

您可能需要閱讀這篇文章:

+0

Quassnoi,非常感謝! – DmitryB

-2

加入是昂貴的。而不是加入,使用memcache並提出單獨的請求。

+0

誰投了我的答案似乎對sql請求優化陌生。 – Darm

+1

我沒有downvote你的答案。但是這個過程被稱爲「查詢優化」,而不是「請求優化」。如果你已經閱讀了更多關於它的信息,你首先會正確地調用它,其次,根本就不會給出這個答案。 – Quassnoi

+0

通過做「請求優化」,我在做「查詢優化」,選擇使用「WHERE ID IN(...)」。 – Darm