SQL Server Istatistik Adı ile Index Oluşturma Süreci

SQL Server üzerinde Istatistik adı ile Index oluşturma operasyonunu bu makalemde ele alacağım. Bunu adım adım Demo ile yaparak tüm süreci sizlere uygulamalı anlatmak istiyorum.

Örnek Demo tablomuzu oluşturuyoruz.

IF (OBJECT_ID('sqltr_DemoTable') IS NOT NULL)
DROP TABLE sqltr_DemoTable
GO
CREATE TABLE sqltr_DemoTable
(
    ID INT NOT NULL,
    Name VARCHAR(99) NOT NULL
)
GO

Demo tablomuz üzerinde Index ve İstatistik bilgisini kontrol ediyoruz. (Aşağıda ki script ile bu kontrolleri tablo ismini vererek sağlayabiliyoruz.)

-- Index Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) AS TableName, Name AS IndexName, type_desc
FROM sys.indexes
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

Gördüğünüz üzere tablomuz üzerinde Index bulunmamakta ve tablomuzun tipi HEAP table olarak görünmekte.

HEAP Table : Bir tablodaki verilerin disk üzerinde sirali olarak kaydedilmesi için clustered index barindirmasi gerekir, Eger bir tablo da clustered index yoksa tablodaki veriler diske rastgele kaydedilir. Clustered index bulunan bir tablo clustered table diye adlandirilir. Clustered index olmayan bir tablo ise heap diye adlandirilir.

-- Istatistik Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) TableName, Name AS StatisticsName
FROM sys.stats
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

İstatistik verilerini sorguladığımız da ise tablomuz üzerinde herhangi bir istatistik olmadığını görmekteyiz.  Tablomuz üzerinde NonCLustered Index oluşturup birde Index ve İstatistik bilgilerini gözlemleyelim,

-- Index oluşturuyoruz ve daha sonra Index ve Istatistik detayına tekrar bakıyoruz...
CREATE NONCLUSTERED INDEX sqltr_NCIX_sqltr_DemoTable_Id ON sqltr_DemoTable(ID)
GO

Index oluşturduktan sonra tekrar Index ve Istatistik bilgilerini sorguluyoruz.

-- Index Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) AS TableName, Name AS IndexName, type_desc
FROM sys.indexes
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

Index bilgilerini sorguladığımızda NonClustered Index atmadan önce tablomuz üzerinde Clustered Indez olmadığını HEAP table ibaresi ile öğrenmiştik. Fakat tablomuz üzerine eklediğimiz NonClustered Index i Index detaylarımızda görmekteyiz.

Şimdi ise birde İstatistik bilgilerini sorgulayalım ,

-- Istatistik Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) TableName, Name AS StatisticsName
FROM sys.stats
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

Gördüğünüz üzere tablomuz üzerine oluşturduğumuz NonClustered Index ile beraber aynı Index adında birde o index e ait İstatistik oluştuğunu görüyoruz.

Şimdi de bu Demo tablomuzu Drop edip tekrar Create ediyoruz ve NonClustered Index oluşturmadan direkt İstatistik Create edip incelememizi yapalım.

DROP TABLE sqltr_DemoTable
GO
IF (OBJECT_ID('sqltr_DemoTable') IS NOT NULL)
DROP TABLE sqltr_DemoTable
GO
CREATE TABLE sqltr_DemoTable
(
    ID INT NOT NULL,
    Name VARCHAR(99) NOT NULL
)
GO

Demo tablomuzun üzerine manuel istatistiğimizi oluşturuyoruz.

-- Istatistiğimizi olusturuyoruz.
CREATE STATISTICS sqltr_NCIX_sqltr_DemoTable_Id ON sqltr_DemoTable (ID)
GO

Şimdi ise tablo üzerinde hem Index hem de istatistik bilgilerine bakalım.

-- Index Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) AS TableName, Name AS IndexName, type_desc
FROM sys.indexes
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO
-- Istatistik Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) TableName, Name AS StatisticsName
FROM sys.stats
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

Tablomuz HEAP table ve üzerinde Index yok. İstatistiğimiz oluşmuş ve istatistik bilgilerini görmekteyiz.

Şimdi ki örneğimizde ise ilk iki örneğimizide bir arada yaparak deneme yapacağız. Yani ilk etapta Demo tablomuzu DROP edip sonra tekrar oluşturacağız ve daha sonra tablomuz üzerine istatistiğimizi oluşturacağız. Daha sonra aynı isimde NonClustered Index oluşturmaya çalışacağız.

DROP TABLE sqltr_DemoTable
GO
IF (OBJECT_ID('sqltr_DemoTable') IS NOT NULL)
DROP TABLE sqltr_DemoTable
GO
CREATE TABLE sqltr_DemoTable
(
    ID INT NOT NULL,
    Name VARCHAR(99) NOT NULL
)
GO

İstatistiğimizi aşağıda ki script ile başarılı bir şekilde oluşturuyoruz..

-- Istatistiğimizi olusturuyoruz.
CREATE STATISTICS sqltr_NCIX_sqltr_DemoTable_Id ON sqltr_DemoTable (ID)
GO

Daha sonra aşağıda ki Index imizi oluşturmak istediğimiz de,

-- Index oluşturuyoruz ...
CREATE NONCLUSTERED INDEX sqltr_NCIX_sqltr_DemoTable_Id ON sqltr_DemoTable(ID)
GO

aşağıda ki hatayı almaktayız.

Msg 1913, Level 16, State 1, Line 1
The operation failed because an index or statistics with name ‘sqltr_NCIX_sqltr_DemoTable_Id’ already exists on table ‘sqltr_DemoTable’.

Hatadan da anlaşılacağı üzere Index oluşturuken ilk örneğimizde Index ile beraber o index e ait istatistik de oluşmuştu. Manuel bir Index oluşturduk ve aynı isimde bir Index Create etmeye çalıştığımızda Index isminde önceden bir istatistik oluştuğundan dolayı hata aldık. Eğer biz index imizin ismini oluşturduğumuzda çalıştırmadan tablo üzerinde ki istatistikleri kontrol edip ona göre Index ismimizi ayarlamalıyız. Şimdi aynı Index i farklı bir isimde oluşturmak isteyelim ,

CREATE NONCLUSTERED INDEX sqltr_NCIX_sqltr_DemoTable_Id_2 ON sqltr_DemoTable(ID)
GO

Şimdi kontrol edelim Index ve istatisitk bilgisini ,

-- Index Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) AS TableName, Name AS IndexName, type_desc
FROM sys.indexes
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO
-- Istatistik Detaylarını Alıyoruz
SELECT OBJECT_NAME(OBJECT_ID) TableName, Name AS StatisticsName
FROM sys.stats
WHERE OBJECT_NAME(OBJECT_ID) = 'sqltr_DemoTable'
GO

Gördüğünüz gibi tablomuzda manuel oluşturduğumuz istatistik bilgiside ve ismini değiştirip oluşturduğumuz Index bilgiside ve o index e ait istatistik bilgiside bulunmaktadır.

 

Kolay Gelsin.

Leave a Reply

Your email address will not be published. Required fields are marked *