SQL Server Dizini ve İstatistik


14

Arasındaki farklar nelerdir CREATE INDEXve CREATE STATISTICSve ne zaman her kullanmalıyım?

Yanıtlar:


19

Dizinler, gerçek verileri (bahsettiğimiz dizin türüne bağlı olarak veri sayfaları veya dizin sayfaları) ve İstatistikler deposu veri dağıtımını depolar. Bu nedenle, CREATE INDEXbir dizin oluşturmak için DDL (kümelenmiş, kümelenmemiş, vb.) Ve CREATE STATISTICStablodaki sütunlardaki istatistikleri oluşturmak için DDL olacaktır.

İlişkisel verilerin bu yönlerini okumanızı tavsiye ederim. Aşağıda birkaç yeni başlayan, tanıtıcı makale bulunmaktadır. Bunlar çok geniş konulardır ve bu nedenle bunlarla ilgili bilgiler çok geniş ve derin olabilir. Aşağıdaki genel fikirleri okuyun ve ortaya çıktıklarında daha spesifik sorular sorun.

Tablo ve Dizin Düzenleme
BOL başvurusu Kümelenmiş Dizin Yapısı
BOL başvurusu Kümelenmemiş Dizin Yapıları BOL başvurusu
Dizinlere Giriş SQL Server Merkezi
İstatistiklere BOL başvurusu

İşte bu iki bölümü çalışırken görmek için çalışan bir örnek (açıklamak için yorumladı):

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

İstatistiklerin bir test örneği şöyle görünebilir:

resim açıklamasını buraya girin

İstatistiklerin veri dağıtımının kontrol altına alındığına dikkat edin. SQL Server'ın en uygun planı belirlemesine yardımcı olurlar. Bunun iyi bir örneği, ağır bir nesne yaşayacağınızı düşünün. Bu ağırlığın ne kadar olduğunu biliyor olsaydınız, üzerinde bir ağırlık işareti vardı, kaldırmak için en iyi yolu ve hangi kaslarla belirleyeceksiniz. SQL Server'ın istatistiklerle yaptığı şey budur.

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

Yukarıdaki örnekten, dizinin gerçekte veri içerdiğini görebiliriz (dizin türüne bağlı olarak, yaprak sayfaları farklı olacaktır).

Bu yazı, SQL Server'ın bu iki büyük yönü hakkında çok çok kısa bir genel bakış göstermiştir . Bunların her ikisi de bölümler ve kitaplar alabilir. Bazı referansları okuyun ve daha iyi bir kavrayışa sahip olacaksınız.


1
Bu eski bir yazı olduğunu biliyorum ama bir dizin oluşturmak (çoğu durumda) otomatik olarak dizin için istatistik üretecek dikkat çekici düşünüyorum. Aynı şey istatistik oluştururken de söylenemez.
Steve Mangiameli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.