SQL Server Index vs Statistik

13

Was sind die Unterschiede zwischen CREATE INDEXund CREATE STATISTICSund wann sollte ich sie verwenden?

Scott
quelle

Antworten:

19

Indizes speichern tatsächliche Daten (Datenseiten oder Indexseiten, je nachdem, um welchen Indextyp es sich handelt), und Statistiken speichern die Datenverteilung. Daher CREATE INDEXwird die DDL zum Erstellen eines Index (gruppiert, nicht gruppiert usw.) und CREATE STATISTICSdie DDL zum Erstellen der Statistiken für Spalten in der Tabelle.

Ich empfehle Ihnen, über diese Aspekte relationaler Daten zu lesen. Im Folgenden finden Sie ein paar einführende Artikel für Anfänger. Dies sind sehr breite Themen, und daher können die Informationen darüber sehr weit und sehr tief gehen. Informieren Sie sich unten über die allgemeine Idee und stellen Sie spezifischere Fragen, wenn sie auftauchen.

BOL-Referenz zu Tabellen- und Indexorganisation
BOL-Referenz zu Clustered Index Structure
BOL-Referenz zu Nonclustered Index Structures
SQL Server Central in der Einführung in Indizes
BOL-Referenz zu Statistics

Hier ist ein Arbeitsbeispiel, um diese beiden Teile in Aktion zu sehen (kommentiert, um zu erklären):

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

So kann ein Testmuster für Statistiken aussehen:

Bildbeschreibung hier eingeben

Beachten Sie, dass Statistiken den Inhalt der Datenverteilung darstellen. Sie helfen SQL Server dabei, einen optimalen Plan zu ermitteln. Ein gutes Beispiel dafür ist, stellen Sie sich vor, Sie würden einen schweren Gegenstand zum Leben erwecken. Wenn Sie wissen, wie viel dieses Gewicht hat, weil eine Gewichtsmarkierung darauf war, würden Sie den besten Weg zum Heben und mit welchen Muskeln bestimmen. So funktioniert SQL Server mit Statistiken.

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

Das obige Beispiel zeigt, dass der Index tatsächlich Daten enthält (je nach Indextyp unterscheiden sich die Blattseiten).

Dieser Beitrag hat nur einen sehr sehr kurzen Überblick über diese beiden großen Aspekte von SQL Server gezeigt. Beide könnten Kapitel und Bücher aufnehmen. Lesen Sie einige der Referenzen, und Sie werden es besser verstehen.

Thomas Stringer
quelle
1
Ich weiß, dass dies ein alter Beitrag ist, finde es aber bemerkenswert, dass beim Erstellen eines Index (in den meisten Fällen) automatisch Statistiken für den Index erstellt werden. Dasselbe gilt nicht für die Erstellung von Statistiken.
Steve Mangiameli