Всем привет!
Вылезла неожиданно проблема с MS SQL 2012 после перехода с MS SQL 2005. Запрос стал выполняться 40-50 сукунд вместо нескольких милисекунд.
select a.dg dt, dt0.value_int v0, dt1.value_int v1
from DeviceTimesByMinutes a
left outer join DeviceValues dt0
on a.dg = dbo.fn_RoundToMinutes( dt0.recorded )
left outer join DeviceValues dt1
on a.dg = dbo.fn_RoundToMinutes( dt1.recorded )
where
a.dg >= '2015-05-09 05:07:52'
and a.dg < '2015-05-12 05:07:52'
and dt0.nodeid = 'house0'
and dt0.deviceid = 'therm0'
and dt0.recorded >= '2015-05-09 05:07:52'
and dt0.recorded < '2015-05-12 05:07:52'
and dt1.nodeid = 'house0'
and dt1.deviceid = 'therm1'
and dt1.recorded >= '2015-05-09 05:07:52'
and dt1.recorded < '2015-05-12 05:07:52'
order by dt
GO
CREATE VIEW [dbo].[DeviceTimesByMinutes]
AS
select dbo.fn_RoundToMinutes( recorded ) as dg
from DeviceValues
group by dbo.fn_RoundToMinutes( recorded )
GO
CREATE FUNCTION [dbo].[fn_RoundToMinutes]( @date AS DATETIME )
RETURNS DATETIME
AS
BEGIN
DECLARE @ret AS DATETIME;
SET @ret = DATEADD( ss, -DATEPART( ss, @date ), @date );
RETURN @ret;
END
GO
Изначально запрос был без вот этих строк:
and dt0.recorded >= '2015-05-09 05:07:52'
and dt0.recorded < '2015-05-12 05:07:52'
and dt1.recorded >= '2015-05-09 05:07:52'
and dt1.recorded < '2015-05-12 05:07:52'
Запустил и офигел:
Две Table Spool операции расщиперивают данные почти до 19 миллионов строк
Добавил дополнительные условия по времени для каждого join-a, вроде проблема уменьшилась работало около 5-6 секунд, не решение — но не так проблемно. Через какое-то время добавилось записей в таблицу и проблема возобновилась. Сейчас в таблице 134000 строк.
Запускал аналайзер, он сказал что ничего не может соптимизировать.
Куда копать. Я реально сиквелом уже лет пять не знимался.