Индекс SQL Server против статистики

Ответы:

19

Индексы хранят фактические данные (страницы данных или страницы индексов в зависимости от типа индекса, о котором мы говорим), а Статистика хранит распределение данных. Следовательно, CREATE INDEXэто будет DDL для создания индекса (кластеризованный, некластеризованный и т. Д.), А CREATE STATISTICSтакже DDL для создания статистики по столбцам в таблице.

Я рекомендую вам прочитать об этих аспектах реляционных данных. Ниже приведена пара вводных статей для начинающих. Это очень широкие темы, и поэтому информация по ним может быть очень широкой и очень глубокой. Читайте об их общей идее ниже и задавайте более конкретные вопросы, когда они возникают.

Ссылка на
BOL для организации таблиц и индексов Ссылка на BOL на структуру
кластеризованных индексов Ссылка на BOL на структуры некластеризованных индексов
SQL Server Central на ссылку Введение в индексы
BOL по статистике

Вот рабочий пример, чтобы увидеть эти две части в действии (прокомментировал, чтобы объяснить):

use testdb;
go

create table MyTable1
(
    id int identity(1, 1) not null,
    my_int_col int not null
);
go

insert into MyTable1(my_int_col)
values(1);
go 100

-- this statement will create a clustered index
-- on MyTable1.  The index key is the id field
-- but due to the nature of a clustered index
-- it will contain all of the table data
create clustered index MyTable1_CI
on MyTable1(id);
go


-- by default, SQL Server will create a statistics
-- on this index.  Here is proof.  We see a stat created
-- with the name of the index, and the consisting stat 
-- column of the index key column
select
    s.name as stats_name,
    c.name as column_name
from sys.stats s
inner join sys.stats_columns sc
on s.object_id = sc.object_id
and s.stats_id = sc.stats_id
inner join sys.columns c
on sc.object_id = c.object_id
and sc.column_id = c.column_id
where s.object_id = object_id('MyTable1');


-- here is a standalone statistics on a single column
create statistics MyTable1_MyIntCol
on MyTable1(my_int_col);
go

-- now look at the statistics that exist on the table.
-- we have the additional statistics that's not necessarily
-- corresponding to an index
select
    s.name as stats_name,
    c.name as column_name
from sys.stats s
inner join sys.stats_columns sc
on s.object_id = sc.object_id
and s.stats_id = sc.stats_id
inner join sys.columns c
on sc.object_id = c.object_id
and sc.column_id = c.column_id
where s.object_id = object_id('MyTable1');


-- what is a stat look like?  run DBCC SHOW_STATISTICS
-- to get a better idea of what is stored
dbcc show_statistics('MyTable1', 'MyTable1_CI');
go

Вот как может выглядеть тестовый образец статистики:

введите описание изображения здесь

Обратите внимание, что статистика является сдерживающим фактором распределения данных. Они помогают SQL Server определить оптимальный план. Хороший пример этого - представьте, что вы оживаете тяжелым предметом. Если бы вы знали, сколько это вес, потому что на нем была маркировка веса, вы бы определили лучший способ поднять и с помощью каких мышц. Это то, что SQL Server делает со статистикой.

-- create a nonclustered index
-- with the key column as my_int_col
create index IX_MyTable1_MyIntCol
on MyTable1(my_int_col);
go

-- let's look at this index
select
    object_name(object_id) as object_name,
    name as index_name,
    index_id,
    type_desc,
    is_unique,
    fill_factor
from sys.indexes
where name = 'IX_MyTable1_MyIntCol';

-- now let's see some physical aspects
-- of this particular index
-- (I retrieved index_id from the above query)
select *
from sys.dm_db_index_physical_stats
(
    db_id('TestDB'),
    object_id('MyTable1'),
    4,
    null,
    'detailed'
);

Из приведенного выше примера видно, что индекс фактически содержит данные (в зависимости от типа индекса конечные страницы будут разными).

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

Томас Стрингер
источник
1
Я знаю, что это старая статья, но стоит отметить, что создание индекса (в большинстве случаев) автоматически генерирует статистику для индекса. То же самое нельзя сказать о создании статистики.
Стив Мангиамели