Ev - Mobil cihazlar
SQL - Dizinler. SQL Server'daki dizinler Bir veritabanı tablosundaki dizinler şunları yapmak için kullanılır:
Yüksek üretkenliğe ulaşmanın en önemli yollarından biri SQL Server indekslerin kullanılmasıdır. Bir kitaptaki dizinin ihtiyacınız olan bilgiyi hızlı bir şekilde bulmanıza yardımcı olması gibi, dizin de bir tablodaki veri satırlarına hızlı erişim sağlayarak sorgulama sürecini hızlandırır. Bu yazımda indekslere kısaca değineceğim. SQL Server ve bunların veritabanında nasıl organize edildiğini ve veritabanı sorgularını hızlandırmaya nasıl yardımcı olduklarını açıklayın.

Dizinler tablo ve görünüm sütunlarında oluşturulur. Dizinler, bu sütunlardaki değerlere göre verileri hızlı bir şekilde aramanın bir yolunu sağlar. Örneğin, birincil anahtarda bir dizin oluşturursanız ve ardından birincil anahtar değerlerini kullanarak bir veri satırını ararsanız, o zaman SQL Serverönce indeks değerini bulacak ve ardından veri satırının tamamını hızlı bir şekilde bulmak için indeksi kullanacaktır. Dizin olmadan tablodaki tüm satırların tam taraması gerçekleştirilir ve bu da performans üzerinde önemli bir etkiye sahip olabilir.
Bir tablo veya görünümdeki çoğu sütunda dizin oluşturabilirsiniz. Bunun istisnası esas olarak büyük nesnelerin depolanmasına yönelik veri türlerine sahip sütunlardır ( LOB), örneğin görüntü, metin veya varchar(maks). Ayrıca, verileri şu biçimde depolamak için tasarlanmış sütunlarda dizinler oluşturabilirsiniz: XML ancak bu indeksler standart indekslerden biraz farklı yapılandırılmıştır ve bunların değerlendirilmesi bu makalenin kapsamı dışındadır. Ayrıca makalede tartışılmıyor sütun deposu indeksler. Bunun yerine veritabanlarında en sık kullanılan indekslere odaklanıyorum SQL Server.
Bir dizin, bir ağaç yapısında düzenlenmiş bir dizi sayfadan, dizin düğümlerinden oluşur. dengeli ağaç. Bu yapı doğası gereği hiyerarşiktir ve şekilde gösterildiği gibi hiyerarşinin tepesinde bir kök düğüm ve altta yaprak düğümleri (yapraklar) ile başlar:


Dizine alınmış bir sütunu sorguladığınızda, sorgu motoru kök düğümün üstünden başlar ve her ara katman veriler hakkında daha ayrıntılı bilgi içerecek şekilde ara düğümler boyunca aşağı doğru çalışır. Sorgu motoru, indeks yapraklarıyla en alt seviyeye ulaşana kadar indeks düğümleri arasında hareket etmeye devam eder. Örneğin indekslenmiş bir sütunda 123 değerini arıyorsanız sorgu motoru öncelikle sayfayı kök seviyesindeki ilk ara seviyede belirleyecektir. Bu durumda ilk sayfa 1'den 100'e, ikinci sayfa ise 101'den 200'e kadar bir değere işaret eder, böylece sorgu motoru bu orta seviyenin ikinci sayfasına erişecektir. Daha sonra bir sonraki orta seviyenin üçüncü sayfasına dönmeniz gerektiğini göreceksiniz. Buradan sorgu alt sistemi indeksin değerini daha düşük bir seviyede okuyacaktır. Dizin yaprakları, dizin türüne bağlı olarak tablo verilerinin kendisini veya tablodaki verileri içeren satırlara yönelik bir işaretçiyi içerebilir: kümelenmiş dizin veya kümelenmemiş dizin.

Kümelenmiş Dizin
Kümelenmiş bir dizin, gerçek veri satırlarını dizinin yapraklarında saklar. Önceki örneğe dönersek, bu, 123'ün anahtar değeriyle ilişkili veri satırının endeksin kendisinde saklanacağı anlamına gelir. Kümelenmiş endeksin önemli bir özelliği, tüm değerlerin artan veya azalan şekilde belirli bir sıraya göre sıralanmasıdır. Bu nedenle bir tablo veya görünümün yalnızca bir kümelenmiş dizini olabilir. Ayrıca bir tablodaki verilerin ancak bu tabloda kümelenmiş bir dizin oluşturulmuşsa sıralanmış biçimde saklandığına dikkat edilmelidir.
Kümelenmiş dizine sahip olmayan bir tabloya yığın adı verilir.
Kümelenmemiş dizin
Kümelenmiş bir dizinden farklı olarak, kümelenmemiş bir dizinin yaprakları yalnızca bu sütunları içerir ( anahtar) bu endeksin belirlendiği ve ayrıca tablodaki gerçek verilere sahip satırlara yönelik bir işaretçi içerir. Bu, alt sorgu sisteminin gerekli verileri bulmak ve almak için ek bir işlem gerektirdiği anlamına gelir. Veri işaretçisinin içeriği, verilerin nasıl depolandığına bağlıdır: kümelenmiş tablo veya yığın. Bir işaretçi kümelenmiş bir tabloya işaret ediyorsa, gerçek verileri bulmak için kullanılabilecek kümelenmiş bir dizine işaret eder. Bir işaretçi bir yığına başvuruyorsa, belirli bir veri satırı tanımlayıcısına işaret eder. Kümelenmemiş dizinler, kümelenmiş dizinler gibi sıralanamaz ancak bir tablo veya görünümde 999'a kadar birden fazla kümelenmemiş dizin oluşturabilirsiniz. Bu, mümkün olduğu kadar çok dizin oluşturmanız gerektiği anlamına gelmez. Dizinler sistem performansını iyileştirebilir veya düşürebilir. Birden çok kümelenmemiş dizin oluşturabilmenin yanı sıra ek sütunlar da ekleyebilirsiniz ( dahil edilen sütun) dizinine: dizinin yaprakları yalnızca dizine eklenen sütunların değerlerini değil, aynı zamanda dizine eklenmeyen bu ek sütunların değerlerini de saklar. Bu yaklaşım, endekse uygulanan bazı kısıtlamaları atlamanıza olanak tanıyacaktır. Örneğin, dizine eklenemeyen bir sütun ekleyebilir veya dizin uzunluğu sınırını (çoğu durumda 900 bayt) atlayabilirsiniz.

Endeks Türleri

Kümelenmiş veya kümelenmemiş bir dizin olmasının yanı sıra, bileşik bir dizin, benzersiz bir dizin veya bir kaplama dizini olarak da yapılandırılabilir.
Bileşik indeks
Böyle bir indeks birden fazla sütun içerebilir. Bir dizine en fazla 16 sütun ekleyebilirsiniz ancak bunların toplam uzunluğu 900 baytla sınırlıdır. Hem kümelenmiş hem de kümelenmemiş dizinler bileşik olabilir.
Benzersiz dizin
Bu indeks, indekslenen sütundaki her değerin benzersiz olmasını sağlar. Dizin bileşikse, benzersizlik dizindeki tüm sütunlara uygulanır ancak her bir sütuna uygulanmaz. Örneğin, sütunlarda benzersiz bir dizin oluşturursanız İSİM Ve SOYADI, bu durumda tam adın benzersiz olması gerekir ancak ad veya soyadın kopyaları da mümkündür.
Bir sütun kısıtlaması tanımladığınızda otomatik olarak benzersiz bir dizin oluşturulur: birincil anahtar veya benzersiz değer kısıtlaması:
  • Birincil anahtar
    Bir veya daha fazla sütunda birincil anahtar kısıtlaması tanımladığınızda SQL Server daha önce kümelenmiş bir dizin oluşturulmamışsa otomatik olarak benzersiz bir kümelenmiş dizin oluşturur (bu durumda, birincil anahtarda benzersiz bir kümelenmemiş dizin oluşturulur)
  • Değerlerin benzersizliği
    Değerlerin benzersizliğine ilişkin bir kısıtlama tanımladığınızda SQL Server otomatik olarak benzersiz, kümelenmemiş bir dizin oluşturur. Tabloda henüz bir kümelenmiş dizin oluşturulmamışsa benzersiz bir kümelenmiş dizin oluşturulmasını belirtebilirsiniz.
Kaplama indeksi
Böyle bir indeks, belirli bir sorgunun, tablonun kayıtlarına ek erişim olmaksızın, indeksin yapraklarından gerekli tüm verileri anında elde etmesine olanak tanır.

Dizinlerin Tasarlanması

İndeksler ne kadar yararlı olsa da dikkatli bir şekilde tasarlanmaları gerekir. Dizinler önemli miktarda disk alanı kaplayabileceğinden gereğinden fazla dizin oluşturmak istemezsiniz. Ayrıca, veri satırı güncellendiğinde dizinler de otomatik olarak güncellenir; bu da ek kaynak yüküne ve performansın düşmesine neden olabilir. İndeksleri tasarlarken, veritabanına ve ona yönelik sorgulara ilişkin çeşitli hususların dikkate alınması gerekir.
Veri tabanı
Daha önce belirtildiği gibi dizinler sistem performansını artırabilir çünkü sorgu motoruna veri bulmanın hızlı bir yolunu sağlarlar. Ancak, verileri ne sıklıkta eklemeyi, güncellemeyi veya silmeyi planladığınızı da dikkate almalısınız. Verileri değiştirdiğinizde, veriler üzerindeki karşılık gelen eylemleri yansıtacak şekilde dizinlerin de değiştirilmesi gerekir; bu da sistem performansını önemli ölçüde azaltabilir. Dizine ekleme stratejinizi planlarken aşağıdaki yönergeleri göz önünde bulundurun:
  • Sık sık güncellenen tablolar için mümkün olduğunca az dizin kullanın.
  • Tablo büyük miktarda veri içeriyorsa ancak değişiklikler küçükse, sorgularınızın performansını artırmak için gerektiği kadar dizin kullanın. Ancak küçük tablolarda indeksleri kullanmadan önce dikkatlice düşünün çünkü... Dizin araması kullanmanın tüm satırları taramaktan daha uzun sürmesi mümkündür.
  • Kümelenmiş dizinler için alanları mümkün olduğunca kısa tutmaya çalışın. En iyi yaklaşım, benzersiz değerlere sahip ve NULL'a izin vermeyen sütunlarda kümelenmiş bir dizin kullanmaktır. Bu nedenle birincil anahtar genellikle kümelenmiş dizin olarak kullanılır.
  • Bir sütundaki değerlerin benzersizliği endeksin performansını etkiler. Genel olarak, bir sütunda ne kadar çok kopya varsa, dizin performansı o kadar kötü olur. Öte yandan ne kadar çok benzersiz değer varsa endeksin performansı da o kadar iyi olur. Mümkün olduğunda benzersiz bir dizin kullanın.
  • Bileşik indeks için indeksteki sütunların sırasını dikkate alın. İfadelerde kullanılan sütunlar NEREDE(Örneğin, NEREDE Ad = "Charlie") dizinde ilk sırada olmalıdır. Sonraki sütunlar, değerlerinin benzersizliğine göre listelenmelidir (en yüksek sayıda benzersiz değere sahip sütunlar ilk sırada gelir).
  • Belirli gereksinimleri karşılamaları durumunda, hesaplanan sütunlar için de bir dizin belirtebilirsiniz. Örneğin, bir sütunun değerini elde etmek için kullanılan ifadeler deterministik olmalıdır (belirli bir giriş parametreleri kümesi için her zaman aynı sonucu döndürmelidir).
Veritabanı sorguları
Dizinleri tasarlarken göz önünde bulundurulması gereken bir diğer husus, veritabanında hangi sorguların çalıştırıldığıdır. Daha önce de belirtildiği gibi, verilerin ne sıklıkta değiştiğini dikkate almalısınız. Ayrıca aşağıdaki ilkeler kullanılmalıdır:
  • Birkaç tek sorguda yapmak yerine, tek bir sorguda mümkün olduğu kadar çok satır eklemeye veya değiştirmeye çalışın.
  • Sorgularınızda arama terimi olarak sıklıkla kullanılan sütunlarda kümelenmemiş bir dizin oluşturun. NEREDE ve bağlantılar KATILMAK.
  • Tam değer eşleşmeleri için satır arama sorgularında kullanılan sütunları dizine eklemeyi düşünün.

Ve şimdi aslında:

SQL Server'daki dizinler hakkında sormaya utandığınız 14 soru

Neden bir tablonun iki kümelenmiş dizini olamaz?

Kısa bir cevap mı istiyorsunuz? Kümelenmiş dizin bir tablodur. Bir tabloda kümelenmiş dizin oluşturduğunuzda, depolama motoru tablodaki tüm satırları dizin tanımına göre artan veya azalan sırada sıralar. Kümelenmiş dizin, diğer dizinler gibi ayrı bir varlık değil, bir tablodaki verileri sıralamaya ve veri satırlarına hızlı erişimi kolaylaştırmaya yönelik bir mekanizmadır.
Satış işlemlerinin geçmişini içeren bir tablonuz olduğunu düşünelim. Satış tablosunda sipariş numarası, siparişteki ürün konumu, ürün numarası, ürün miktarı, sipariş numarası ve tarihi vb. bilgiler yer alır. Sütunlarda kümelenmiş bir dizin oluşturursunuz Sipariş Kimliği Ve Hat Kimliği aşağıda gösterildiği gibi artan sırada sıralanmıştır T-SQL kod:
BENZERSİZ KÜMELENMİŞ DİZİN OLUŞTURUN ix_oriderid_lineid ON dbo.Sales(OrderID, LineID);
Bu betiği çalıştırdığınızda, tablodaki tüm satırlar fiziksel olarak önce OrderID sütununa, ardından LineID'ye göre sıralanacak, ancak verilerin kendisi tek bir mantıksal blokta, yani tabloda kalacaktır. Bu nedenle iki kümelenmiş dizin oluşturamazsınız. Tek bir veriye sahip yalnızca bir tablo olabilir ve bu tablo belirli bir sıraya göre yalnızca bir kez sıralanabilir.

Kümelenmiş bir tablo birçok fayda sağlıyorsa neden yığın kullanasınız ki?

Haklısın. Kümelenmiş tablolar harikadır ve sorgularınızın çoğu, kümelenmiş dizine sahip tablolarda daha iyi performans gösterir. Ancak bazı durumlarda masaları doğal, bozulmamış hallerinde bırakmak isteyebilirsiniz; yığın biçiminde ve sorgularınızın çalışmaya devam etmesi için yalnızca kümelenmemiş dizinler oluşturun.
Hatırlayacağınız gibi yığın, verileri rastgele sırada saklar. Tipik olarak, depolama alt sistemi verileri bir tabloya eklendikleri sıraya göre ekler, ancak depolama alt sistemi aynı zamanda daha verimli depolama için satırları hareket ettirmeyi de sever. Sonuç olarak verilerin hangi sırayla saklanacağını tahmin etme şansınız yoktur.
Sorgu motorunun kümelenmemiş bir dizinin yararı olmadan veri bulması gerekiyorsa, ihtiyaç duyduğu satırları bulmak için tabloyu tam olarak tarayacaktır. Çok küçük masalarda bu genellikle bir sorun değildir, ancak yığının boyutu büyüdükçe performans hızla düşer. Elbette, kümelenmemiş bir dizin, gerekli verilerin depolandığı dosya, sayfa ve satıra yönelik bir işaretçi kullanarak yardımcı olabilir; bu genellikle tablo taramasına çok daha iyi bir alternatiftir. Öyle olsa bile, sorgu performansı dikkate alındığında kümelenmiş dizinin faydalarını karşılaştırmak zordur.
Ancak yığın belirli durumlarda performansı artırmaya yardımcı olabilir. Çok sayıda ekleme içeren ancak az sayıda güncelleme veya silme işlemi içeren bir tablo düşünün. Örneğin, bir günlüğün saklandığı bir tablo, öncelikle arşivlenene kadar değer eklemek için kullanılır. Yığın üzerinde, kümelenmiş bir dizinde olduğu gibi sayfalama ve veri parçalanmasını görmezsiniz çünkü satırlar yalnızca yığının sonuna eklenir. Sayfaları çok fazla bölmek performans üzerinde önemli bir etkiye sahip olabilir ve bu iyi bir yönde değildir. Genel olarak yığın, verileri nispeten sorunsuz bir şekilde eklemenize olanak tanır ve kümelenmiş bir dizinle yapacağınız depolama ve bakım masraflarıyla uğraşmak zorunda kalmazsınız.
Ancak verilerin güncellenmemesi ve silinmemesi tek neden olarak görülmemelidir. Verilerin örneklenme şekli de önemli bir faktördür. Örneğin, veri aralıklarını sık sık sorguluyorsanız veya sorguladığınız verilerin sıklıkla sıralanması veya gruplandırılması gerekiyorsa yığın kullanmamalısınız.
Bütün bunlar, yığını yalnızca çok küçük tablolarla çalışırken veya tabloyla tüm etkileşiminizin veri eklemekle sınırlı olduğu ve sorgularınızın son derece basit olduğu (ve kümelenmemiş dizinler kullandığınız) durumlarda kullanmayı düşünmeniz gerektiği anlamına gelir. Neyse). Aksi takdirde, yaygın olarak kullanılan bir sütun gibi, basit bir artan anahtar alanında tanımlanan iyi tasarlanmış bir kümelenmiş dizine bağlı kalın. KİMLİK.

Varsayılan dizin doldurma faktörünü nasıl değiştiririm?

Varsayılan dizin doldurma faktörünü değiştirmek bir şeydir. Varsayılan oranın nasıl çalıştığını anlamak başka bir konudur. Ama önce birkaç adım geriye gidin. Dizin doldurma faktörü, yeni bir sayfayı doldurmaya başlamadan önce dizini alt düzeyde (yaprak düzeyi) saklayacak sayfadaki alan miktarını belirler. Örneğin katsayı 90 olarak ayarlanırsa indeks büyüdüğünde sayfanın %90'ını kaplayacak ve ardından bir sonraki sayfaya geçecektir.
Varsayılan olarak dizin doldurma faktörü değeri şu şekildedir: SQL Server 0'dır, yani 100'e eşittir. Sonuç olarak, siz kodunuzda sistem standart değerinden farklı bir değer belirtmediğiniz veya varsayılan davranışı değiştirmediğiniz sürece, tüm yeni dizinler otomatik olarak bu ayarı devralır. Kullanabilirsiniz SQL Server Yönetim Stüdyosu varsayılan değeri ayarlamak veya bir sistem saklı yordamını çalıştırmak için sp_configure. Örneğin aşağıdaki set T-SQL komutları katsayı değerini 90'a ayarlar (öncelikle gelişmiş ayarlar moduna geçmelisiniz):
EXEC sp_configure "gelişmiş seçenekleri göster", 1; YENİDEN YAPILANDIRMAYA GİT; GO EXEC sp_configure "doldurma faktörü", 90; YENİDEN YAPILANDIRMAYA GİT; GİTMEK
Dizin doldurma faktörü değerini değiştirdikten sonra hizmeti yeniden başlatmanız gerekir. SQL Server. Artık belirtilen ikinci argüman olmadan sp_configure komutunu çalıştırarak ayarlanan değeri kontrol edebilirsiniz:
EXEC sp_configure "doldurma faktörü" GO
Bu komut 90 değerini döndürmelidir. Sonuç olarak yeni oluşturulan tüm dizinler bu değeri kullanacaktır. Bunu bir dizin oluşturarak ve doldurma faktörü değerini sorgulayarak test edebilirsiniz:
AdventureWorks2012'Yİ KULLANIN; -- veritabanınız GO CREATE KÜMELENMEMİŞ DİZİN ix_people_lastname ON Person.Person(LastName); GİT sys.indexes'TEN fill_factor'U SEÇİN NEREDE object_id = object_id("Person.Person") VE name="ix_people_lastname";
Bu örnekte bir tabloda kümelenmemiş bir dizin oluşturduk Kişi veritabanında AdventureWorks2012. İndex oluşturduktan sonra sys.indexes sistem tablolarından dolgu faktörü değerini alabiliriz. Sorgu 90 değerini döndürmelidir.
Ancak dizini silip yeniden oluşturduğumuzu ancak şimdi belirli bir doldurma faktörü değeri belirttiğimizi düşünelim:
KÜMELENMEMİŞ DİZİN OLUŞTURUN ix_people_lastname ON Person.Person(LastName) İLE (fillfactor=80); GİT sys.indexes'TEN fill_factor'U SEÇİN NEREDE object_id = object_id("Person.Person") VE name="ix_people_lastname";
Bu sefer talimatlar ekledik İLE ve seçenek doldurma faktörü dizin oluşturma işlemimiz için DİZİN OLUŞTUR ve 80 değerini belirttim. Operatör SEÇMEşimdi karşılık gelen değeri döndürür.
Şu ana kadar her şey oldukça basitti. Tüm bu süreçte gerçekten yanabileceğiniz yer, bu değeri bildiğinizi varsayarak, varsayılan katsayı değerini kullanan bir dizin oluşturmanızdır. Örneğin birisi sunucu ayarlarıyla uğraşıyor ve o kadar inatçı ki indeks doldurma faktörünü 20'ye ayarlıyor. Bu sırada varsayılan değerin 0 olduğunu varsayarak indeksler oluşturmaya devam ediyorsunuz. Ne yazık ki dolguyu bulmanın bir yolu yok. Bir dizin oluşturmadığınız sürece faktörü kullanın ve ardından örneklerimizde yaptığımız gibi değeri kontrol edin. Aksi takdirde sorgu performansının bir şeylerden şüphelenmeye başlayacak kadar düştüğü anı beklemek zorunda kalacaksınız.
Bilmeniz gereken bir diğer konu ise indeksleri yeniden oluşturmaktır. Dizin oluştururken olduğu gibi, dizini yeniden oluştururken dizin doldurma faktörü değerini belirtebilirsiniz. Ancak, dizin oluştur komutunun aksine, yeniden oluşturma, göründüğü gibi olmasına rağmen sunucunun varsayılan ayarlarını kullanmaz. Dahası, indeks doldurma faktörü değerini özel olarak belirtmezseniz, o zaman SQL Server bu endeksin yeniden yapılandırılmadan önce var olduğu katsayı değerini kullanacaktır. Örneğin aşağıdaki işlem DEĞİŞİKLİK ENDEKSİ az önce oluşturduğumuz dizini yeniden oluşturur:
ALTER INDEX ix_people_lastname ON Person.Person REBUILD; GİT sys.indexes'TEN fill_factor'U SEÇİN NEREDE object_id = object_id("Person.Person") VE name="ix_people_lastname";
Doldurma faktörü değerini kontrol ettiğimizde 80 değerini elde edeceğiz çünkü indeksi en son oluşturduğumuzda bunu belirtmiştik. Varsayılan değer göz ardı edilir.
Gördüğünüz gibi indeks doldurma faktörü değerini değiştirmek o kadar da zor değil. Uygulandığında mevcut değerini bilmek ve anlamak çok daha zordur. Dizinleri oluştururken ve yeniden oluştururken her zaman özel olarak katsayıyı belirtirseniz, belirli sonucu her zaman bilirsiniz. Başka birinin sunucu ayarlarını tekrar bozup tüm dizinlerin gülünç derecede düşük bir dizin doldurma faktörüyle yeniden oluşturulmasına neden olmayacağından emin olmak konusunda endişelenmenize gerek kalmadığı sürece.

Kopyaları içeren bir sütunda kümelenmiş dizin oluşturmak mümkün mü?

Evet ve hayır. Evet, yinelenen değerler içeren bir anahtar sütununda kümelenmiş bir dizin oluşturabilirsiniz. Hayır, bir anahtar sütunun değeri benzersiz olmayan bir durumda kalamaz. Açıklamama izin ver. Bir sütunda benzersiz olmayan bir kümelenmiş dizin oluşturursanız, depolama motoru benzersizliği sağlamak için yinelenen değere bir benzersizleştirici ekler ve bu nedenle kümelenmiş tablodaki her satırı tanımlayabilir.
Örneğin müşteri verilerini içeren bir sütunda kümelenmiş dizin oluşturmaya karar verebilirsiniz. Soy isim soyadını koruyor. Sütun Franklin, Hancock, Washington ve Smith değerlerini içerir. Daha sonra Adams, Hancock, Smith ve Smith değerlerini tekrar eklersiniz. Ancak anahtar sütununun değeri benzersiz olmalıdır, böylece depolama motoru kopyaların değerini şu şekilde görünecek şekilde değiştirecektir: Adams, Franklin, Hancock, Hancock1234, Washington, Smith, Smith4567 ve Smith5678.
İlk bakışta bu yaklaşım iyi görünüyor ancak bir tamsayı değeri anahtarın boyutunu artırır, bu da çok sayıda kopya varsa sorun yaratabilir ve bu değerler kümelenmemiş bir endeksin veya yabancı bir dizinin temeli haline gelecektir. anahtar referans. Bu nedenlerden dolayı mümkün olduğunca her zaman benzersiz kümelenmiş dizinler oluşturmaya çalışmalısınız. Bu mümkün değilse, en azından benzersiz değeri çok yüksek içeriğe sahip sütunları kullanmayı deneyin.

Kümelenmiş bir dizin oluşturulmamışsa tablo nasıl saklanır?

SQL Server iki tür tabloyu destekler: kümelenmiş dizine sahip kümelenmiş tablolar ve yığın tabloları veya yalnızca yığınlar. Kümelenmiş tabloların aksine yığındaki veriler hiçbir şekilde sıralanmaz. Özünde, bu bir veri yığınıdır (yığın). Böyle bir tabloya bir satır eklerseniz, depolama motoru onu basitçe sayfanın sonuna ekleyecektir. Sayfa verilerle dolduğunda yeni bir sayfaya eklenecektir. Çoğu durumda, sıralanabilirlik ve sorgu hızından yararlanmak için tabloda kümelenmiş bir dizin oluşturmak isteyeceksiniz (sıralanmamış bir adres defterinde bir telefon numarasını aradığınızı hayal edin). Ancak, kümelenmiş bir dizin oluşturmamayı seçerseniz, yığın üzerinde yine de kümelenmemiş bir dizin oluşturabilirsiniz. Bu durumda, her dizin satırında bir yığın satırına yönelik bir işaretçi bulunur. Dizin dosya kimliğini, sayfa numarasını ve veri satırı numarasını içerir.

Değer benzersizliği kısıtlamaları ile tablo dizinleri içeren birincil anahtar arasındaki ilişki nedir?

Birincil anahtar ve benzersiz kısıtlama, bir sütundaki değerlerin benzersiz olmasını sağlar. Bir tablo için yalnızca bir birincil anahtar oluşturabilirsiniz ve bu tablo değer içeremez HÜKÜMSÜZ. Bir tablo için bir değerin benzersizliğine ilişkin çeşitli kısıtlamalar oluşturabilirsiniz ve bunların her biri, tek bir kayda sahip olabilir. HÜKÜMSÜZ.
Birincil anahtar oluşturduğunuzda, önceden kümelenmiş bir dizin oluşturulmamışsa, depolama motoru da benzersiz bir kümelenmiş dizin oluşturur. Ancak, varsayılan davranışı geçersiz kılabilirsiniz ve kümelenmemiş bir dizin oluşturulacaktır. Birincil anahtarı oluşturduğunuzda kümelenmiş bir dizin mevcutsa, benzersiz bir kümelenmemiş dizin oluşturulacaktır.
Benzersiz bir kısıtlama oluşturduğunuzda, depolama motoru benzersiz, kümelenmemiş bir dizin oluşturur. Ancak daha önce oluşturulmamışsa, benzersiz bir kümelenmiş dizinin oluşturulmasını belirtebilirsiniz.
Genel olarak benzersiz bir değer kısıtlaması ve benzersiz bir dizin aynı şeydir.

SQL Server'da kümelenmiş ve kümelenmemiş dizinlere neden B ağacı adı veriliyor?

SQL Server'daki kümelenmiş veya kümelenmemiş temel dizinler, dizin düğümleri adı verilen sayfa kümeleri arasında dağıtılır. Bu sayfalar dengeli ağaç adı verilen ağaç yapısına sahip belirli bir hiyerarşide düzenlenir. Şekilde gösterildiği gibi, üst seviyede kök düğüm, altta yaprak düğümler ve üst ve alt seviyeler arasında ara düğümler bulunur:


Kök düğüm, indeks yoluyla veri almaya çalışan sorgular için ana giriş noktasını sağlar. Sorgu motoru, bu düğümden başlayarak hiyerarşik yapıda verileri içeren uygun yaprak düğüme doğru bir gezinme başlatır.
Örneğin, anahtar değeri 82 olan satırların seçilmesi için bir istek alındığını düşünün. Sorgu alt sistemi, bizim durumumuzda 1-100 arası uygun bir ara düğüme karşılık gelen kök düğümden çalışmaya başlar. Ara düğüm 1-100'den düğüm 51-100'e ve oradan da son düğüm 76-100'e geçiş vardır. Bu kümelenmiş bir dizinse, düğüm yaprağı 82'ye eşit anahtarla ilişkili satırın verilerini içerir. Bu kümelenmemiş bir dizinse, dizin yaprağı kümelenmiş tabloya veya belirli bir satıra yönelik bir işaretçi içerir. yığın.

Tüm bu dizin düğümlerini geçmeniz gerekiyorsa, bir dizin sorgu performansını nasıl artırabilir?

İlk olarak, dizinler her zaman performansı iyileştirmez. Çok fazla yanlış oluşturulmuş indeks sistemi bataklığa çevirir ve sorgu performansını düşürür. Endekslerin dikkatli uygulanması durumunda ciddi performans kazanımları sağlayabileceğini söylemek daha doğru olur.
Performans ayarlamaya adanmış devasa bir kitap düşünün SQL Server(kağıt versiyon, elektronik versiyon değil). Kaynak Yöneticisini yapılandırma hakkında bilgi bulmak istediğinizi düşünün. Parmağınızı tüm kitap boyunca sayfa sayfa sürükleyebilirsiniz veya içindekiler tablosunu açıp aradığınız bilginin tam sayfa numarasını öğrenebilirsiniz (kitabın doğru indekslenmesi ve içeriğin doğru indekslere sahip olması şartıyla). İhtiyacınız olan bilgiyi birincil yapıdan (kitap) almak için öncelikle tamamen farklı bir yapıya (dizin) erişmeniz gerekse bile, bu kesinlikle size önemli ölçüde zaman kazandıracaktır.
Bir kitap dizini gibi, bir dizin SQL Server Bir tabloda yer alan tüm verileri tamamen taramak yerine, ihtiyacınız olan veriler üzerinde hassas sorgular çalıştırmanıza olanak tanır. Küçük tablolar için tam tarama genellikle sorun değildir, ancak büyük tablolar çok sayıda veri sayfası kaplar; bu da, sorgu motorunun verilerin doğru konumunu hemen elde etmesine izin verecek bir dizin mevcut olmadığı sürece önemli ölçüde sorgu yürütme süresine neden olabilir. Büyük bir metropolün önündeki çok katlı bir yol kavşağında haritasız olarak kaybolduğunuzu hayal edin, fikri anlayacaksınız.

Dizinler bu kadar harikaysa neden her sütunda bir tane oluşturmuyorsunuz?

Hiçbir iyilik cezasız kalmamalı. En azından indekslerde durum böyle. Elbette, operatör getirme sorgularını çalıştırdığınız sürece dizinler harika çalışır SEÇME ancak operatörlere sık sık çağrılar başlar başlamaz SOKMAK, GÜNCELLEME Ve SİLMEK yani manzara çok hızlı değişiyor.
Operatör tarafından bir veri talebi başlattığınızda SEÇME sorgu motoru dizini bulur, ağaç yapısında hareket eder ve aradığı veriyi keşfeder. Daha basit ne olabilir? Ancak şöyle bir değişiklik ifadesi başlatırsanız işler değişir: GÜNCELLEME. Evet, ifadenin ilk bölümünde sorgu motoru değiştirilen satırı bulmak için tekrar dizini kullanabilir - bu iyi bir haber. Ve anahtar sütunlardaki değişiklikleri etkilemeyen bir satırdaki verilerde basit bir değişiklik varsa, o zaman değişiklik süreci tamamen ağrısız olacaktır. Ancak değişiklik, verileri içeren sayfaların bölünmesine neden olursa veya bir anahtar sütunun değeri, başka bir dizin düğümüne taşınmasına neden olacak şekilde değiştirilirse ne olur? Bu, dizinin muhtemelen tüm ilgili dizinleri ve işlemleri etkileyen bir yeniden düzenlemeye ihtiyaç duymasıyla sonuçlanacaktır. üretkenlikte yaygın bir düşüşe yol açmaktadır.
Bir operatörü çağırırken de benzer işlemler meydana gelir SİLMEK. Bir dizin silinen verinin yerinin belirlenmesine yardımcı olabilir, ancak verinin kendisinin silinmesi sayfanın yeniden karıştırılmasına neden olabilir. Operatör ile ilgili SOKMAK, tüm indekslerin ana düşmanı: büyük miktarda veri eklemeye başlarsınız, bu da indekslerde değişikliklere ve bunların yeniden düzenlenmesine yol açar ve herkes bundan zarar görür.
Bu nedenle, ne tür dizinlerin ve kaç tane oluşturulacağını düşünürken veritabanınızdaki sorgu türlerini göz önünde bulundurun. Daha fazlası daha iyi anlamına gelmez. Bir tabloya yeni bir dizin eklemeden önce, yalnızca temel sorguların maliyetini değil, aynı zamanda tüketilen disk alanı miktarını, işlevselliği ve dizinleri sürdürme maliyetini de göz önünde bulundurun; bu, diğer işlemler üzerinde domino etkisine yol açabilir. Dizin tasarım stratejiniz uygulamanızın en önemli yönlerinden biridir ve dizinin boyutundan benzersiz değerlerin sayısına, dizinin destekleyeceği sorgu türlerine kadar pek çok hususu içermelidir.

Birincil anahtara sahip bir sütunda kümelenmiş dizin oluşturmak gerekli midir?

Gerekli koşulları karşılayan herhangi bir sütunda kümelenmiş dizin oluşturabilirsiniz. Kümelenmiş dizin ile birincil anahtar kısıtlamasının birbirleri için yapıldığı ve mükemmel bir eşleşme olduğu doğrudur; bu nedenle, bir birincil anahtar oluşturduğunuzda, kümelenmiş dizinin eğer henüz oluşturulmamışsa otomatik olarak oluşturulacağı gerçeğini anlayın. daha önce yaratıldı. Ancak, kümelenmiş bir endeksin başka bir yerde daha iyi performans göstereceğine karar verebilirsiniz ve kararınız çoğunlukla haklı çıkacaktır.
Kümelenmiş dizinin temel amacı, tablonuzdaki tüm satırları, dizini tanımlarken belirtilen anahtar sütuna göre sıralamaktır. Bu, hızlı arama ve tablo verilerine kolay erişim sağlar.
Bir tablonun birincil anahtarı iyi bir seçim olabilir çünkü tablolardaki her satırı ek veri eklemeye gerek kalmadan benzersiz şekilde tanımlar. Bazı durumlarda en iyi seçim, yalnızca benzersiz değil aynı zamanda boyutu küçük olan ve değerleri sırayla artan ve bu değere dayalı kümelenmemiş dizinleri daha verimli hale getiren yedek birincil anahtar olacaktır. Sorgu iyileştirici aynı zamanda kümelenmiş dizin ve birincil anahtarın bu kombinasyonunu da sever çünkü tabloları birleştirmek, birincil anahtarı ve bununla ilişkili kümelenmiş dizini kullanmayan başka bir şekilde birleştirmekten daha hızlıdır. Dediğim gibi bu cennette yapılan bir eşleşme.
Ancak son olarak, kümelenmiş bir dizin oluştururken dikkate alınması gereken birkaç hususun olduğunu belirtmekte fayda var: kaç tane kümelenmemiş dizinin buna dayanacağı, anahtar dizin sütununun değerinin ne sıklıkta değişeceği ve ne kadar büyük olacağı. Kümelenmiş bir indeksin sütunlarındaki değerler değiştiğinde veya indeks beklendiği gibi performans göstermediğinde tablodaki diğer tüm indeksler etkilenebilir. Kümelenmiş bir indeks, değerleri belirli bir sırayla artan ancak rastgele değişmeyen en kalıcı sütunu temel almalıdır. Dizin, tablonun en sık erişilen verilerine yönelik sorguları desteklemelidir; böylece sorgular, verilerin dizinin yaprakları olan kök düğümlerde sıralanması ve erişilebilir olması gerçeğinden tam olarak yararlanır. Birincil anahtar bu senaryoya uyuyorsa onu kullanın. Değilse farklı bir sütun kümesi seçin.

Bir görünümü dizine eklerseniz, bu hala bir görünüm mü olur?

Görünüm, bir veya daha fazla tablodan veri üreten sanal bir tablodur. Temel olarak, bu görünümü sorguladığınızda temel tablolardan veri alan adlandırılmış bir sorgudur. Bu görünümde, bir tabloda dizin oluşturduğunuzda olduğu gibi, kümelenmiş bir dizin ve kümelenmemiş dizinler oluşturarak sorgu performansını artırabilirsiniz, ancak asıl uyarı, önce kümelenmiş bir dizin oluşturmanız ve ardından kümelenmemiş bir dizin oluşturabilmenizdir.
Dizinlenmiş bir görünüm (gerçekleştirilmiş görünüm) oluşturulduğunda, görünüm tanımının kendisi ayrı bir varlık olarak kalır. Sonuçta bu sadece sabit kodlanmış bir operatör SEÇME, veritabanında saklanır. Ancak endeks tamamen farklı bir hikaye. Bir sağlayıcıda kümelenmiş veya kümelenmemiş bir dizin oluşturduğunuzda, veriler tıpkı normal bir dizin gibi fiziksel olarak diske kaydedilir. Ayrıca, temel tablolardaki veriler değiştiğinde görünümün dizini de otomatik olarak değişir (bu, sık sık değişen tablolardaki görünümleri dizine eklemekten kaçınmak isteyebileceğiniz anlamına gelir). Her durumda, görünüm bir görünüm olarak kalır - tabloların bir görünümü, ancak o anda yürütülen ve buna karşılık gelen dizinlerle birlikte yürütülen bir görünüm.
Bir görünümde dizin oluşturabilmeniz için önce birkaç kısıtlamayı karşılaması gerekir. Örneğin, bir görünüm yalnızca temel tablolara başvurabilir, ancak diğer görünümlere başvuramaz ve bu tabloların aynı veritabanında olması gerekir. Aslında başka birçok kısıtlama var, bu nedenle belgeleri kontrol ettiğinizden emin olun. SQL Server tüm kirli ayrıntılar için.

Bileşik indeks yerine neden kaplama indeksi kullanılmalı?

Öncelikle ikisi arasındaki farkı anladığımızdan emin olalım. Bileşik dizin, birden fazla sütun içeren normal bir dizindir. Bir tablodaki her satırın benzersiz olmasını sağlamak için birden çok anahtar sütunu kullanılabilir veya birincil anahtarın benzersiz olmasını sağlamak için birden çok sütununuz olabilir veya sık çağrılan sorguların birden çok sütunda yürütülmesini optimize etmeye çalışıyor olabilirsiniz. Ancak genel olarak bir indeks ne kadar çok anahtar sütun içerirse indeks o kadar az verimli olur; bu da bileşik indekslerin dikkatli kullanılması gerektiği anlamına gelir.
Belirtildiği gibi, gerekli tüm veriler tıpkı endeksin kendisi gibi hemen endeksin yapraklarında bulunursa, bir sorgu büyük fayda sağlayabilir. Kümelenmiş bir dizin için bu bir sorun değildir çünkü tüm veriler zaten oradadır (bu nedenle kümelenmiş bir dizin oluşturduğunuzda dikkatli düşünmeniz çok önemlidir). Ancak yapraklardaki kümelenmemiş bir dizin yalnızca anahtar sütunları içerir. Diğer tüm verilere erişmek için sorgu iyileştirici, sorgularınızın yürütülmesine önemli ölçüde ek yük getirebilecek ek adımlar gerektirir.
Kaplama endeksinin kurtarmaya geldiği yer burasıdır. Kümelenmemiş bir dizin tanımladığınızda anahtar sütunlarınıza ek sütunlar belirtebilirsiniz. Örneğin, uygulamanızın sıklıkla sütun verilerini sorguladığını varsayalım. Sipariş Kimliği Ve Sipariş tarihi masada Satış:
Sipariş Kimliğini, Sipariş Tarihini Satıştan SEÇİN Sipariş Kimliği = 12345;
Her iki sütunda da bileşik, kümelenmemiş bir dizin oluşturabilirsiniz, ancak OrderDate sütunu, özellikle yararlı bir anahtar sütunu olarak hizmet etmeden yalnızca dizin bakım yükünü ekleyecektir. En iyi çözüm, anahtar sütunda bir kaplama dizini oluşturmak olacaktır. Sipariş Kimliği ve ayrıca sütun dahil Sipariş tarihi:
KÜMELENMEMİŞ ENDEKS OLUŞTURUN ix_orderid ON dbo.Sales(OrderID) INCLUDE (OrderDate);
Bu, gereksiz sütunları indekslemenin dezavantajlarını ortadan kaldırırken, sorguları çalıştırırken verileri yapraklarda saklamanın avantajlarını da korur. Dahil edilen sütun anahtarın bir parçası değildir ancak veriler, dizin yaprağı olan yaprak düğümde depolanır. Bu, herhangi bir ek yük olmadan sorgu performansını artırabilir. Ayrıca kapsayıcı indekste yer alan sütunlar, indeksin anahtar sütunlarına göre daha az kısıtlamaya tabidir.

Anahtar sütundaki kopyaların sayısı önemli mi?

Bir dizin oluşturduğunuzda, anahtar sütunlarınızdaki yinelenenlerin sayısını azaltmaya çalışmalısınız. Daha doğrusu: Tekrarlama oranını mümkün olduğu kadar düşük tutmaya çalışın.
Bileşik bir dizinle çalışıyorsanız çoğaltma bir bütün olarak tüm anahtar sütunlara uygulanır. Tek bir sütun birçok yinelenen değer içerebilir, ancak tüm dizin sütunları arasında minimum düzeyde tekrar olmalıdır. Örneğin, sütunlarda bileşik, kümelenmemiş bir dizin oluşturursunuz İlk adı Ve Soy isim, çok sayıda John Doe değerine ve çok sayıda Doe değerine sahip olabilirsiniz ancak mümkün olduğunca az sayıda John Doe değerine veya tercihen yalnızca bir John Doe değerine sahip olmak istersiniz.
Bir anahtar sütunun değerlerinin benzersizlik oranına indeks seçiciliği denir. Ne kadar çok benzersiz değer varsa seçicilik de o kadar yüksek olur: benzersiz bir indeks mümkün olan en yüksek seçiciliğe sahiptir. Sorgu motoru, yüksek seçicilik değerlerine sahip sütunları gerçekten sever; özellikle de bu sütunlar, en sık yürütülen sorgularınızın WHERE yan tümcelerinde yer alıyorsa. Dizin ne kadar seçici olursa, sorgu motoru o kadar hızlı sonuçlanacak veri kümesinin boyutunu azaltabilir. Tabii ki olumsuz tarafı, nispeten az sayıda benzersiz değere sahip sütunların nadiren indeksleme için iyi adaylar olacağıdır.

Bir anahtar sütunun verilerinin yalnızca belirli bir alt kümesinde kümelenmemiş bir dizin oluşturmak mümkün müdür?

Varsayılan olarak, kümelenmemiş bir dizin, tablodaki her satır için bir satır içerir. Elbette aynı şeyi kümelenmiş bir indeks için de söyleyebiliriz, böyle bir indeksin bir tablo olduğunu varsayarak. Ancak kümelenmemiş bir dizin söz konusu olduğunda bire bir ilişki önemli bir kavramdır çünkü sürümden başlayarak SQL Server 2008 içerdiği satırları sınırlayan, filtrelenebilir bir dizin oluşturma seçeneğiniz vardır. Filtrelenmiş bir dizin sorgu performansını artırabilir çünkü... boyutu daha küçüktür ve tüm tablo halindeki istatistiklerden daha filtrelenmiş, daha doğru istatistikler içerir; bu, gelişmiş yürütme planlarının oluşturulmasına yol açar. Filtrelenmiş bir dizin ayrıca daha az depolama alanı ve daha düşük bakım maliyetleri gerektirir. Dizin yalnızca filtreyle eşleşen veriler değiştiğinde güncellenir.
Ayrıca filtrelenebilir bir dizin oluşturmak kolaydır. Operatörde DİZİN OLUŞTUR sadece belirtmeniz yeterli NEREDE filtre durumu. Örneğin, kodda gösterildiği gibi dizindeki NULL içeren tüm satırları filtreleyebilirsiniz:
CarrierTrackingNumber'ın BOŞ OLMADIĞI YERDE Sales.SalesOrderDetail(CarrierTrackingNumber)'DA KÜMELENMEMİŞ ENDEKS OLUŞTURUN ix_trackingnumber;
Aslında kritik sorgularda önemli olmayan verileri filtreleyebiliriz. Ama dikkatli ol, çünkü... SQL Server filtrelenebilir dizinlere, bir görünümde filtrelenebilir dizin oluşturulamaması gibi çeşitli kısıtlamalar getirir; bu nedenle belgeleri dikkatlice okuyun.
Dizine alınmış bir görünüm oluşturarak da benzer sonuçlar elde edebilirsiniz. Bununla birlikte, filtrelenmiş bir dizinin, bakım maliyetlerini azaltma ve yürütme planlarınızın kalitesini artırma yeteneği gibi çeşitli avantajları vardır. Filtrelenen dizinler çevrimiçi olarak da yeniden oluşturulabilir. Bunu indekslenmiş bir görünümle deneyin.

Ve yine çevirmenden biraz

Bu çevirinin Habrahabr sayfalarında görünmesinin amacı, size SimpleTalk blogunu anlatmak veya hatırlatmaktı. RedGate.
Pek çok eğlenceli ve ilginç yazı yayınlıyor.
Hiçbir şirket ürününe bağlı değilim RedGate, ne de onların satışıyla.

Söz verdiğim gibi, daha fazlasını öğrenmek isteyenler için kitaplar
Kendimden çok iyi üç kitap öneriyorum (bağlantılar tutuşmak mağazadaki versiyonlar Amazon):

Prensip olarak basit dizinleri açabilirsiniz. Etiket ekleyin
Microsoft SQL Server 2012 T-SQL Temelleri (Geliştirici Referansı)
Yazar Itzik Ben-Gan
Yayın Tarihi: 15 Temmuz 2012
İşinin ustası olan yazar, veritabanlarıyla çalışma konusunda temel bilgileri sağlıyor.
Her şeyi unuttuysanız veya hiç bilmiyorsanız kesinlikle okumaya değer.

Tabloda çok fazla kayıt varsa doğru kaydı bulmak çok zor olabilir. Veri araması kaba kuvvet yöntemi kullanılarak gerçekleştirilir, yani ilk kayıttan son kayda kadar tüm tablo kayıtları incelenir ve bu da çok fazla zaman kaybına neden olur. Bir tablodaki veriyi bulmayı kolaylaştırmak için indeksler kullanılır. Bazen işaretçi olarak da adlandırılan indeks, bir tablodaki kaydın sıralı numarasıdır. Endeks, bir alanın değerlerine veya birkaç alanın değerlerine göre oluşturulur. Bir alanın değerleri kullanılarak oluşturulan bir dizine basit, iki veya daha fazla alanın değerlerine dayanan bir dizine ise karmaşık denir. Dizin oluşturma sırasında tablodaki kayıtlar, gelecekteki dizinin alanının (veya alanlarının) değerlerine göre sıralanır. Daha sonra tablonun ilk satırına bir numaralı indeks atanır, ikinci satırına iki numaralı indeks atanır ve tablonun sonuna kadar bu şekilde devam eder.

Hem basit hem de karmaşık indekslerin kendi türleri (Ture) vardır. Birincil (Birincil) dizin (anahtar), bir kaydı benzersiz şekilde tanımlayan bir alandır veya alanlar grubudur, yani birincil dizinin değerleri benzersizdir (tekrarlanmaz). İlişkisel veritabanında her tablonun yalnızca bir birincil anahtarı olabilir. Bir tablonun birçok yabancı anahtarı olabilir ve bunlar aşağıdaki türlerden birine sahip olacaktır:

Aday – birincil anahtar veya alternatif anahtar adayı. Birincil anahtarın tüm özelliklerine sahiptir.

Benzersiz - oluşturulduğu alanda yinelenen değerlere izin verir, ancak aynı dizin alanı değerine sahip bir kayıt grubundan yalnızca ilk kayıt görüntülenir.

Düzenli - indeks alanının değerlerine ve kayıtların ekranda görüntülenmesine herhangi bir kısıtlama getirmez. Dizin yalnızca kayıtların görüntülenme sırasını kontrol eder. Bu en popüler indeks türüdür.

Tablolar arasındaki ilişki anahtar adı verilen indeksler aracılığıyla gerçekleştirilir.

Oluşturulan indeks özel bir indeks dosyasında saklanır. Dizin dosyası yalnızca bir dizini saklıyorsa, buna tek dizin adı verilir ve .idx uzantısına sahiptir. Birçok dizini saklayan dizin dosyalarına çoklu dizin dosyaları denir ve .cdx uzantısına sahiptir. Çoklu indeksli bir dosyada saklanan her indekse etiket adı verilir. Her etiketin kendine özgü bir adı vardır.

İki tür çoklu indeksli dosya vardır: basitçe çoklu indeksli dosyalar (yukarıda açıklanmıştır) ve yapısal çoklu indeksli dosyalar. Yapısal çoklu indeksli bir dosya, ait olduğu tabloyla aynı adı taşır (tek fark, dosya uzantısındadır) ve aşağıdaki özelliklere sahiptir:

Kendi tablosuyla otomatik olarak açılır;

Kapatılamaz, ancak ana olanı yapılamaz.

Bir tabloda hem tek indeksli hem de çoklu indeksli birçok indeks dosyası bulunabilir. FoxPro'nun eski sürümleri Multi-Index dosyalarını kullanır.

Dizin Oluşturma

Dizin oluşturmanın iki yolu vardır.

A. Komutu kullanarak:

DİZİN AÇIK<индексное выражение>O< İDx dosyası> | ETİKET<имя тега>

Seçeneklerin amacı:

<dizin ifadesi>- endeksin oluşturulması gereken değerlere göre alanın (veya alanların) adı. Karmaşık bir dizin oluştururken alan adları + (artı) işaretiyle ayrılmış olarak listelenir. Karmaşık bir dizin şu şekilde oluşturulmuşsa:

Sayısal alanlar için dizin, alan değerlerinin toplamı temel alınarak oluşturulur;

Karakter alanları için indeks ilk önce birinci alanın değerine göre, birinci alanın tekrarlanan değerleri durumunda ise ikinci alanın değerlerine göre oluşturulur; birinci ve ikinci alanların değerleri tekrarlanıyorsa - üçüncü alanın değerlerine göre vb.;

Farklı türdeki alanlar için, önce alan değerleri tek bir türe, genellikle karaktere indirgenir ve ardından bir dizin oluşturulur.

İndeks ifadesinin uzunluğu 254 karakteri geçmemelidir.

O< İDx dosyası>- tek indeksli dosyanın adı belirtilir.

ETİKET<имя тега> - çoklu indeks dosyasındaki etiketin adını gösterir. Seçenek kullanılırsa, oluşturulan etiket belirtilen çoklu indeksli dosyaya yerleştirilir ve gerekli çoklu indeksli dosya eksikse, yapısal bir çoklu indeksli dosya oluşturulacaktır. Seçenek atlanırsa oluşturulan etiket geçerli çoklu dizin dosyasına yerleştirilecektir.

İÇİN<условие> - aşağıdaki şartları karşılayan tablo kayıtlarının indeksi için seçim modunu ayarlar:<условию>.

KOMPAKT- kompakt tek dizinli bir dosyanın oluşturulmasını kontrol eder. FoxPro'nun eski sürümleri bunu kullanmıyor.

AZALAN- dizini azalan sırada oluşturur. Varsayılan olarak dizin artan sırada (ARTAN) oluşturulur. Tek dizinli dosyalar için yalnızca artan sırada dizin oluşturabilirsiniz. INDEX ON... komutunu kullanmadan önce SET COLLATE komutunu verirseniz, azalan sırada tek dizinli bir dosya oluşturabilirsiniz.

EŞSİZ- benzersiz bir dizin oluşturur. Dizin alanı/alanları yinelenen değerler içeriyorsa yalnızca ilk kayıt dizine dahil edilecek ve geri kalan kayıtlar kullanılamayacaktır.

KATKI- yeni oluşturulan indeks dosyası, o anda açık olan indeks dosyalarını kapatmaz. Bu seçenek atlanırsa, yeni oluşturulan dizin dosyası önceden açık olan tüm dizin dosyalarını kapatır.

B. Ana Menüyü Kullanma:

Bu durumda indeks ya tablo oluşturulduğunda ya da tablo yapısı değiştirildiğinde oluşturulur. Bunu yapmak için Tablo Tasarımcısı iletişim panelinde Dizin sekmesini seçin (Şekil 3.1).

Her dizin Tablo Tasarımcısı iletişim kutusunda bir satırla tanımlanır.

Ad sütunu, çoklu dizin dosyasının etiket adını belirtir. Çoklu indeksli dosyalardan biri daha önce açılmışsa, yeni oluşturulan indeks açık çoklu indeksli dosyaya yerleştirilir. Dizin, bir tablo dosyasının oluşturulmasıyla eşzamanlı olarak oluşturulmuşsa veya tablo dosyasında çoklu dizin dosyaları yoksa, yeni oluşturulan dizin, otomatik olarak oluşturulan yapısal çoklu dizin dosyasına yerleştirilir.

Bir açılır listeyle donatılmış Ture sütunu, geçerli dizin türlerinden birini gösterir. Dizin bir veritabanının parçası olan bir tablo üzerine oluşturulmuşsa dört olası değer vardır: Birincil, Aday, Benzersiz ve Normal. Dizin boş bir tablo için oluşturulduysa Birincil değer açılır listede yer almaz.

İfade sütunu, dizin oluşturmak için değerlerinin kullanılması gereken alanların adlarını listeler. Karmaşık bir dizin oluşturuluyorsa, giriş alanının sağında bulunan düğmeye tıklanarak başlatılan ifade oluşturucuyu kullanmak daha uygundur.

Filtre sütununda mantıksal bir koşul ayarlayabilir ve tüm tablo kayıtları için değil, yalnızca filtre koşulunu karşılayan kayıtlar için bir dizin oluşturabilirsiniz. Bu grafik aynı zamanda bir ifade oluşturucuyla donatılmıştır. Her iki yapıcının içeriği ve görünümü aynıdır (Şekil 3.2).

İncirde. Şekil 3.2, iki karakter alanı olan ush_step ve uch_zvan (ekrandaki ifade oluşturucuyu çağırmadan önce uch etiket adı atanmıştır) kullanılarak karmaşık bir indeksin oluşturulmasını göstermektedir. Karmaşık bir indeksin oluşumunu gösteren "+" işareti String açılır listesinden alınmıştır.

Dize açılır menüsü geçerli dize işlevlerini listeler. Benzer şekilde Matematik, Mantıksal ve Tarih açılır listeleri geçerli matematik, mantıksal ve tarih işlevlerini listeler. Bu açılır listelerden istenilen fonksiyon farenin sol tuşuna basılarak seçilir. Alan adları (Alanlar listesi) ve değişken adları (Değişkenler listesi) farenin sol tuşuna çift tıklanarak seçilir. Ortaya çıkan ifade, İfade penceresine yerleştirilir.

Tablodan açılır listesi, dizini oluşturmak için alanların alındığı tablonun adını belirtir. İstenirse mevcut veritabanından herhangi bir tablo sipariş edilebilir ve herhangi bir alan alınarak indeks oluşturulabilir.

1) Endeks kavramı
Dizin bir veya daha fazla sütunun değerlerine göre tablo satırlarına hızlı erişim sağlayan bir araçtır.

Standartlar performans sorunlarını ele almadığından, standartlaştırılmadığından bu operatörde çok fazla çeşitlilik vardır.

2) Dizin oluşturma
DİZİN OLUŞTUR
AÇIK()

3) İndeksleri değiştirme ve silme
Endeksin aktivitesini kontrol etmek için operatör kullanılır:
DEĞİŞİKLİK ENDEKSİ
Bir dizini kaldırmak için operatörü kullanın:
DÜŞÜM ENDEKSİ

a) Tablo seçim kuralları
1. Satırların %5'inden fazlasının seçilmediği tabloların indekslenmesi tavsiye edilir.
2. SELECT ifadesinin WHERE yan tümcesinde kopyaları bulunmayan tablolar dizine eklenmelidir.
3. Sık güncellenen tabloların indekslenmesi pratik değildir.
4. Tam taraması daha uzun sürmediğinden, 2 sayfayı aşmayan tabloları indekslemek (Oracle için bu 300 satırdan azdır) uygun değildir.

b) Sütun seçim kuralları
1. Birincil ve yabancı anahtarlar - genellikle tabloları birleştirmek, veri almak ve arama yapmak için kullanılır. Bunlar her zaman maksimum faydaya sahip benzersiz dizinlerdir
2. Referans bütünlüğü seçeneklerini kullanırken her zaman FK'da bir dizine ihtiyacınız vardır.
3. Verilerin sıklıkla sıralandığı ve/veya gruplandırıldığı sütunlar.
4. SELECT ifadesinin WHERE yan tümcesinde sıklıkla aranan sütunlar.
5. Uzun açıklayıcı sütunlarda indeksler oluşturmamalısınız.

c) Bileşik endekslerin oluşturulmasına ilişkin esaslar
1. Bireysel sütunların az sayıda benzersiz değeri varsa, bileşik dizinler iyidir, ancak bileşik dizin daha fazla benzersizlik sağlar.
2. SELECT deyimiyle seçilen değerlerin tümü bileşik bir indekse aitse değerler indeksten seçilir.
3. WHERE cümlesi iki veya daha fazla değeri AND operatörüyle birleştirerek kullanıyorsa bileşik indeks oluşturulmalıdır.

d) Oluşturulması önerilmez.
Bileşik olanlar da dahil olmak üzere sütunlarda aşağıdaki dizinlerin oluşturulması önerilmez:
1. Sorgu sonuçlarını aramak, birleştirmek ve sıralamak için nadiren kullanılır.
2. Sık sık değişen değerler içerir, bu da indeksin sık sık güncellenmesini gerektirir, bu da veritabanının performansını yavaşlatır.
3. Az sayıda benzersiz değer (%10 m/f'den az) veya bir veya iki değere sahip baskın sayıda satır (tedarikçinin ikamet ettiği şehir Moskova'dır) içerir.
4. WHERE yan tümcesinde bunlara işlevler veya bir ifade uygulanır ve dizin çalışmaz.

e) Unutmamalıyız
Dizin sayısının çok olması veri güncelleme hızını düşürdüğü için dizin sayısını azaltmaya çalışmalısınız. Bu nedenle MS SQL Server, tablo başına en fazla 16 dizin oluşturulmasını önerir.
Tipik olarak dizinler, sorgulama amacıyla ve referans bütünlüğünü korumak için oluşturulur.
Eğer indeks sorgulama için kullanılmıyorsa silinmeli ve tetikleyiciler kullanılarak referans bütünlüğü sağlanmalıdır.

Oracle DBMS tablo satırlarına hızlı erişim sağlamak için indeksler kullanılır. Dizinler, nispeten az sayıda tablo satırı seçen işlemler sırasında verilere hızlı erişim sağlar.

Oracle bir tabloda sınırsız sayıda indekse izin vermesine rağmen indeksler yalnızca sorguları hızlandırmak için kullanıldığında faydalıdır. Aksi takdirde indekslenmiş sütunları güncellerken yalnızca yer kaplar ve sunucu performansını düşürürler. Sorgularınızda indekslerin nasıl kullanıldığını belirlemek için EXPLAIN PLAN (yürütme ve istatistik planı) özelliğini kullanmanız gerekir. Bazen dizin varsayılan olarak kullanılmıyorsa dizini kullanmak için sorgu ipuçlarını kullanabilirsiniz.


Tablo verilerini ekledikten sonra dizinler oluşturun

Genellikle dizin oluşturmadan önce bir tabloya veri ekler veya tabloya veri yüklersiniz. Aksi takdirde, indekslerin güncellenmesinin getirdiği ek yük, ekleme veya yükleme işlemlerini yavaşlatacaktır. Bu kuralın tek istisnası küme anahtarındaki dizindir. Yalnızca boş bir küme için oluşturulabilir.

Dizinler oluştururken boş alan sorunlarını önlemek için geçici tablo alanına geçin

Halihazırda veri içeren bir tabloda dizin oluştururken Oracle, sıralama için ek belleğe ihtiyaç duyar. Bu, dizin oluşturucuya tahsis edilen sıralama hafıza alanını kullanır (her kullanıcı için tahsis edilen miktar, SORT_AREA_SIZE başlatma parametresi tarafından ayarlanır), ayrıca Oracle sunucusu, indeks oluşturma sırasında tahsis edilen geçici segmentlerdeki bilgileri temizlemeli ve değiştirmelidir. Dizin çok büyükse aşağıdakileri yapmanız önerilir:

  1. CREATE TABLESPACE deyimini kullanarak yeni bir geçici tablo alanı oluşturun.
  2. Bu yeni geçici alanı ALTER USER ifadesinin TEMPORARY TABLESPACE parametresinde belirtin.
  3. CREATE INDEX deyimiyle bir dizin oluşturun.
  4. DROP TABLESPACE komutuyla bu tablo alanını bırakın. Daha sonra orijinal tablo alanını geçici olarak geri yüklemek için ALTER USER deyimini kullanın.

İndeksleme için doğru tabloları ve sütunları seçin

Ne zaman dizin oluşturulacağını belirlemek için aşağıdaki yönergeleri kullanın.

  1. Büyük bir tablodan sık sık nispeten az sayıda (%15'ten az) satır alıyorsanız bir dizin oluşturun. Bu yüzde büyük ölçüde tablo taramasının göreceli hızına ve satır verilerinin dizin anahtarında nasıl kümelendiğine bağlıdır. Tarama hızı ne kadar yüksek olursa yüzde o kadar düşük olur; satır verileri ne kadar kümelenirse yüzde o kadar yüksek olur.
  2. Birden çok tabloyu birleştirme performansını artırmak için birleştirmelerde kullanılan dizin sütunları.
  3. Dizinler, birincil ve benzersiz anahtarlara göre otomatik olarak oluşturulur.
  4. Küçük tabloların indekslenmesine gerek yoktur. Sorgu yürütme süresinin önemli ölçüde arttığını fark ederseniz, büyük olasılıkla büyümüştür.
Bazı sütunlar dizine ekleme için açık adaylardır. Aşağıdaki özelliklere sahiptirler:
  • sütundaki değerler nispeten benzersizdir;
  • geniş değer aralığı (normal indeksler için uygundur);
  • küçük değer aralığı (bit indeksleri için uygundur);
  • oldukça seyrek sütunlar (çok sayıda tanımsız, "boş" değer), ancak sorgular çoğunlukla anlamlı satırlarla ilgilidir. Bu durumda, boş olmayan tüm değerlerle eşleşen bir karşılaştırma tercih edilir:
    WHERE COL_X > -9,99 *kuvvet(10, 125) yerine
    NEREDE COL_X NULL DEĞİLDİR Bunun nedeni, ilk durumun COL_X dizinini kullanmasıdır (COL_X sütununun sayısal bir tür olduğu varsayılarak).

Tablo başına dizin sayısını sınırlayın

Ne kadar çok dizin olursa, bir tabloyu değiştirirken ek yük de o kadar yüksek olur. Satır eklendiğinde veya silindiğinde tablodaki tüm indeksler güncellenir. Bir sütun güncellendiğinde katıldığı tüm dizinlerin de güncellenmesi gerekir.

Dizinler söz konusu olduğunda, sorgular için performans kazanımları ile güncellemeler için performans cezalarını tartmanız gerekir. Örneğin, tablo öncelikle salt okunursa, dizinlerden kapsamlı bir şekilde yararlanabilirsiniz; ancak tablo sık sık güncelleniyorsa indeks kullanımının en aza indirilmesi tavsiye edilir.

Bileşik dizinlerdeki sütunların sırasını seçin

CREATE INDEX deyiminde sütunlar herhangi bir sırada belirtilebilse de, CREATE INDEX deyimindeki sütunların sırası sorgu performansını etkileyebilir. Genel olarak en sık kullanılacak sütunlar indekste ilk sıralarda yer alır. Dizinde yer alan tüm sütunları veya yalnızca bazılarını sorgulamak için kullanılabilecek bir bileşik dizin (birden çok sütun kullanarak) oluşturabilirsiniz.

Endekslerin doğru kullanımı için istatistik toplayın

Veritabanı sorgularda kullanılan tablolarla ilgili istatistikleri toplayıp muhafaza ederse dizinler daha etkili bir şekilde kullanılabilir. CREATE INDEX deyiminde COMPUTE STATISTICS anahtar sözcüğünü belirterek dizin oluşturma sırasında istatistik toplayabilirsiniz. Veriler sürekli güncellendiğinden ve değerlerin dağılımı değiştiğinden, istatistiklerin DBMS_STATS.GATHER_TABLE_STATISTICS ve DBMS_STATS.GATHER_SCHEMA_STATISTICS prosedürleri kullanılarak periyodik olarak güncellenmesi gerekir.

Gereksiz indeksleri yok edin

Aşağıdaki durumlarda indeks silinir:

  • dizin kullanmak sorgu performansını iyileştirmiyorsa. Bu durum, tablonun çok küçük olması veya tabloda çok sayıda satırın bulunması ancak bunlardan birkaçının dizin girişi olması durumunda ortaya çıkar;
  • teklif talepleriniz endeksi kullanmıyorsa;
  • indeks de yeniden oluşturulmadan önce bırakılırsa.
Bir indeks bırakıldığında indeks segmentinin tüm uzantıları ait oldukları tablo alanına döndürülür ve bu tablo alanındaki diğer nesnelerin kullanımına sunulur. İndeksler, oluşturuldukları tablo bozulduğunda otomatik olarak silinir.

Ve indeksler, bu özel arama tabloları, bir veritabanı arama motorunun veri alımını hızlandırmak için kullanabileceği. Basitçe söylemek gerekirse, indeks bir tablodaki verilere işaret eden bir işaretçidir. Veritabanındaki indeks kitabın arka kısmındaki indekse çok benzemektedir.

Örneğin, belirli bir konuyla ilgili bir kitaptaki tüm sayfalara bağlantı istiyorsanız, önce tüm konuları alfabetik sırayla listeleyen ve ardından bir veya daha fazla belirli sayfa numarasına atıfta bulunan dizine bakın.

Dizin sorguları ve cümleleri hızlandırmaya yardımcı olur ancak ifadelerle veri girişini yavaşlatır GÜNCELLEME Ve SOKMAK. İndeksler verileri etkilemeden oluşturulabilir veya silinebilir.

Dizin oluşturmak bir ifadeyi içerir DİZİN OLUŞTUR, tabloyu ve hangi sütun veya sütunların dizine ekleneceğini belirtmek ve dizinin artan mı yoksa azalan sırada mı olduğunu belirtmek için bir dizini adlandırmanıza olanak tanır.

Dizinler ayrıca sınırlamayla benzersiz olabilir EŞSİZ böylece dizin, üzerinde dizin bulunan bir sütunda veya sütun birleşiminde yinelenen girdileri önler.

CREATE INDEX komutu

Temel sözdizimi DİZİN OLUŞTUR aşağıdaki gibi:

CREATE INDEX indeks_adı ON tablo_adı;

Tek sütunlu dizinler

Tabloda yalnızca bir sütunda tek sütunlu dizin oluşturulur. Temel sözdizimi aşağıdaki gibidir.

CREATE INDEX indeks_adı ON tablo_adı(sütun_adı);

Benzersiz dizinler

Benzersiz indeksler yalnızca işlem için değil aynı zamanda veri bütünlüğünü sağlamak için de kullanılır. Benzersiz bir dizin, tabloya herhangi bir yinelenen değerin eklenmesine izin vermez. Temel sözdizimi aşağıdaki gibidir.

tablo_adı (sütun_adı) üzerinde EŞSİZ DİZİN indeks_adı OLUŞTURUN;

Bileşik Dizinler

Bileşik dizin, bir tablonun iki veya daha fazla sütunundaki dizindir. Temel sözdizimi aşağıdaki gibidir.

tablo_adı üzerinde CREATE INDEX indeks_adı(sütun1, sütun2);

Tek bir sütunda mı yoksa bileşik bir dizinde mi dizin oluşturduğunuzdan bağımsız olarak, filtre koşulu olarak WHERE sorgusunda çok sık kullanabileceğiniz sütunları dikkate alın.

Yalnızca bir sütun kullanılıyorsa, bir sütun üzerinde indeks seçilmelidir. WHERE yan tümcesinde filtre olarak sıklıkla kullanılan iki veya daha fazla sütun varsa bileşik dizin daha iyi bir seçim olacaktır.

Örtülü Dizinler

Örtülü dizinler, bir nesne oluşturulduğunda veritabanı sunucusunda otomatik olarak oluşturulan dizinlerdir. Dizinler, birincil anahtar ve benzersiz kısıtlamaya göre otomatik olarak oluşturulur.

DROP INDEX komutu

Dizin SQL komutu kullanılarak silinebilir DÜŞÜRMEK. Bir dizini silerken dikkatli olmalısınız çünkü performans daha yavaş veya daha iyi olabilir.

Temel sözdizimi aşağıdaki gibidir:

DROP INDEX dizin_adı;

İndekslerdeki bazı gerçek örnekleri görmek için INDEX kısıtlama örneğine bakabilirsiniz.

İndekslerden ne zaman kaçınmalısınız?

Dizinlerin amacı veritabanı performansını artırmak olsa da bunlardan kaçınılması gereken zamanlar vardır.

Aşağıdaki talimatlar dizin kullanımının ne zaman yeniden değerlendirilmesi gerektiğini gösterir.

  • Küçük tablolarda indeksler kullanılmamalıdır.
  • Sıklıkla büyük güncelleme veya ekleme işlemlerinin yapıldığı tablolar.
  • Çok sayıda null değer içeren sütunlarda dizinler kullanılmamalıdır.
  • Sıklıkla manipüle edilen sütunlar indekslenmemelidir.


 


Okumak:



Bilgisayar monitörünüzü lekelerden, tozdan ve çizgilerden nasıl temizlersiniz?

Bilgisayar monitörünüzü lekelerden, tozdan ve çizgilerden nasıl temizlersiniz?

Günümüzde gelişmiş ülkelerde hemen hemen her ailenin bir bilgisayarı bulunmaktadır. Herhangi bir bilgisayar ekipmanını kullanmanın rahatlığı derecesi...

Sistem nasıl geri yüklenir Sistem tarihe göre nasıl geri yüklenir

Sistem nasıl geri yüklenir Sistem tarihe göre nasıl geri yüklenir

Arkadaşlar, uzun zamandır düzenli okuyucularıma sistem kurtarma hakkında bir makale yazma sözü verdim. Birçoğumuz bu durumla zaten karşılaştık...

ATI Radeon ekran kartı sürücüsü nasıl güncellenir

ATI Radeon ekran kartı sürücüsü nasıl güncellenir

AMD Radeon Sürücüleri - Windows 7, 8, 10 işletim sistemleri için AMD çiplerini temel alan video kartlarına yönelik sürücüler. Sürücü özel bir hizmettir...

Oyun tam ekranda değil, küçük bir pencerede nasıl çalıştırılır?

Oyun tam ekranda değil, küçük bir pencerede nasıl çalıştırılır?

Elbette çoğu durumda her şey oyun endüstrisinin şaheserine bağlıdır. Ancak bazen nispeten yeni bir işletim sistemi suçlanabilir.

besleme resmi RSS