Я использую MSSQL2008. Запрос выполняется в основном медленно (> 12 часов), но в определенное время суток, при тех же данных, он выполняется быстро (<2 минуты). Нет заблокированных таблиц. </p>
Наблюдение состоит в том, что запрос выполняется очень медленно с LEFT OUTER JOIN табличной переменной, в конце может быть более 5 миллионов записей, которые нужно обработать и вставить в другую табличную переменную.
Я проверил настройку tempdb - она установлена до 1024, неограниченно. Где может быть подвох?
Я попытался уменьшить количество записей набора результатов (эти 5 миллионов записей), и это помогает, поэтому похоже, что у него проблемы с некоторыми ресурсами БД, ЦП в порядке, память включена сервер тоже в порядке, другие приложения, которые используют ту же БД, работают без сбоев. Более того, один и тот же запрос, одни и те же данные выполняются время от времени быстро (<2 минуты). </p>
Запрос не написан мной, поэтому я не могу изменить его, чтобы сохранить ожидаемые результаты в конце, поэтому Мне нужно выяснить, что является причиной того, что запрос, который выполняется в памяти, работает так медленно и время от времени он работает быстро.
Для лучшего изображения я прилагаю пример запроса выглядит так.
DECLARE @table_variable TABLE(
x
y
y
)
INSERT INTO @table_variable (this is fast always)
SELECT
.
.
FROM DB_table
INSERT INTO another_table_variable
SELECT (this stm runs ages, but time to time it retrieve data in 2min)
DISTINCT
coalesce(A1.x, A2.y),
coalesce(A1.xx, A2.yy),
coalesce(A1.xxx, A2.yyy),
coalesce(A1.xxxx, A2.yyyy)
FROM transactions tr
LEFT OUTER JOIN @table_variable A1 ON (condition tr.u = A1.u )
LEFT OUTER JOIN @table_variable A2 ON (condition tr.u = A2.uu )
LEFT OUTER JOIN @table_variable A3 ON (condition tr.u = A3.uuu )
Я не знаю, достаточен ли пример для каких-либо идей, но спасибо для любой из них.