SQL Server'da Kümelenmiş ve Kümelenmemiş Dizinler Oluşturma
Bir SQL Server'da iki tür dizin vardır; Kümelenmiş ve kümelenmemiş dizinler. Hem kümelenmiş dizinler hem de kümelenmemiş dizinler aynı fiziksel yapıya sahiptir. Üstelik her ikisi de SQL Server'da B-Tree yapısı olarak saklanır.
Kümelenmiş dizin:
Kümelenmiş liste, tablodaki kayıtların fiziksel depolanmasını yeniden düzenleyen belirli bir dizin türüdür. SQL Server içinde, veri tabanı işlemlerini hızlandırmak için dizinler kullanılır ve bu da yüksek performansa yol açar. Bu nedenle tablo, genellikle birincil anahtar üzerinde yapılan yalnızca bir kümelenmiş dizine sahip olabilir. Kümelenmiş bir dizinin yaprak düğümleri şunları içerir: "veri sayfaları". Bir tablo yalnızca bir kümelenmiş dizine sahip olabilir.
Daha iyi anlamak için kümelenmiş bir dizin oluşturalım. Öncelikle bir veritabanı oluşturmamız gerekiyor.
Veritabanı oluşturma
Bir veritabanı oluşturmak için. sağ tıklayın “Veritabanları” nesne gezgininde seçin ve “Yeni veritabanı” seçenek. Veritabanının adını yazın ve Tamam'a tıklayın. Veritabanı aşağıdaki şekilde gösterildiği gibi oluşturulmuştur.
Şimdi adında bir tablo oluşturacağız. “Çalışan” tasarım görünümünü kullanarak birincil anahtarla. Aşağıdaki resimde öncelikle “ID” isimli dosyaya atadığımızı ve tablo üzerinde herhangi bir indeks oluşturmadığımızı görüyoruz.
Aşağıdaki kodu çalıştırarak da bir tablo oluşturabilirsiniz.
KULLANIN [test] GO SET ANSI_NULLS ON GO GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Çalışan]( [ID] [int] KİMLİK(1,1) NULL DEĞİL, [Dep_ID] [int] NULL, [Ad] [ varchar](200) NULL, [email] [varchar](250) NULL, [city] [varchar](250) NULL, [adres] [varchar](500) NULL, CONSTRAINT [Birincil_Anahtar_Kimliği] BİRİNCİL ANAHTAR KÜMELENDİ ( [ID ] ASC ) İLE (PAD_INDEX = KAPALI, STATISTICS_NORECOMPUTE = KAPALI, IGNORE_DUP_KEY = KAPALI, ALLOW_ROW_LOCKS = AÇIK, ALLOW_PAGE_LOCKS = AÇIK) AÇIK [PRIMARY] ) AÇIK [PRIMARY] GİT
Çıktı aşağıdaki gibi olacaktır.
Yukarıdaki kod adlı bir tablo oluşturdu “Çalışan” bir kimlik alanıyla, birincil anahtar olarak benzersiz bir tanımlayıcı. Şimdi bu tabloda, birincil anahtar kısıtlamaları nedeniyle sütun kimliğinde otomatik olarak kümelenmiş bir dizin oluşturulacaktır. Bir tablodaki tüm dizinleri görmek istiyorsanız, saklı yordamı çalıştırın. "sp_helpindex". Adlı bir tablodaki tüm dizinleri görmek için aşağıdaki kodu yürütün "Çalışan". Bu saklama prosedürü, giriş parametresi olarak bir tablo adı alır.
KULLANIM testi EXECUTE sp_helpindex Çalışan
Çıktı aşağıdaki gibi olacaktır.
Tablo dizinlerini görüntülemenin başka bir yolu da şuraya gitmektir: “masalar” nesne gezgininde. Tabloyu seçin ve harcayın. Dizinler klasöründe, aşağıdaki şekilde gösterildiği gibi o belirli tabloyla ilgili tüm dizinleri görebilirsiniz.
Bu kümelenmiş dizin olduğundan, dizinin mantıksal ve fiziksel sırası aynı olacaktır. Bu, bir kaydın kimliği 3 ise, tablonun üçüncü satırında saklanacağı anlamına gelir. Benzer şekilde, beşinci kaydın kimliği 6 ise, 5'te saklanacaktır.inci masanın yeri. Kayıtların sırasını anlamak için aşağıdaki komut dosyasını çalıştırmanız gerekir.
KULLANIN [test] GO SET IDENTITY_INSERT [dbo].[Çalışan] ON INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER ( 8, 6, N'Humbaerto Acevedo', N'[email protected]', N'SAINT PAUL', N'895 E 7th St Saint Paul Mn 551063852') INSERT [dbo].[Çalışan] ([ID ], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (9, 6, N'Humbaerto Acevedo', N'[email protected]', N'SAINT PAUL' , N'895 E 7. St Saint Paul Mn 551063852') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (10, 7, N'Pilar Ackaerman', N'[email protected]', N'ATLANTA', N'5813 Eastern Ave Hyattsville Md 207822201') INSERT [dbo].[Çalışan] ([ID], [Dep_ID] , [Ad], [e-posta], [şehir], [adres]) DEĞERLER (11, 1, N'Aaaronboy Gutierrez', N'[email protected]', N'HILLSBORO', N'5840 Ne Cornell Rd Hillsboro Veya 97124') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (12, 2, N'Aabdi Maghsoudi' , N'[email protected]', N'BRENTWOOD', N'987400 Nebraska Tıp Merkezi Omaha Ne 681987400') EKLE [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (13, 3, N'Aabharana, Sahni', N'[email protected]', N'HYATTVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191') INSERT [dbo].[Çalışan] ([ Kimlik], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (14, 3, N'Aabharana, Sahni', N'[email protected]', N'HYATTSVILLE ', N'2 Barlo Circle Suite A Dillsburg Pa 170191') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (1 , 1, N'Aaaronboy Gutierrez', N'[email protected]', N'HILLSBORO', N'5840 Ne Cornell Rd Hillsboro Or 97124') INSERT [dbo].[Çalışan] ([ID], [ Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (2, 2, N'Aabdi Maghsoudi', N'[email protected]', N'BRENTWOOD', N'987400 Nebraska Medical Center Omaha Ne 681987400') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (3, 3, N'Aabharana, Sahni ' , N'[email protected]', N'HYATTSVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [city], [address]) DEĞERLER (4, 3, N'Aabharana, Sahni', N'[email protected]', N'HYATTVILLE', N'2 Barlo Circle Suite A Dillsburg Pa 170191') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (5, 4, N'Aabish Mughal', N' [email protected]', N'OMAHA', N'2975 Crouse Lane Burlington Nc 272150000') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [e-posta], [şehir] , [adres]) DEĞERLER (6, 5, N'Aabram Howell ', N'[email protected]', N'DILLSBURG ', N'868 York Ave Atlanta Ga 303102750') INSERT [dbo]. [Çalışan ] ([ID], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (7, 5, N'Aabram Howell', N'[email protected]', N 'DILLSBURG', N'868 York Ave Atlanta Ga 303102750') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (15 , 4, N'Aabish Mughal', N'abish_mughal@ gmail.com', N'OMAHA', N'2975 Crouse Lane Burlington Nc 2721150000') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [e-posta], [şehir], [ adres]) DEĞERLER (16, 5, N'Aabram Howell', N'[email protected]', N'DILLSBURG', N'868 York Ave Atlanta Ga 303102750') INSERT [dbo].[Çalışan] ( [ID], [Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (17, 5, N'Aabram Howell', N'[email protected]', N'DILLSBURG ', N'868 York Ave Atlanta Ga 303102750') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (18, 6 , N'Humbaerto Acevedo', N'[email protected]', N'SAINT PAUL', N'895 E 7th St Saint Paul Mn 551063852') INSERT [dbo].[Çalışan] ([ID], [ Dep_ID], [Ad], [e-posta], [şehir], [adres]) DEĞERLER (19, 6, N'Humbaerto Acevedo', N'[email protected]', N'SAINT PAUL', N' 895 E 7. St Saint Paul Mn 551063852') INSERT [dbo].[Çalışan] ([ID], [Dep_ID], [Ad], [email], [şehir], [adres]) DEĞERLER (20, 7, N 'Pilar Ackaerman', N'[email protected] ', N'ATLANTA', N'5813 Eastern Ave Hyattsville Md 207822201') SET IDENTITY_INSERT [dbo].[Çalışan] KAPALI
Kayıtlar “Id” sütununda rastgele bir değer sırasına göre saklansa da. Ancak id sütunundaki kümelenmiş dizin nedeniyle. Kayıtlar, fiziksel olarak id sütununda artan değerlere göre depolanır. Bunu doğrulamak için aşağıdaki kodu çalıştırmamız gerekiyor.
test.dbo.Employee'den * seçin
Çıktı aşağıdaki gibi olacaktır.
Yukarıdaki şekilde, kayıtların id sütunundaki değerlerin artan sırasına göre alındığını görebiliriz.
Özelleştirilmiş kümelenmiş dizin
Ayrıca özel bir kümelenmiş dizin de oluşturabilirsiniz. Yalnızca bir kümelenmiş dizin oluşturabildiğimiz için öncekini silmemiz gerekiyor. Dizini silmek için aşağıdaki kodu yürütün.
KULLANIN [test] DEĞİŞTİR TABLOSU [dbo].[Çalışan] BIRAKMA KISITLAMASI [Birincil_Anahtar_Kimliği] (ÇEVRİMİÇİ = KAPALI) GO İLE
Çıktı aşağıdaki gibi olacaktır.
Şimdi dizini oluşturmak için bir sorgu penceresinde aşağıdaki kodu yürütün. Bu dizin birden fazla sütunda oluşturulduğu için bileşik dizin olarak adlandırılır.
[Test] GO CREATE CLUSTERED INDEX KULLANIN [ClusteredIndex-20191128-173307] AÇIK [dbo].[Çalışan] ( [ID] ASC, [Dep_ID] ASC )İLE (PAD_INDEX = KAPALI, STATISTICS_NORECOMPUTE = KAPALI, SIRALAMA_KAPALI = KAPALI, SIRALAMA_KAPALI = TEMPD KAPALI, ÇEVRİMİÇİ = KAPALI, ALLOW_ROW_LOCKS = AÇIK, ALLOW_PAGE_LOCKS = AÇIK) ON [PRIMARY] GO
Çıktı aşağıdaki gibi olacaktır
ID ve Dep_ID üzerinde özel bir kümelenmiş indeks oluşturduk. Bu, satırları Id'ye ve ardından Dep_Id'ye göre sıralayacaktır. Bunu görüntülemek için aşağıdaki kodu yürütün. Sonuç, artan kimlik sırası ve ardından By Dep_id olacaktır.
[Test]'TEN [ID] ,[Dep_ID],[Ad],[e-posta] ,[şehir] ,[adres] SEÇİN.[dbo].[Çalışan]
Çıktı aşağıdaki gibi olacaktır.
Kümelenmemiş dizin:
Kümelenmemiş bir dizin, dizinin mantıksal sırasının, diskte depolanan satırların fiziksel sırasına uymadığı belirli bir dizin türüdür. Kümelenmemiş dizinin yaprak düğümü, veri sayfaları içermez, bunun yerine dizin satırları hakkında bilgi içerir. Bir tablo 249 adede kadar dizine sahip olabilir. Varsayılan olarak, Benzersiz Anahtar kısıtlaması, Kümelenmemiş bir Dizin oluşturur. Okuma işleminde, kümelenmemiş dizinler, kümelenmiş dizinlerden daha yavaştır. Kümelenmemiş bir dizin, gerçek veri satırlarına yapılan referanslarla birlikte sırayla tutulan dizine alınmış sütunlardaki verilerin bir kopyasına sahiptir; varsa kümelenmiş listeye işaretçiler. Bu nedenle * kullanmak yerine yalnızca dizinde kullanılan sütunları seçmek iyi bir fikirdir. Bu şekilde veriler doğrudan yinelenen dizinden alınabilir. Aksi halde kümelenmiş bir dizin, oluşturulmuşsa kalan sütunları seçmek için de kullanılır.
Kümelenmemiş bir dizin oluşturmak için kullanılan sözdizimi, kümelenmiş dizine benzer. Ancak, anahtar kelime “GÜNCELLENMEMİŞ” yerine kullanılır “KÜMELENMİŞ” kümelenmemiş dizin durumunda. Kümelenmemiş bir dizin oluşturmak için aşağıdaki komut dosyasını çalıştırın.
KULLANIN [test] ANSI_PADDING ON GO GO CREATE CREATE CLUSTEREDIndex-20191129-104230] ON [dbo].[Çalışan] ( [Ad] ASC )İLE (PAD_INDEX = KAPALI, İSTATİSTİK_NORECOMPUTE_KAPALI, İSTATİSTİK_NORECOMPUTE_KAPALI_,TEMPD = KAPALI, , ÇEVRİMİÇİ = KAPALI, ALLOW_ROW_LOCKS = AÇIK, ALLOW_PAGE_LOCKS = AÇIK) ON [PRIMARY] GO
Çıktı aşağıdaki gibi olacaktır.
Tablo kayıtları, oluşturulmuşsa, kümelenmiş bir dizine göre sıralanır. Bu yeni kümelenmemiş dizin, tabloyu tanımına göre sıralayacak ve ayrı bir fiziksel adreste saklanacaktır. Yukarıdaki komut dosyası, Çalışan tablosunun "NAME" sütununda dizini oluşturacaktır. Bu dizin, tabloyu “Ad” sütununun artan düzeninde sıralayacaktır. Tablo verileri ve dizin, daha önce de söylediğimiz gibi farklı konumlarda saklanacaktır. Şimdi kümelenmemiş yeni bir dizinin etkisini görüntülemek için aşağıdaki komut dosyasını yürütün.
Çalışandan Adı seçin
Çıktı aşağıdaki gibi olacaktır.
“Order by ASC” ibaresini select ile belirtmemiş olmamıza rağmen, yukarıdaki şekilde Çalışan tablosunun Ad sütununun artan ad sütununda gösterildiğini görebiliriz. Bunun nedeni, Çalışan tablosunda oluşturulan "Ad" sütunundaki kümelenmemiş dizindir. Şimdi, belirli bir kişinin Adını, e-postasını, şehrini ve adresini almak için bir sorgu yazılırsa. Veritabanı önce dizin içinde belirli bir adı arayacak ve ardından, özellikle veriler çok büyük olduğunda, sorgu getirme süresini azaltacak ilgili verileri alacaktır.
Name='Aaaronboy Gutierrez' olan Çalışandan İsim, e-posta, şehir, adres seçin
Sonuç
Yukarıdaki tartışmadan, kümelenmiş dizinin yalnızca bir olabileceğini, öte yandan kümelenmemiş dizinin çok olabileceğini öğrendik. Kümelenmiş dizin, kümelenmemiş dizine kıyasla daha hızlıdır. Kümelenmiş dizin fazladan depolama alanı tüketmezken, kümelenmemiş dizin bunları depolamak için fazladan belleğe ihtiyaç duyar. Tabloya bir birincil anahtar kısıtlaması uygularsak, üzerinde otomatik olarak kümelenmiş dizin oluşturulur. Ayrıca, herhangi bir sütuna benzersiz bir anahtar kısıtlaması uygularsak, üzerinde otomatik olarak kümelenmemiş bir dizin oluşturulur. Kümelenmemiş dizin, ekleme ve güncelleme işlemi için kümelenmiş olanlara kıyasla daha hızlıdır. Bir tabloda kümelenmemiş dizin bulunmayabilir.