Index SQL Server vs statistique

13

Quelles sont les différences entre CREATE INDEXet CREATE STATISTICSet quand dois - je utiliser chacun?

Scott
la source

Réponses:

19

Les index stockent les données réelles (pages de données ou pages d'index en fonction du type d'index dont nous parlons) et les statistiques stockent la distribution des données. Par conséquent, CREATE INDEXsera le DDL pour créer un index (cluster, non cluster, etc.) et CREATE STATISTICSest le DDL pour créer les statistiques sur les colonnes dans la table.

Je vous recommande de lire sur ces aspects des données relationnelles. Vous trouverez ci-dessous quelques articles d'introduction pour débutants. Ce sont des sujets très larges, et par conséquent les informations à leur sujet peuvent aller très loin et très profondément. Lisez leur idée générale ci-dessous et posez des questions plus spécifiques lorsqu'elles se présentent.

Référence BOL sur l'organisation des tables et des index
Référence BOL sur la structure d'index clusterisé
Référence BOL sur les structures d'index non cluster
SQL Server Central sur l'introduction aux index
Référence BOL sur les statistiques

Voici un exemple de travail pour voir ces deux parties en action (commentées pour expliquer):

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

Voici à quoi peut ressembler un échantillon test de statistiques:

entrez la description de l'image ici

Notez que les statistiques sont le confinement de la distribution des données. Ils aident SQL Server à déterminer un plan optimal. Un bon exemple de ceci est, imaginez que vous allez donner vie à un objet lourd. Si vous saviez combien ce poids parce qu'il y avait une marque de poids dessus, vous détermineriez la meilleure façon de soulever et avec quels muscles. C'est en quelque sorte ce que fait SQL Server avec les statistiques.

-- 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'
);

Nous pouvons voir dans l'exemple ci-dessus que l'index contient en fait des données (selon le type d'index, les pages feuilles seront différentes).

Ce message n'a montré qu'un aperçu très très très bref de ces deux grands aspects de SQL Server. Les deux pourraient contenir des chapitres et des livres. Lisez certaines des références, et vous aurez alors une meilleure compréhension.

Thomas Stringer
la source
1
Je sais que c'est un ancien article, mais je pense qu'il convient de noter que la création d'un index générera (dans la plupart des cas) automatiquement des statistiques pour l'index. On ne peut pas en dire autant de la création de statistiques.
Steve Mangiameli