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

Откуда:
Сообщений: 2
Коллеги, на сайте MSDN есть статья [url=]http://msdn.microsoft.com/ru-ru/library/ms190397.aspx[/url]
в которой утверждается следующее:
"Если включен параметр AUTO_UPDATE_STATISTICS (автоматическое обновление статистики), то оптимизатор запросов определяет, когда статистика может оказаться устаревшей, и обновляет ее, если она используется в запросе. Статистика становится устаревшей, после того как операции вставки, обновления, удаления или слияния изменяют распределение данных в таблице или индексируемом представлении. Оптимизатор запросов определяет, когда статистика может оказаться устаревшей, подсчитывая операции изменения данных с момента последнего обновления статистики и сравнивая количество изменений с пороговым значением."

Вот и вопрос у нас: как нам самостоятельно определить актуальность статистики? Где можно получить то самое количество "операции изменения данных"?

Зачем нам это? На этот вопрос отвечает та же MSDN если почитать чуть ниже:

"Были случаи, когда в приложении истекало время ожидания клиентских запросов в результате ожидания обновленной статистики. В некоторых случаях ожидание синхронной статистики может вызвать аварийное завершение приложений, в которых задано малое время ожидания."

У нас как раз такая ситуация, но отключать автообновление статистик мы пока не хотим, ведь в этом случае мы его отключим вообще для всей БД, а этого нельзя делать. Мы ее отключим, но перед этим мы хотим найти средство для контроля актуальности и пересчитывать ее самостоятельно в случае необходимости.
18 сен 14, 15:47    [16591307]     Ответить | Цитировать Сообщить модератору
 Re: Как определить актуальность статистики  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
romeo_robin,

прочитайте:

1) auto_apdate_stats_async
2) tf 2371
3) sysyndexes rowmodctr
4) sys.dm_db_stats_properties modification_counter
5) incremental statistics 2014 server
18 сен 14, 16:48    [16591665]     Ответить | Цитировать Сообщить модератору
 Re: Как определить актуальность статистики  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
auto_update_stats_async
18 сен 14, 16:49    [16591674]     Ответить | Цитировать Сообщить модератору
 Re: Как определить актуальность статистики  [new]
romeo_robin
Member

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

Спасибо, rowmodctr это то что надо было
19 сен 14, 16:08    [16596452]     Ответить | Цитировать Сообщить модератору
 Re: Как определить актуальность статистики  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
romeo_robin
churupaha,

Спасибо, rowmodctr это то что надо было


Не зачто, только лучше бы вы еще приняли во внимание modification_counter на первую колонку статистики.

+ тест

set nocount on;

create database stat_test_db;
go

use stat_test_db;
go

create table t1(c1 int, c2 int, c3 int);
go

insert into t1 default values;
go 10

create statistics st__t1__c1_c2_c3 on t1(c1, c2, c3);
create statistics st__t1__c2_c1_c3 on t1(c2, c1, c3);
create statistics st__t1__c2 on t1(c2);
create statistics st__t1__c3 on t1(c3);
go

print 'Смотрим начальное состояние счетчиков'

select
	si.rowmodctr
from
	sysindexes si
where
	si.id = object_id(N't1')
	and indid = 0;

select
	st.name,
	stp.modification_counter
from
	sys.stats st
		cross apply
	sys.dm_db_stats_properties(st.[object_id], st.stats_id) stp
where
	st.[object_id] = object_id(N't1');
go


print 'Меняем в первой в allocation order строке таблицы колонку c1 200 раз'
go

update top(1) t1
set
	c1 = 1
go 200

select
	si.rowmodctr
from
	sysindexes si
where
	si.id = object_id(N't1')
	and indid = 0;

select
	st.name,
	stp.modification_counter
from
	sys.stats st
		cross apply
	sys.dm_db_stats_properties(st.[object_id], st.stats_id) stp
where
	st.[object_id] = object_id(N't1');
go

print 'Обновляем 10 раз колонку c3 во всех строках 10 строках таблицы'
go

update t1
set
	c3 = 1
go 10

select
	si.rowmodctr
from
	sysindexes si
where
	si.id = object_id(N't1')
	and indid = 0;

select
	st.name,
	stp.modification_counter
from
	sys.stats st
		cross apply
	sys.dm_db_stats_properties(st.[object_id], st.stats_id) stp
where
	st.[object_id] = object_id(N't1');
go

print 'Вставляем одну строку'
go

insert into t1 default values
go

select
	si.rowmodctr
from
	sysindexes si
where
	si.id = object_id(N't1')
	and indid = 0;

select
	st.name,
	stp.modification_counter
from
	sys.stats st
		cross apply
	sys.dm_db_stats_properties(st.[object_id], st.stats_id) stp
where
	st.[object_id] = object_id(N't1');
go

print 'Удаляем одну строку'
go

delete top(1) from t1;
go

select
	si.rowmodctr
from
	sysindexes si
where
	si.id = object_id(N't1')
	and indid = 0;

select
	st.name,
	stp.modification_counter
from
	sys.stats st
		cross apply
	sys.dm_db_stats_properties(st.[object_id], st.stats_id) stp
where
	st.[object_id] = object_id(N't1');
go



+ вывод



Смотрим начальное состояние счетчиков

rowmodctr
-----------
10

name modification_counter
------------------------------ --------------------
st__t1__c1_c2_c3 0
st__t1__c2_c1_c3 0
st__t1__c2 0
st__t1__c3 0




Меняем в первой строке (allocation order) строке таблицы колонку c1 200 раз

rowmodctr
-----------
210

name modification_counter
------------------------------ --------------------
st__t1__c1_c2_c3 200
st__t1__c2_c1_c3 0
st__t1__c2 0
st__t1__c3 0




Обновляем 10 раз колонку c3 во всех 10-ти строках таблицы

rowmodctr
-----------
210

name modification_counter
------------------------------ --------------------
st__t1__c1_c2_c3 200
st__t1__c2_c1_c3 0
st__t1__c2 0
st__t1__c3 100




Вставляем одну строку

rowmodctr
-----------
211

name modification_counter
------------------------------ --------------------
st__t1__c1_c2_c3 201
st__t1__c2_c1_c3 1
st__t1__c2 1
st__t1__c3 101




Удаляем одну строку

rowmodctr
-----------
212

name modification_counter
------------------------------ --------------------
st__t1__c1_c2_c3 202
st__t1__c2_c1_c3 2
st__t1__c2 2
st__t1__c3 102


19 сен 14, 20:20    [16597873]     Ответить | Цитировать Сообщить модератору
 Re: Как определить актуальность статистики  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34760
Блог
romeo_robin,

рассмотрите возможно асинхронного обновления статистики
20 сен 14, 14:48    [16599639]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить