2011-07-25 14 views
5

"activity"はビットフィールドです。このclient_idを持つ行の1つがtrueの値を持つ場合、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

はい、それはビットです – DmitryB

答えて

6

BITフィールドはMINまたはMAXとなります。これに代えて

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

参加は高価です。 Joinの代わりに、memcacheを使用して、別々のリクエストを行います。

+0

私の答えを落とした人は、SQLリクエストの最適化には見知かないようです。 – Darm

+1

私はあなたの答えをdownvoteしなかった。ただし、このプロセスは「リクエストの最適化」ではなく「クエリの最適化」と呼ばれます。あなたがそれについてもっと読んだら、最初に、あなたはそれを適切に呼び出すでしょう、そして、2番目に、この答えを全く与えていないでしょう。 – Quassnoi

+0

「リクエストの最適化」を行うことで、「クエリの最適化」を行い、「WHERE id IN(...)」を使用して選択します。 – Darm

関連する問題