Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 95
Сразу прошу прощенья за возможно ламерский вопрос.

СУБД MS SQL.
Нужно ли выполнять очистку процедурного кэша, после обновления статистики?

Дело в том, что фирма 1С рекомендует обновлять процедурный кэш каждый раз, после обновления статистики т.к. нужно вызвать перекомпиляцию запросов.

При этом в документации по MS SQL сказано, что обновление статистики автоматически вызывает перекомпиляцию запросов
http://technet.microsoft.com/ru-ru/library/ms187348.aspx

Где истина?
Нужно ли выполнять очистку кэша или запрос и так будет перекомпилирован если по таблице была обновлена статистика?
3 янв 14, 15:10    [15374513]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
верьте офиц.документации..вот только лучше читать ее на англицком.
Но если сомневаетесь ,то
1. Создаете таблицу
2. заполняете ее
3.пишите запрос
4.дергаете его 5 раз :) (смотрите наличие скомпиленого плана)
5.обновлете статистику по таблице
6.включатете профайлер (добавляете событие рекмоплиции)
7.дергаете свой запрос опять
8. смотрите трассу
3 янв 14, 15:26    [15374560]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 95
Maxx,

Да, как раз собираюсь опыт провести, написал на всякий случай, может кто-то точно знает ответ.
3 янв 14, 15:34    [15374569]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 95
Maxx,

Получается очень интересная ситуация.

Провел следующий опыт:
Очищаю процедурный кэш
Удаляю из одной таблицы все записи
Выполняю простой запрос с Inner Join
Добавляю 1000 записей в пустую таблицу и снова выполняю тот же запрос

Если включено автообновление статистики, то перед выполнением запроса происходит обновление статистики (т.к. изменилось более 20% строк в таблице) и происходит перекомпиляция запроса (событие Recompile в Profiler).
Такое поведение полностью совпадает с описанием в документации.

Но при ручном обновлении (через UPDATE STATISTICS с отключенным автообновлением статистики) перекомпиляции нет, хотя судя по документации должна быть.

Почему такое может быть?
Может я что-то неправильно делаю?
4 янв 14, 19:12    [15377139]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Андрей_Батькович
Почему такое может быть?
Может я что-то неправильно делаю?
Вы что-то путаете. Неважно каким образом обновилась статистика. Вот вам пример:
use tempdb;
go

create table dbo.t1 (a int, dummy char(10));
go

create index IX_t1__a on dbo.t1(a);
go

select count(dummy) from dbo.t1 where a = 0;
select count(*) from dbo.t1 where a = 0;
go

insert into dbo.t1 (a)
select top (1000)
 1
from
 master.dbo.spt_values a cross join
 master.dbo.spt_values b;
go

select count(dummy) from dbo.t1 where a = 0;
select count(*) from dbo.t1 where a = 0;
go

insert into dbo.t1 (a) values (0);
update statistics dbo.t1 (IX_t1__a);
go

select count(dummy) from dbo.t1 where a = 0;
select count(*) from dbo.t1 where a = 0;
go

drop table dbo.t1;
go
Первый запрос будет перекомпилирован 2 раза. Второй - ниразу. Потому что у второго запроса уровень оптимизации trivial.
4 янв 14, 20:37    [15377351]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 95
invm,

Спасибо, изменил текст запроса, взял за пример ваш запрос с выбором количества записей и запрос стал перекомпилироваться.
4 янв 14, 23:36    [15377847]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли выполнять очистку процедурного кэша, после обновления статистики?  [new]
Андрей_Батькович
Member

Откуда:
Сообщений: 95
invm,
Еще один вопрос:

Правильно ли я понимаю, что если в плане обслуживания есть обновление статистики, то нет необходимости добавлять еще и очистку процедурного кэша?

Ведь планы запросов все равно будут автоматически перекомпилироваться после обновления статистики.
4 янв 14, 23:40    [15377861]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить