írta: Ben Snaidero
áttekintés
ebben a részben a nem fürtözött indexekkel kapcsolatos tudnivalókat ismertetjük.
mi a nem fürtözött index
a nem fürtözött index (vagy szabályos b-fa index) olyan index, ahol a sorok sorrendje nem egyezik meg a tényleges adatok fizikai sorrendjével. Ez helyettaz indexet alkotó oszlopok rendezik. Egy nem fürtözött indexben az index levéloldalai nem tartalmaznak tényleges adatokat,hanem a tényleges adatokat tartalmazzák. Ezek a mutatók arra a fürtözött indexadatlapra mutatnak, ahol a tényleges adatok léteznek (vagy a kupacoldalra, ha nincs fürtözött index a táblán).
miért hozzon létre nem fürtözött indexeket
a nem fürtözött index fő előnye az, hogy gyors hozzáférést biztosít az adatokhoz. Az index lehetővé teszi az adatbázismotor számára, hogy gyorsan megtalálja az adatokatanélkül, hogy át kellene szkennelnie az egész táblázatot. Ahogy egy táblázat nagyobb lesz, nagyon fontos, hogy a megfelelő indexeket hozzáadjuk a táblához, mivel anyindexek nélkül a lekérdezés teljesítménye drámaian csökken.
mikor kell létrehozni a nem fürtözött indexeket
két olyan eset van, amikor a nem fürtözött index egy asztalon előnyös. Először is, ha a táblához hozzáférő where clauseof lekérdezésekben egynél több oszlopkészlet van használatban. Egy második index (feltételezve, hogy az elsődleges kulcs oszlopon már van fürtözött index) felgyorsítja a végrehajtási időt, és csökkenti a többi lekérdezést. Másodszor, ha a lekérdezések gyakran igényelnek datato vissza kell adni egy bizonyos sorrendben, Miután egy index ezek az oszlopok csökkentheti themount CPU és a memória szükséges, mint a további válogatás nem kell tenni, mivel az adatok az index már megrendelt.
a következő példa azt mutatja, hogy az adatok lekéréséhez nincs szükség táblakeresésre, csak a nem clusteredindex indexkeresése, valamint a fürtözött index keresése az adatok lekéréséhez. Azt is vegye figyelembe, hogynincs szükség rendezésre, mivel az adatok már a megfelelő sorrendben vannak.
SELECT * FROM Sales.SalesOrderDetail WHERE ProductID = 750ORDER BY ProductID;
nem fürtözött index létrehozása
nem fürtözött index létrehozása alapvetően megegyezik a fürtözött index létrehozásával,de a clusteredclause megadása helyett megadjuk a clustered értéket. Ezt a záradékot teljesen elhagyhatjuk, mivel a nem fürtözött az alapértelmezett az index létrehozásakor.
az alábbi TSQL példát mutat az egyes utasításokra.
-- Adding non-clustered index CREATE NONCLUSTERED INDEX IX_Person_LastNameFirstName ON Person.Person(LastName ASC,FirstName ASC);CREATE INDEX IX_Person_FirstName ON Person.Person (FirstName ASC);
mi az a fedőindex
a Fedőindex egy olyan index, amely az összes (vagy több) oszlopból áll, amelyek szükségesek ahhoz, hogy kielégítsék a lekérdezést az index kulcsoszlopaként. Ha egy lefedő index használható egy lekérdezés végrehajtására, kevesebb IO műveletre van szükség, mivel az optimalizálónak már nem kell extra kereséseket végrehajtania a tényleges táblázatadatok lekéréséhez.
az alábbiakban bemutatunk egy példát a TSQL-re, amellyel létrehozhat egy fedőindexet a Terméktáblán.
CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC,ProductNumber ASC);
a következő TSQL lekérdezés most végre csak elérésével az új indexwe csak létre, mivel az összes oszlop a lekérdezés része az index.
SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';
a followingEXPLAIN terv megerősíti, hogy ehhez a lekérdezéshez nincs szükség extra keresésre.
mi az az index, amely tartalmazza az oszlopokat
a mellékelt oszlopokkal létrehozott index egy nem fürtözött index, amely nem kulcsos oszlopokat is tartalmaz az index levélcsomópontjaiban, hasonlóan a fürtözött indexhez. A mellékelt oszlopok használatának néhány előnye van. Először is ad nekedaz a képesség, hogy olyan oszloptípusokat tartalmazzon, amelyek nem engedélyezettek indexkulcsként az indexben. Továbbá, ha a lekérdezés összes oszlopa indexkulcs vagy oszlop, akkor a lekérdezésnek már nem kell extra keresést végeznie annak érdekében, hogy megkapja a lekérdezés kielégítéséhez szükséges összes adatot, amely kevesebb lemezműveletet eredményez. Ez hasonló a korábban említett fedezési indexhez.
a következő TSQL feletti példával ugyanazt az indexet hozza létre, kivéve a ProductNumber columnreferenced-et, mint included oszlopot, nem pedig indexkulcs oszlopot.
CREATE NONCLUSTERED INDEX IX_Production_ProductNumber_Name ON Production.Product (Name ASC) INCLUDE (ProductNumber);
a fenti lekérdezés használatával képesnek kell lennie arra is, hogy végrehajtsa anélkül, hogy bármilyen további keresést igényelne.
SELECT ProductNumber, Name FROM Production.Product WHERE Name = 'Cable Lock';
a followingEXPLAIN terv megerősíti, hogy ehhez a lekérdezéshez nincs szükség további keresésre.
nem fürtözött indexeka fürtözött indexhez viszonyítva
a fent leírtak szerint a fürtözött index a nem kulcsoszlopok tényleges adatait tárolja az index levélcsomópontjaiban. Az egyes nem clusteredindex levélcsomópontjai nem tartalmaznak adatokat, ehelyett mutatókkal rendelkeznek a fürtözött index tényleges adatoldalára(vagy levélcsomópontjára). Az alábbi ábra ezt illusztráljapont.
szűrt indexek
mi ez?
a szűrt index egy speciális indextípus, ahol a táblázat sorainak csak egy bizonyos részét indexelik. Az index létrehozásakor alkalmazott szűrési kritériumok alapján csak a fennmaradó sorok kerülnek indexelésre, amelyek helyet takaríthatnak meg, javíthatják a lekérdezés teljesítményét és csökkenthetik a karbantartási költségeket, mivel az index sokkal kisebb.
miért használja?
a szűrt indexek akkor hasznosak, ha olyan táblákon hoz létre indexeket, ahol bizonyos oszlopokban sok NULL érték van, vagy bizonyos oszlopokban nagyon alacsony a kardinalitásés gyakran alacsony frekvenciájú értéket kérdez.
hogyan lehet létrehozni?
a szűrt index egyszerűen úgy jön létre, hogy hozzáad egy WHERE záradékot bármely nem clusteredindex létrehozási utasításhoz. A következő TSQL egy példa a szintaxisraszűrt index létrehozása.
CREATE NONCLUSTERED INDEX IX_SalesOrderHeader_OrderDate_INC_ShipDate ON Sales.SalesOrderHeader(OrderDate ASC) WHERE ShipDate IS NULL;
erősítse meg az Index használatát
a következő lekérdezésnek az újonnan létrehozott indexünket kell használnia, mivel a táblázatban nagyon kevés a ShipDate NULL. Itt van a TSQL.
SELECT OrderDate FROM Sales.SalesOrderHeader WHERE ShipDate IS NULLORDER BY OrderDate ASC;