Как оптимизировать TSQL-запрос? - PullRequest
5 голосов
/ 25 июля 2011

"активность" - это битовое поле. Мне нужно установить значение true, если одна из строк с этим client_id имеет значение true

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 минут. Пожалуйста, помогите мне оптимизировать его.

Ответы [ 2 ]

6 голосов
/ 25 июля 2011

Кажется, activity поле является 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 голосов
/ 25 июля 2011

Присоединиться дорого.Вместо Join используйте memcache и делайте отдельные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...