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

Откуда: in the middle of nowhere
Сообщений: 496
Интересует практический (не теоретический а именно практический) алгоритм (хотя бы приблизительный) как SQL Server считает index/field density. Вот например запускаем мы команду:

dbcc show_statistics (Orders,OrderDate)
И получаем результат

Statistics for INDEX 'OrderDate'.

Updated              Rows   Rows Sampled Steps  Density           Average key length 
-----------------------------------------------------------------------------
Dec 23 2002 9:30AM 830 830 187 1.6842016E-3 12.0

Вот какие расчеты и как выполняет SQL Server для получения значения для Density - 1.6842016E-3?

Выспрашивание гугля на эту тему положительного результата не дало.

Заранее спасибо.
17 дек 10, 09:34    [9953384]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
Aleksey-K
Member

Откуда: Москва
Сообщений: 3116
AlphaDog, зачем Гуглить!
А этого (из BOL) не достаточно:
Density:
"...Вычисляется как «1/различающиеся значения» для всех значений в первом ключевом столбце объекта статистики, за исключением граничных значений гистограммы. Это значение плотности не используется оптимизатором запросов и отображается для обратной совместимости с версиями, выпущенными до SQL Server 2008.."
С уважением, Алексей
17 дек 10, 10:10    [9953664]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Density:
> "...Вычисляется как «1/различающиеся значения» для всех значений в первом ключевом столбце объекта статистики, за
> исключением граничных значений гистограммы.

я попробовал сам посчитать, у меня получилось не "1/различающиеся значения",
а "количество различающихся/общее количество" значений, которых нет среди RANGE_HI_KEY.

Posted via ActualForum NNTP Server 1.4

17 дек 10, 11:20    [9954233]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
AlphaDog
Member

Откуда: in the middle of nowhere
Сообщений: 496
Aleksey-K
AlphaDog, зачем Гуглить!
А этого (из BOL) не достаточно:
Density:
"...Вычисляется как «1/различающиеся значения» для всех значений в первом ключевом столбце объекта статистики, за исключением граничных значений гистограммы. Это значение плотности не используется оптимизатором запросов и отображается для обратной совместимости с версиями, выпущенными до SQL Server 2008.."
С уважением, Алексей


Пропустил сие. Спасибо. Дальше вопрос - а как нынче 2008 сервер выбирает индекс для запроса? Есть ссылка на алгоритм?

И подвопрос. Есть у нас Performance dashboard - он показывает где по мнению СКЛ не хватает индексов и предлагает скрипты по их созданию. Только одна тут есть проблема - поля он для индексов рисует более-менее правильные, но вот плотность распределения по полям он не учитывает. Поэтому часто все его предложения по индексам - туфта. Есть ли какие скрипты которые позволяют строить более разумные индексы. С Index tuning wizard я игрался - результат не особо порадовал. Ручками получается лучше. Вот теперь ищу промежуточный вариант - что бы предложения на индексы генерились автоматом и более разумные чем просто набор полей, и при этом что бы у меня была какая-нибудь статистика дающая повод для анализа на принятие решения. Спасибо.
23 дек 10, 09:03    [9985690]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
http://msmvps.com/blogs/gladchenko/archive/2007/11/13/1311293.aspx
23 дек 10, 09:09    [9985704]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
AlphaDog
Member

Откуда: in the middle of nowhere
Сообщений: 496
tpg
http://msmvps.com/blogs/gladchenko/archive/2007/11/13/1311293.aspx


Я собственно об этом... Что mid.equality_columns и mid.inequality_columns возвращают поля в совершено идиотском порядке, что часто сводит преимущества предложеного индекса на нет.

Конечно есть вариант перебрать все поля для индексов руками на предмет селективности, но когда мне пришло предложение на 340 новых индексов... Ну и, спрашивается, нафига мне нужны вот такие индексы:

CREATE INDEX missing_index_173 ON [dbo].[bol_master] ([oe_plc_id], [oe_order_nbr])
CREATE INDEX missing_index_175 ON [dbo].[bol_master] ([oe_order_nbr], [oe_plc_id],[quantity_entry_nbr])

В смысле нафига нужны оба - особенно если проверить что [oe_plc_id] имеет всего 2 уникальных значения.

Пока вот смотрю на

DECLARE @s TABLE     
	(TableName VARCHAR(MAX), 
	FieldsList VARCHAR(MAX))  

INSERT INTO  @s	
	select
	OBJECT_NAME(d.object_id) [TableName],
	COALESCE(d.equality_columns,'') 
	+ CASE WHEN Len(d.equality_columns) > 0 And Len(d.inequality_columns) > 0 THEN ', '	ELSE '' END 
	+ COALESCE(d.inequality_columns,'')
from sys.dm_db_missing_index_groups g
	join sys.dm_db_missing_index_group_stats gs on gs.group_handle = g.index_group_handle
	join sys.dm_db_missing_index_details d on g.index_handle = d.index_handle
where d.database_id = DB_ID()
	and d.object_id in (
select d.object_id
from (select 
			database_id,
			object_id,
			row_number() over (partition by database_id order by sum(page_io_latch_wait_in_ms) desc) as row_number,
			sum(page_io_latch_wait_count) as page_io_latch_wait_count,
			sum(page_io_latch_wait_in_ms) as page_io_latch_wait_in_ms,
			sum(range_scan_count) as range_scans,
			sum(singleton_lookup_count) as index_lookups
		from sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL)
		where page_io_latch_wait_count > 0
		group by database_id, object_id ) as d
	left join (select distinct database_id, object_id from sys.dm_db_missing_index_details) as mid 
		on mid.database_id = d.database_id and mid.object_id = d.object_id
where 
--d.row_number <= 20 and 
d.database_id = DB_ID()
and 
mid.database_id is not null	)
	


SELECT  DISTINCT
	'SELECT COUNT(*), ' + LTRIM(T.FieldsList.value('.', 'varchar(max)')) + ' FROM [' + s.TableName + '] GROUP BY ' + LTRIM(T.FieldsList.value('.', 'varchar(max)')),
	s.TableName, 
	LTRIM(T.FieldsList.value('.', 'varchar(max)')) AS Field 
FROM (SELECT    
	TableName, 
	CONVERT(XML, '<row>' + REPLACE(FieldsList, ',', '</row><row>') + '</row>') AS FieldsList           
	FROM @s a) s         
	CROSS APPLY s.FieldsList.nodes('row') AS T(FieldsList)

Вроде то что нужно получается. Теперь если бы оно еще бы и само поля бы в правильной последовательноси в индекс засовывало бы...
23 дек 10, 10:23    [9986200]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
AlphaDog
Member

Откуда: in the middle of nowhere
Сообщений: 496
Ну и что бы два раза не вставать - когда информация в sys.dm_db_missing_index_groups, sys.dm_db_missing_index_group_stats и sys.dm_db_missing_index_details обновляется? И как их можно почистить самому?

Спасибо
23 дек 10, 10:27    [9986233]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
AlphaDog
...когда информация в sys.dm_db_missing_index_groups, sys.dm_db_missing_index_group_stats и sys.dm_db_missing_index_details обновляется? И как их можно почистить самому?
Ну, это документировано - обновляются при выполнении запроса, сбрасываются при перезагрузке сервера.
23 дек 10, 10:37    [9986298]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
AlphaDog
Member

Откуда: in the middle of nowhere
Сообщений: 496
tpg
AlphaDog
...когда информация в sys.dm_db_missing_index_groups, sys.dm_db_missing_index_group_stats и sys.dm_db_missing_index_details обновляется? И как их можно почистить самому?
Ну, это документировано - обновляются при выполнении запроса, сбрасываются при перезагрузке сервера.


Ну вот у нас народ с работы слинял - и куча предложений по индексам тут же сдулась. Перезагрузки сервера не было. Понятно что статистика обновляется при выполнении запроса. А вот старая статистика когда вычищается из памяти? Она же явно чистится как-то и когда-то
23 дек 10, 10:44    [9986349]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
AlphaDog
Перезагрузки сервера не было. Понятно что статистика обновляется при выполнении запроса. А вот старая статистика когда вычищается из памяти? Она же явно чистится как-то и когда-то
При изменении метаданных она тоже вычищается, но уже избирательно.

http://msdn.microsoft.com/ru-ru/library/ms345524.aspx
23 дек 10, 10:48    [9986389]     Ответить | Цитировать Сообщить модератору
 Re: Как считается index density  [new]
AlphaDog
Member

Откуда: in the middle of nowhere
Сообщений: 496
tpg
AlphaDog
Перезагрузки сервера не было. Понятно что статистика обновляется при выполнении запроса. А вот старая статистика когда вычищается из памяти? Она же явно чистится как-то и когда-то
При изменении метаданных она тоже вычищается, но уже избирательно.

http://msdn.microsoft.com/ru-ru/library/ms345524.aspx


Проверено экспериментальным путем - изменение любого индекса приводит к сбросу статистик по использованию индексов для данного объекта.
14 янв 11, 06:11    [10069936]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как считается index density  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 467
Aleksey-K
AlphaDog, зачем Гуглить!
А этого (из BOL) не достаточно:
"...Вычисляется как «1/различающиеся значения» для всех значений в первом ключевом столбце объекта статистики, за исключением граничных значений гистограммы. Это значение плотности не используется оптимизатором запросов и отображается для обратной совместимости с версиями, выпущенными до SQL Server 2008.."
С уважением, Алексей

В BOL похоже ошибка, по крайней мере для 2008 сервера. Для первичных ключей непустых таблиц это значение всегда равно 1.
daw
я попробовал сам посчитать, у меня получилось не "1/различающиеся значения",
а "количество различающихся/общее количество" значений, которых нет среди RANGE_HI_KEY.

У меня получилось то же самое
density = "количество различающихся/общее количество значений" без учета значений, которые равны RANGE_HI_KEY.
11 июл 12, 16:19    [12851680]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить