Вопрос значит хитрый ...
Допустим есть запрос на выборку в очень большой базе за 1 день.
- 7 таблиц.
- 3 таблицы с условием на одну и туже дату (дабы много не дергать). p.s. в других таблицах даты нету.
(даты в таблицах типа - datetime)
2 варианта решения:
1) образный пример:
declare @d1 datetime
declare @d2 datetime
set @d1 = '05.02.2015'
set @d1 = '05.03.2015'
select sum(t.price * t.val) from test t
innrer ...
innrer ...
innrer ...
where
t.date between @d1 and @d2 and
t2.date between @d1 and @d2 and
t3.date between @d1 and @d2
...
2) Образный пример:
select sum(t.price * t.val) from test t
innrer ...
innrer ...
innrer ...
where
t.date between '05.02.2015' and '05.03.2015' and
t2.date between '05.02.2015' and '05.03.2015' and
t3.date between '05.02.2015' and '05.03.2015'
...
А теперь вопрос:
Пример №2 выполняется 1 сек (с ходу)
А вот пример №1 копия №2 только с использованием 2х переменных ... выполняется 5 минут.
Какой тип данных использовать в переменных дабы №1 отработал как же быстро как и №2?
После утренней перезагрузки все стало нормально.
Ну, отрабатывает за 3 секунды, а это уже не 1-5 минут.
Подозрение падает на КЭШ процедур, а именно на то место где хранятся переменные всех процедур
(те что использовались и те что используются).
Погляжу сегодня чем мне поможет DBCC ...
Чисто теоретически из - за переполнения переменных не хватало места для моих двух новых, а старые он удалял и добавлял мои, ну, или вообще выгружать куда-нибудь на HDD ...
Ответа пока не нашел ...
Грешить на ожидание в очереди на выполнение как-то тоже не катит ...
Рискну предположить, что проблема не в типах данных, а в планах исполнения и статистике SQL Server.
А вы случаной параметры не в хранику\функцию передаете? Может тут имеет место Parameter Sniffing? www.brentozar.com/archive/2013/06/the-elephant-and...
Не, я ее еще не засунул в процедуру ... но она да, будет потом ею.
Сейчас, это просто окошко (песочница) запроса в котором я тыкаю F5 :)
Но, был весьма удивлен такой разницей ...
Ибо мне нужно для выполнения хранимой процедуры переменные даты которые будут браться по условию и отрабатывать то самое чудо ...
Разумеется ... я бы хотел 1 сек, а не минуты :(
Попробуйте выполнить такой код (не уверен, что поможет):
DECLARE @d1 datetime
DECLARE @d2 datetime
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
SET @d1 = '05.02.2015'
SET @d1 = '05.03.2015'
SET @SQLString = N'select sum(t.price * t.val) from test t
innrer ...
innrer ...
innrer ...
where
t.date between @d1 and @d2 and
t2.date between @d1 and @d2 and
t3.date between @d1 and @d2';
SET @ParmDefinition = N'@d1 datetime, @d2 datetime'
думаю надо смотреть DBCC и все что связано с кэшем.
видимо надо юзать ... что-то похожее на это:
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);