Проблема с MS SQL 2012 после перехода SQL 2005
От: gwg-605 Россия  
Дата: 14.05.15 15:34
Оценка:
Всем привет!

Вылезла неожиданно проблема с 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'

Запустил и офигел: https://dl.dropboxusercontent.com/u/9554880/actual_plan.png
Две Table Spool операции расщиперивают данные почти до 19 миллионов строк

Добавил дополнительные условия по времени для каждого join-a, вроде проблема уменьшилась работало около 5-6 секунд, не решение — но не так проблемно. Через какое-то время добавилось записей в таблицу и проблема возобновилась. Сейчас в таблице 134000 строк.

Запускал аналайзер, он сказал что ничего не может соптимизировать.

Куда копать. Я реально сиквелом уже лет пять не знимался.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.