2011-07-25 126 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