У меня есть две таблицы:SQL: странное поведение производительности запросов
Nodes
- действительно маленький столик, около 20 строкEvents
- довольно большой стол, около 10M строк
и после запроса :
select
e.DeviceAlias as Mac, n.NodeId, n.city as City, n.street as Street, e.Status,
CASE WHEN e.Status = 'U' THEN 'Unknown' ELSE 'Known' END as 'Source',
COUNT (*) as 'Count',
SUM(CASE WHEN e.SentMessageId > 0 THEN 1 ELSE 0 END) as SentMsgCount
from
events e
join
Nodes n on e.NodeId = n.NodeId
where
e.InsertDate >= @startdate
and e.InsertDate <= @enddate
group by
e.DeviceAlias, e.Status, n.NodeId, n.city, n.street
Запрос выполняется более 5 минут. У меня есть все необходимые индексы, и советник sql perf не предлагает никаких дополнительных индексов или статистики. Однако, если я избавлюсь от соединения и выполним следующий запрос:
select
e.DeviceAlias as Alias, NodeId,
CASE WHEN e.Status = 'U' THEN 'Unknown' ELSE 'Known' END as 'Source',
COUNT (*) as 'Count',
SUM(CASE WHEN e.SentMessageId > 0 THEN 1 ELSE 0 END) as SentMsgCount
from
events e
where
e.InsertDate >= '2014-07-01'
and e.InsertDate <= '2014-11-28'
group by
e.DeviceAlias,nodeid, e.Status
он выполняет в течение 30 секунд.
Простым решением является использование второго запроса и заполнение остальных данных из таблицы узлов в коде C#.
Но это меня беспокоит, почему соединение с таким маленьким столом дает эту огромную производительность? Есть ли способ лучше?
Вы действительно хотите выполнить 5 минут или 5 минут, чтобы вернуть весь результат запроса клиенту? Можете ли вы попробовать обернуть запрос чем-то вроде SELECT COUNT (*) FROM (...) T и посмотреть, продолжает ли он выполняться в течение 5 минут? – CrimsonKing
У вас есть актуальная статистика? – erikkallen
Я выполняю оба запроса от студии управления. Насколько мне известно, он отображает время выполнения запроса и возвращает результат. В любом случае второй запрос выполняется за 30 секунд, тогда как объем данных почти одинаковый (ровно столько же строк) – Marcin