Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Статистика не обновляется при выполнении закешированного запроса  [new]
ХромойЗаяц
Guest
Добрый вечер, столкнулся с проблемой когда не вызывалось автоматическое обновление статистики, несмотря на то, что она подходила под условие автоматического обновления. Проблема была в запросе с помощью которого и должно был идти вызов автоматического обновления статистики, а точнее в том что его план находился в кэше. И выполняя этот закэшированный запрос, автоматическое обновление статистики не происходило. Можно ли это исправить не вызывая вручную обновление статистики?
11 июн 16, 17:55    [19284254]     Ответить | Цитировать Сообщить модератору
 Re: Статистика не обновляется при выполнении закешированного запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ХромойЗаяц
несмотря на то, что она подходила под условие автоматического обновления.
Как вы в этом удостоверились?
Версия сервера?
11 июн 16, 18:59    [19284434]     Ответить | Цитировать Сообщить модератору
 Re: Статистика не обновляется при выполнении закешированного запроса  [new]
ХромойЗаяц
Guest
SqlServer2014SP1

invm,

use tempdb
go

if object_id('tx', 'u') is not null
	drop table tx
go

create table tx(id int not null default 1)
alter table tx add constraint pk_tx primary key(id)
insert into tx default values
go

exec sp_executesql N'select * from tx where id > @id', N'@id int', 1
go
select s.stats_id, s.name, s.auto_created, sp.last_updated, sp.rows, sp.modification_counter
from sys.stats s cross apply sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
where 
s.object_id = object_id('tx');
go

-- делаем статистику недействительной
update tx set id = id where id = 1
go 500

-- после этого запроса статистика автоматически не обновлялась
exec sp_executesql N'select * from tx where id > @id', N'@id int', 2
go
select s.stats_id, s.name, s.auto_created, sp.last_updated, sp.rows, sp.modification_counter
from sys.stats s cross apply sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
where 
s.object_id = object_id('tx');
go

-- сейчас статистика обновится
update statistics tx pk_tx
go
select s.stats_id, s.name, s.auto_created, sp.last_updated, sp.rows, sp.modification_counter
from sys.stats s cross apply sys.dm_db_stats_properties(s.object_id, s.stats_id) sp
where 
s.object_id = object_id('tx');
go
11 июн 16, 21:31    [19284796]     Ответить | Цитировать Сообщить модератору
 Re: Статистика не обновляется при выполнении закешированного запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Ваш запрос порождает тривиальный план (optimization level - trivial). Поэтому до автообновления статистик дело не доходит.
Перепишите, например, так:
exec sp_executesql N'select * from tx where id > (select @id)', N'@id int', 1
И статистика обновится.
11 июн 16, 22:35    [19284925]     Ответить | Цитировать Сообщить модератору
 Re: Статистика не обновляется при выполнении закешированного запроса  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
ХромойЗаяц,

Добавьте в своем эксперименте
exec sp_executesql N'select *, (select 1) from tx where id > @id', N'@id int', 1
go

и посмотрите.
11 июн 16, 22:36    [19284926]     Ответить | Цитировать Сообщить модератору
 Re: Статистика не обновляется при выполнении закешированного запроса  [new]
ХромойЗаяц
Guest
Спасибо огромное за ответы, обновляется в обоих вариантах.
12 июн 16, 07:01    [19285391]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить