Süzülmüş dizin tasarım yönergeleri
Süzülmüş bir dizin özellikle uygun iyi tanımlanmış alt küme küme küme veri seçtiğiniz kapak sorgularını en iyi duruma getirilmiş kümelenmemiş, dizinidir.Bir süzgeç yüklemi tablodaki satırların bir kısmını sıralamak için kullanır.Iyi tasarımlanmış bir süzülmüş dizin, performans, dizin bakım maliyetlerini düşürmek ve tam tablo dizinleri ile karşılaştırıldığında, dizin depolama maliyetini azaltır sorgu artırabilirsiniz.
Süzülmüş dizinleri tam tablo dizinleri göre aşağıdaki avantajları sağlar:
Gelişmiş bir sorgu performansı ve planı kalitesi
Iyi tasarımlanmış bir süzülmüş dizin sorgusu, bir tam-küçük olduğundan performans ve yürütme kalitesini planlamak artırır tablo kümelenmemiş dizin ve istatistikleri filtre.Bunlar yalnızca dizin Süzülen satırları kapsayacak süzülmüş istatistikleri tablo tam istatistikler'den daha doğru olur.
Bakım maliyetlerini düşük dizini
Dizin, dizin verileri, yalnızca veri işleme dili (DML) deyimleri etkiler, korunur.Süzülmüş bir dizin, bir tam-ile karşılaştırıldığında, dizin bakım maliyetlerini azaltır tablo kümelenmemiş daha küçük olduğundan ve dizin verileri etkilenen, yalnızca yönetilen dizin.Özellikle seyrek olarak etkilenen veri içerdiği zaman, süzülmüş dizinler, çok sayıda olması olasıdır.Benzer şekilde, süzülmüş bir dizin, yalnızca sık etkilenen veri içeriyorsa, dizin boyutunu daha küçük istatistikleri güncelleştirme maliyetini azaltır.
Daha fazla dizin depolama maliyetini
Bir tablo tam dizin gereklidir süzülmüş bir dizin oluşturmayı kümelenmemiş dizin için disk depolama alanı küçültebilirsiniz.Önemli ölçüde artırarak depolama gereksinimleri olmadan, bir tablo tam kümelenmemiş dizin ile birden çok filtre uygulanmış dizinleri değiştirebilirsiniz.
Tasarım konuları
Etkin süzülmüş dizinleri tasarlamak için uygulamanızın kullandığı hangi sorgular ve nasıl veri alt kümeleri için ilgili anlamak önemlidir.Bazı iyi tanımlanmış bir alt kümeleri olan veri sütunları çoğunlukla NULL değerleri, türdeş olmayan kategorileri değerleri içeren sütunlar ve sütun değerlerinin ayrı aralıklarıyla örnektir.Süzülmüş bir dizini tablo tam dizinler bir avantaj sağlayabilir, aşağıdaki tasarımları, çeşitli senaryolarda verin.
Verilerin alt kümeleri için süzülmüş dizinler
Sütun yalnızca az sayıda sorguları için ilgili değerleri varsa, değer alt küme küme süzülmüş bir dizin oluşturabilirsiniz.Örneğin, bir sütundaki değerleri çoğunlukla NULL ve sorguyu yalnızca NULL olmayan değerleri seçer, DEĞERSIZ olmayan veri satırlar için filtre uygulanmış bir dizin oluşturabilirsiniz.Sonuçta elde edilen dizin küçük olması ve daha az bir tablo tam kümelenmemiş dizin aynı anahtar sütunlarda tanımlanan daha korumak için maliyet.
Örneğin, AdventureWorks veritabanındaki Production.BillOfMaterials tablo 2679 satırlar var.NULL olmayan bir değer içeren satırları yalnızca 199 bitiştarihi sütun vardır ve NULL 2480 satırlar içerir.Süzülmüş aşağıdaki dizin, dizinde tanımlanan sütunları dönüp bitiştarihi için yalnızca NULL olmayan bir değer içeren satırları seçin, sorgularını ele.
USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIBillOfMaterialsWithEndDate'
AND object_id = OBJECT_ID (N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials
GO
CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL ;
GO
Süzülmüş dizin FIBillOfMaterialsWithEndDate, aşağıdaki sorgu için geçerlidir.Süzülmüş bir dizin sorgu iyileştiricisi tarafından kullanılan, belirlemek için sorgu yürütme planı görüntüleyebilirsiniz.Sorgu yürütme planı görüntüleme hakkında daha fazla bilgi için bkz: Bir sorgu çözümleniyor.
SELECT ProductAssemblyID, ComponentID, StartDate
FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL
AND ComponentID = 5
AND StartDate > '01/01/2008' ;
GO
Süzülmüş bir dizin oluşturmak ve süzülmüş dizin doðrulama ifade tanımlama hakkında daha fazla bilgi için bkz: INDIS (Transact-SQL) CREATE.
heterojen veri için süzülmüş dizinler
Bir tablo, heterojen veri satırları varsa, bir veya daha fazla veri kategorileri olan filtre uygulanmış bir dizin oluşturabilirsiniz.
Örneğin, ürünler, Production.Product içinde listelenen tablo sırayla Bisikletleri, Bileşenler, elbise veya Donatılar ürün kategorileri ile ilişkili bir Productsubcategoryıd için atanan öğeler her.Bu kategoriler türdeş olmayan olduklarından Production.Product tablosunda sütun değerlerine değil yakından correlated.Örneğin, renk, ReorderPoint ListPrice, ağırlık, sınıf ve stili, her ürün kategorisi için benzersiz özellikleri vardır.Alt kategorileri 27-36 olan Donatılar sorgularda sık olduğunu varsayalım.Donatılar kategorilerini göre süzülmüş bir dizin oluşturarak, Donatılar için'sorgu performansını artırabilirsiniz.
Aşağıdaki örnek Donatılar kategorilerini tüm ürünlerde süzülmüş bir dizin oluşturur Production.Product TABLO.
USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'FIProductAccessories'
AND object_id = OBJECT_ID ('Production.Product'))
DROP INDEX FIProductAccessories
ON Production.Product;
GO
CREATE NONCLUSTERED INDEX FIProductAccessories
ON Production.Product (ProductSubcategoryID, ListPrice)
Include (Name)
WHERE ProductSubcategoryID >= 27 AND ProductSubcategoryID <= 36;
GO
Süzülmüş dizin FIProductAccessories aşağıdaki sorguyu, sorgu sonuçlar, dizinde bulunan ve sorgu planını temel tablo arama dahil olduğundan kapsar.Örneğin, sorgu doğrulamasını ifade ProductSubcategoryID = 33 Süzülmüş bir dizin yüklemi alt küme küme küme kümesidir ProductSubcategoryID >= 27 ve ProductSubcategoryID <= 36, ProductSubcategoryID ve ListPrice Her iki anahtar sütunlarında bir dizin sorgu yüklemi sütunlarda; ad yaprak düzey dizinin içerdiği bir sütun olarak depolanır.
SELECT Name, ProductSubcategoryID, ListPrice
FROM Production.Product
WHERE ProductSubcategoryID = 33 AND ListPrice > 25.00 ;
GO
Görünümler ve.Süzülmüş dizinler
Bir sanal bir görünümüdür tablo, sorgu tanımını depolar; daha geniş bir amacı ve işlevleri farklı süzülmüş bir dizin varsa.Görünümler hakkında daha fazla bilgi için bkz: Anlama görünümler ve Görünümleri kullanma senaryoları. Aşağıdaki tablo bazı görünümlerde, süzülmüş dizinlerinin ile izin verilen işlevlerin karşılaştırır.
Deyimlerde izin |
Görünümler |
Süzülmüş dizinleri |
---|---|---|
Hesaplanan sütunlar |
Evet |
Hayır |
Birleştirmeler |
Evet |
Hayır |
Birden çok tablo |
Evet |
Hayır |
Basit bir karşılaştırma mantığı, yüklemi * |
Evet |
Evet |
Karmaşık mantığı, yüklemi ** |
Evet |
Hayır |
* Için basit bir karşılaştırma mantığı bir yüklemi, WHERE yan tümce sözdiziminde bakın. DİZİN OLUŞTURMA.
** Bir yüklemi, karmaşık karşılaştırma mantığı için WHERE yan tümce sözdizimi Bkz: SELECT.
Süzülmüş bir dizin, bir görünüm oluşturamazsınız.Ancak, sorgu iyileştiricisi, bir görünümde başvurulan bir tabloya tanımlanan süzülmüş bir dizinden yararlanabilirsiniz.Süzülmüş bir dizin, bir görünümden seçen sorgu için sorgu iyileştiricisi dikkate sorgu sonuçlar doğru olacaktır.Aşağıdaki örnek, bir görünüm 1 Nisan 2000 sonra başlangıç tarihlerini ve başlangıç tarihi 1 Ağustos 2000 sonra olan filtre uygulanmış bir dizin oluşturur.
Aşağıdaki örnekte, süzülmüş dizin ve süzülmüş görünüm içinde bulunan tüm 2000 büyük thanSeptember 1, sorgu seçer başlangıç tarihleri.Sorgu doğru sonuçlar içerdiğinden sorgu iyileştiricisi süzülmüş dizin FIBillOfMaterialsByStartDate dikkate alır.
SELECT StartDate, ComponentID FROM ViewOnBillOfMaterials
WHERE StartDate > '20000901';
GO
Sonraki örnekte, sorgu, görünüm, ancak süzülmüş dizin içinde bulunan tüm başlangıç tarihlerini 1 Haziran 2000 ' büyük seçer.Sorguyu sorgu görünümden seçtiğinde doğru sonuçlarla karşılaştırma süzülmüş dizini kullanarak farklı sonuçlar döndürebilir için sorgu iyileştiricisi süzülmüş dizin FIBillOfMaterialsByStartDate dikkate almaz.
SELECT StartDate, ComponentID FROM ViewOnBillOfMaterials
WHERE StartDate > '20000601';
GO
Dizin oluşturulmuş görünümler ve.Süzülmüş dizinler
Süzülmüş dizinleri, dizin oluşturulmuş görünümler göre aşağıdaki avantajları vardır:
Dizin bakım maliyetlerini düşürür.Örneğin, query processor, dizinli görünüm göre süzülmüş bir dizini güncelleştirmek için daha az CPU kaynaklarını kullanır.
Geliştirilmiş planı kalitesi.Örneğin, sorgu derlenirken eşdeğer dizinlenmiş görünümün'den daha fazla durumlarda süzülmüş bir dizini kullanarak sorgu iyileştiricisi dikkate alır.
Çevrimiçi bir dizin oluşturur.Sorgularda kullanılabilir oldukları sırada süzülmüş dizinleri yeniden oluşturabilirsiniz.Dizin oluşturulmuş görünümler için çevrimiçi dizin rebuilds desteklenmiyor.Daha fazla bilgi için bkz: için REBUILD seçeneği ALTER INDIS (Transact-SQL).
Benzersiz olmayan dizinler.Dizin oluşturulmuş görünümler, benzersiz olmalıdır; oysa süzülmüş dizinler benzersiz olmayan, olabilir.
Yukarıdaki nedeniyle, dizinli görünüm yerine mümkün olduğunda filtre uygulanmış bir dizin'i kullanmanız önerilir.Aşağıdaki koşullar karşılandığında süzülmüş bir dizin, dizinli görünüm yerine kullanmak mümkündür: yalnızca bir tablo görünüme başvuruyor, sorguları hesaplanan sütunlar döndürür ve görünümü yüklemi basit karşılaştırma mantığı kullanır. LIKE işlecini içerdiğinden, aşağıdaki ifade doðrulama süzülmüş dizin değildir, ancak bir görünüm tanımıyla izin verilir.
WHERE StartDate > '20000701' AND ModifiedDate LIKE 'E%'
Anahtar sütunlar
Süzülmüş bir dizini tanımındaki ve süzülmüş dizin için sorgu yürütme planı seçmek sorgu iyileştiricisi için gerekli olan sütunlar eklemek için sütun dahil veya az sayıda anahtar eklemek için iyi bir uygulamadır.Süzülmüş bir dizin olup yapar veya sorgu kapsamaz ne olursa olsun sorgu, sorgu iyileştiricisi seçebilirsiniz.Ancak, sorgu iyileştiricisi sorgu kapsıyorsa, süzülmüş bir dizin seçmek daha olasıdır.Sorgu kapsayan hakkında daha fazla bilgi için bkz: Içerilen sütunlar ile dizinleri oluşturma.
Bazı durumlarda, süzülmüş bir dizin sorgu süzülmüş dizin içinde sütunlar eklemeden kapsayan ifade süzülmüş dizini tanımında anahtar veya eklenen sütunlar.Aşağıdaki yönergelere bir sütun, filtre uygulanmış dizinde açıklayan ifade süzülmüş dizini tanımında sütun dahil ya da anahtar olmalıdır.Örnekler, daha önce oluşturulan FIBillOfMaterialsWithEndDate süzülmüş dizinine bakın.
Süzülmüş dizin ifadede BIR sütun, anahtar olması gerekmez veya sütun filtre uygulanmış dizini tanımında süzülmüş dizin ifade için sorgu yüklemi eşdeğerdir ve sorguyu sorgu sonuçlar ile süzülmüş dizin ifadesi içindeki sütun döndürmüyor dahil.Örneğin, FIBillOfMaterialsWithEndDate aşağıdaki sorguyu Sorgu yüklemi için süzgeç ifadesi eşdeğerdir ve bitiştarihi sorgu sonuçlarıyla birlikte döndürülür kapsar.FIBillOfMaterialsWithEndDate anahtar olarak bitiştarihi gerekir ya da sütun filtre uygulanmış dizini tanımında dahil.
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO
Bir sütuna filtre uygulanmış dizin ifade anahtar olmalıdır veya sorgu yüklemi, sütun süzülmüş dizine eşdeğer olmayan bir karşılaştırma kullanıyorsa, sütun süzülmüş dizini tanımında dahil ifade.Örneğin, süzülmüş dizinden satırların alt küme küme küme kümesini seçer, çünkü FIBillOfMaterialsWithEndDate aşağıdaki sorgu için geçerlidir.Ancak, aşağıdaki sorgu çünkü kapsamaz EndDate Karşılaştırmada kullanılan EndDate > '20000101', süzülmüş dizin ifade eşdeğeri değildir. Query processor değerleri, arama olmadan, bu sorgu yürütülemiyor EndDate. Bu nedenle, EndDate sütun filtre uygulanmış dizini tanımında dahil ya da anahtar olmalıdır.
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate > '20000101';
GO
Bir sütuna filtre uygulanmış dizin ifade sütunu sorgu sonucu olarak ayarlanmışsa, süzülmüş dizini tanımındaki bir sütun dahil ya da anahtar olmalıdır.Bunu döndürdüğünden, FIBillOfMaterialsWithEndDate aşağıdaki sorgu kapsamaz EndDate Sorguda sütun sonuçlar. Bu nedenle, EndDate sütun filtre uygulanmış dizini tanımında dahil ya da anahtar olmalıdır.
SELECT ComponentID, StartDate, EndDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO
birincil anahtar tablo süzülmüş dizini tanımındaki bir sütun anahtar ya da dahil olması gerekmez.Birincil anahtar, süzülmüş dizinler dahil olmak üzere tüm kümelenmemiş dizin içinde otomatik olarak eklenir.
Süzgeç doğrulama de veri dönüştürme işleçleri
Karşılaştırma işleç süzülmüş dizinde belirtildiği takdirde ifade süzülmüş dizin sonuçlarında bir örtülü veya açık bir veri dönüştürme, dönüştürme, karşılaştırma işleçnin sol tarafındaki oluşursa bir hata oluşacaktır.Çözüm, süzülmüş dizin yazmaktır ifade veri dönüştürme işleç (CONVERT veya CAST) karşılaştırma işleçnin sağ tarafındaki ile.
Aşağıdaki örnek, çeşitli veri türleri bir tablo oluşturur.
Dizin tanımı için aşağıdaki filtre sütun b örtülü olarak, sabit değer 1'Karşılaştırma amacıyla, bir tamsayı veri türüne dönüştürülür. Dönüştürme sol tarafında oluştuğundan, bu hata iletisini 10611 oluşturur işleç süzülmüş yüklemi.
USE AdventureWorks;
GO
IF EXISTS ( SELECT name from sys.indexes
WHERE name = N'TestTabIndex'
AND object_id = OBJECT_ID (N'dbo.TestTable'))
DROP INDEX TestTabIndex on dbo.TestTable
GO
CREATE NONCLUSTERED INDEX TestTabIndex ON dbo.TestTable(a,b)
WHERE b = 1;
GO
Sabit sütun ile aynı türde olması için sağ tarafı üzerinde dönüştürmek çözümdür b, aşağıdaki örnekte görüldüğü gibi:
CREATE INDEX TestTabIndex ON dbo.TestTable(a,b)
WHERE b = CONVERT(Varbinary(4), 1);
GO
Veri dönüştürme sol tarafındaki sağ tarafında bir Karşılaştırma işlecinin taşıma dönüştürme anlamı değişebilir.CONVERT işleç sağ tarafa eklendiğinde Yukarıdaki örnekte, arasında bir tamsayı karşılaştırma karşılaştırma değiştirilen bir varbinary karşılaştırma.
Başvuru bağımlılıklar
The sys.sql_expression_dependencies catalog view tracks each sütun in the filtered index ifade as a referencing dependency.Edemiyor bırakma, yeniden adlandırmak veya filtre uygulanmış bir dizinde tanımlanan bir sütununu tanımını değiştirmek ifade.
Filtre uygulanmış bir ındexes kullanılacağı durumlar
Süzülmüş bir dizin, iyi tanımlanmış SELECT deyimlerinin sorgu başvuru veri alt kümelerine sütunları içeren olduğunda yararlıdır.Örnekler:
Yalnızca birkaç DEĞERSIZ olmayan değerler içeren sparse sütunlar.
Veri kategorileri içeren türdeş olmayan sütunlar.
Tutarları, saat ve tarih gibi değerleri aralığı içeren sütunlar.
Tablo bölümleri sütun değerleri için basit bir karşılaştırma mantığı ile tanımlanır.
Dizin içindeki satır sayısını bir tablo tam dizin karşılaştırıldığında küçük olduğunda daha az bakım süzülmüş dizinler için en fark maliyetlerdir.Süzülmüş dizin, tablodaki satırların çoğunu içerir, bir tablo tam dizin korumak için daha fazla maliyet.Bu durumda, süzülmüş bir dizin yerine bir tam tablo dizini kullanmalısınız.
Süzülmüş dizinler üzerinde tanımlanır tablo ve yalnızca basit karşılaştırma işleçleri desteklemez.Bir süzgeç ifadesi birden çok tablo başvuruları veya karmaşık mantığına gereksinim duyarsanız, bir görünüm oluşturmanız gerekir.
Süzülmüş dizin özellik desteği
Genel olarak, Database Engine ve araçları, süzülmüş dizinlerin kümelenmemiş dizin özel bir tür olarak belirleneceğine karar tam tablolu kümelenmemiş dizin sağlar, süzülmüş dizinler için aynı destek sağlar. Aşağıdaki liste, Araçlar ve özellikler tam olarak destekleyen, desteklemez veya filtre uygulanmış dizinler için destek sınırlandırmış hakkında notlar sağlar.
INDIS ALTER süzülmüş dizinleri destekler.Süzülmüş bir dizin ifade değiştirmek için , CREATE INDEX ILE DROP_EXISTING Ek Yardım düğmesini kullanın.
Eksik dizin özelliği süzülmüş dizinleri önerin.
The Database Engine Tuning Advisor considers filtered indexes when recommending index tuning advice and can recommend an is not null filtered index.
Çevrimiçi bir dizin işlemleri, süzülmüş dizinleri desteklemez.
Tablo ipuçları, süzülmüş dizinleri desteklemez, ancak olmayan süzülmüş dizinler için geçerli olmayan bazı sınırlamalar vardır.Bu durum aşağıdaki bölümde açıklanmıştır.
Sorgu konuları
Sorgu aynı olan ve olmayan süzülmüş dizini kullanarak sonuçlar işaretlerse, sorgu iyileştiricisi süzülmüş bir dizin kullanabilirsiniz.Süzülmüş dizin FIBillOfMaterialsWithEndDate daha önce açıklanan, aşağıdaki iki sorgular için geçerlidir.Ilk örnekte, sorgu doğrulamasını süzülmüş dizin yüklemi, tam olarak eşleşen olur. WHERE EndDate IS NOT NULL. Dizin içindeki satırların alt küme küme küme kümesini içerdiği ikinci örnekte, sorgu doğrulamasını süzgeç yüklemi daha fazla seçici çünkü.
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL;
GO
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate < '20000701';
GO
Sonraki sorgu FIBillOfMaterialsWithEndDate de kullanılabilir.Ancak, en iyi duruma getiricisi süzülmüş dizin sorguyu Sorgu yüklemi selectivity ilgili olarak gibi maliyet belirleyen diğer etkenler nedeniyle seçebilirsiniz değil.Aşağıdaki örnekte gösterildiği gibi bir sorgu ipucu olarak kullanarak filtre uygulanmış bir dizin seçmek için en iyi duruma getiricisi zorlayabilir.
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WITH ( INDEX ( FIBillOfMaterialsWithEndDate ) )
WHERE EndDate IN ('20000825', '20000908', '20000918');
GO
Sorgu, süzülmüş dizinde olmayan satırları döndürebilir, sorgu iyileştiricisi süzülmüş bir dizin kullanmayacaktır.NULL olan bir satır dönmek sorgu olası olduğundan, sorgu iyileştiricisi FIBillOfMaterialsWithEndDate için aşağıdaki sorgu dikkate alacaktır. EndDate boş olmayan ve ModifiedDate, yalnızca NULL olmayan değerler için bitiştarihi içerdiğinden, FIBillOfMaterialsWithEndDate içinde olamaz.
SELECT ComponentID, StartDate FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL OR ModifiedDate IS NOT NULL;
GO
Süzülmüş bir dizini tablo ipucu olarak açıkça kullanılır ve tüm sorgu süzülmüş dizin içermeyebilir sonuçlar, sorgu iyileştiricisi sorgu derleme hatası 8622 oluşturur.Aşağıdaki örnekte, çünkü hata 8622 sorgu iyileştiricisi yapılandırmayı oluşturur. FIBillOfMaterialsWithEndDate Sorgu ve açıkça kullanıldığı için bir dizin ipucu geçerli değil:
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
WITH ( INDEX ( FIBillOfMaterialsWithEndDate ) )
WHERE EndDate IS NOT NULL OR ModifiedDate IS NOT NULL;
GO
Parametreli sorgular
Bazı durumlarda, parametreli hale getirilmiş bir sorguya derleme saat süzülmüş bir dizin seçmek sorgu iyileştiricisi için yeterli bilgi içermiyor.Eksik bilgiler sağlamak için sorguyu yeniden mümkün olabilir.Aşağıdaki örnekte, sorgu iyileştiricisi süzülmüş dizin dikkate almaz FIBillOfMaterialsWithComponentID deyim için için parametre değerleri için @p ve @q derleme zamanında bilinmiyor. Sorgu örneği SHOWPLAN_XML çıktıda parametreleştirilmiş sorguları için süzülmüş eşleşmeyen dizinleri görüntülemek için AÇıK ayarlayarak SHOWPLAN_XML çalışır.
The UnmatchedIndexes element and Parameterization subelement in the SHOWPLAN_XML output indicate that the filtered index was not a match for the query.SHOWPLAN_XML çıktısını görüntüleme hakkında daha fazla bilgi için bkz: XML Showplans.
Çözümü, sorguyu düzeltmektir böylece sorguyu sonuçlar parametreli hale getirilmiş bir ifade, alt küme küme küme kümesini süzgeç yüklemi olmadığı zaman boştur.Aşağıdaki sorgu, bu değişikliği gösterir.Ekleyerek ComponentID in (533, 324, 753) ifade için WHERE yan tümce, sorgunun sonuçlarını alt küme küme küme kümesini süzülmüş doðrulama ifade olmasını garanti altına alınmıştır. Bu değişikliği, süzülmüş dizini FIBillOfMaterialsWithComponentID aşağıdaki sorgu iyileştiricisi düşünebilirsiniz. SELECT deyim.
USE AdventureWorks;
GO
SET SHOWPLAN_XML ON;
GO
DECLARE @p AS INT, @q AS INT;
SET @p = 533;
SET @q = 324;
SELECT StartDate, ComponentID FROM Production.BillOfMaterials
WHERE ComponentID in (533, 324, 753)
AND (ComponentID = @p OR ComponentID = @q);
GO
SET SHOWPLAN_XML OFF;
GO
Basit Parameterization
Çoğu durumda, sorgu iyileştiricisi ("otomatik-parameterization" denir, basit parameterization gerçekleştiremeyecek SQL Server 2005) sorgu planını süzülmüş bir dizin varsa, sorguda. Böylece, süzülmüş dizin sorgu sonuçlar için doğruluğunu garanti etmez basit parameterization gibi sorguları gerçekleştirmek olası parametre değerleri aralık genişletebilirsiniz.Örneğin, SELECT deyiminin WHERE yan tümce karşılaştırma süzülmüş bir dizin belirtimi içinde kullanılan bir sütun kullanır, bu sorgu kaldıracağınızı olasıdır, çünkü filtre uygulanmış bir dizin içerir, sorgu iyileştiricisi için basit parameterization getirmeyebilir.
Süzülmüş dizin emin olmak için bu bölümde anlatılan yönergeleri kullanarak, uygun durumlarda, sorgu tarafından tekrar parameterize olanağınız olabilir, sorguyu kapsayacaktır.
Anahtar aramaları sorgularla
Bu sorgu, süzülmüş dizin kapak yok kalan sütunları almak için bir anahtar arama yaparak kapsamaz karşın sorgu iyileştiricisi süzülmüş bir dizin kullanabilirsiniz.Anahtar aramalar hakkında daha fazla bilgi için bkz: Arama gösterim planı işleç anahtar. sorgu iyileştiricisi, anahtar arama tahmini sayısı küçük ise, bu yaklaşım seçebilirsiniz.Aşağıdaki sorguyu, sorgu işlemci kullanmaya zorlamak için bir dizin ipucu kullanır. FIBillOfMaterialsWithEndDate aramalar için yer işareti ile EndDate. Anahtar arama oluşur EndDate > @date Sorgu yüklemi Karşılaştırmada.
USE AdventureWorks;
GO
DECLARE @date AS DATE;
SET @date = '20000825'
SELECT ComponentID, StartDate, EndDate FROM Production.BillOfMaterials
WITH ( INDEX (FIBillOfMaterialsWithEndDate) )
WHERE EndDate > @date;
GO
Dikkat EndDate > @Date Süzülmüş bir dizin ifadesi ile tam bir eşleşme değil EndDate IS NOT NULL. Süzülmüş dizin bu parametreli hale getirilmiş bir sorguya için hala geçerli olduğundan, süzülmüş dizin ifade tarafından tanımlanmış satırların alt küme küme küme kümesini döndürür.
See Also