Как оптимизировать TSQL-запрос?
«Активность» – это бит. Мне нужно установить значение 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 минут. Пожалуйста, помогите мне оптимизировать его.
Кажется, поле 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)
чтобы это быстро работало.
Вы можете прочитать эту статью:
- Минимальное и максимальное по битовым полям: SQL Server
Присоединяйтесь дорого. Вместо Join используйте memcache и делайте отдельные запросы.