Indeks SQL Server vs Statistik

13

Apa perbedaan antara CREATE INDEXdan CREATE STATISTICSdan kapan saya harus menggunakan masing-masing?

Scott
sumber

Jawaban:

19

Indeks menyimpan data aktual (halaman data atau halaman indeks tergantung pada jenis indeks yang kita bicarakan), dan Statistik menyimpan distribusi data. Oleh karena itu, CREATE INDEXakan menjadi DDL untuk membuat indeks (clustered, nonclustered, dll.) Dan CREATE STATISTICSmerupakan DDL untuk membuat statistik pada kolom dalam tabel.

Saya sarankan Anda membaca tentang aspek data relasional ini. Di bawah ini adalah beberapa artikel pemula, pengantar. Ini adalah topik yang sangat luas, dan karenanya informasi mengenai mereka bisa sangat luas dan sangat dalam. Bacalah ide umum mereka di bawah ini, dan ajukan pertanyaan yang lebih spesifik ketika muncul.

Referensi BOL pada Tabel dan Indeks Organisasi
BOL referensi pada Struktur Indeks Clustered
Referensi BOL pada Struktur Indeks Nonclustered
SQL Server Central pada Pengantar Indeks
BOL referensi pada Statistik

Berikut adalah contoh yang berfungsi untuk melihat dua bagian ini beraksi (dikomentari untuk menjelaskan):

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

Berikut ini contoh sampel uji statistik:

masukkan deskripsi gambar di sini

Perhatikan bahwa Statistik adalah penahanan distribusi data. Mereka membantu SQL Server menentukan rencana optimal. Contoh yang baik dari ini adalah, bayangkan Anda akan hidup sebagai benda berat. Jika Anda tahu berapa beratnya karena ada tanda di atasnya, Anda akan menentukan cara terbaik untuk mengangkat dan dengan otot apa. Itulah yang dilakukan SQL Server dengan statistik.

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

Kita dapat melihat dari contoh di atas bahwa indeks sebenarnya mengandung data (tergantung pada jenis indeks, halaman daun akan berbeda).

Posting ini hanya menunjukkan gambaran yang sangat sangat singkat tentang dua aspek besar SQL Server ini. Kedua hal ini dapat mengambil bab, dan buku. Baca beberapa referensi, dan kemudian Anda akan memiliki pemahaman yang lebih baik.

Thomas Stringer
sumber
1
Saya tahu ini adalah posting lama tetapi saya pikir patut dicatat bahwa membuat indeks akan (dalam banyak kasus) secara otomatis menghasilkan statistik untuk indeks. Hal yang sama tidak dapat dikatakan untuk membuat statistik.
Steve Mangiameli