Létre kell hoznom egy nem fürtözött indexet az összes kereshető oszlopban, vagy csak az egyes oszlopokban külön-külön?
On február 15, 2021 by adminNem vagyok biztos benne, hogy megfelelően használom-e a nem fürtözött indexeket. Az SSMS-terv becslője azt mondta, hogy adjon hozzá még egy indexet, amikor a következő index már szerepel az asztalon.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
A lekérdezésem
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
A kérdésem az, hogy … létre kéne-e hozni egy indexet az összes lehetséges keresési kulcshoz? Különféle lekérdezésekben keresek mzone, iso és postai úton.
Köszönöm
Megjegyzések
- Minden oszlopot belefoglal a tábla?
- Igen, minden oszlopot belefoglalok.
- Az összes oszlop egyetlen indexbe foglalása nem sokat segít – egy ilyen index elsősorban a helyigényt duplázza meg, másodszor pedig csak az n bal oldali oszlophoz használható – NEM csak varázsütésre teszi gyorsabbá a táblázat 17. oszlopának keresését.
- És az egyes oszlopok külön indexe – csak azért, mert esetleg rákereshet valamikor – szintén nem túl jó. Az index valóban költséget jelent Önnek – az egyes betétek, frissítések és törlések teljesítményének szempontjából. Don ' t overindex – ez ' majdnem rosszabb, mint ha egyáltalán nincs indexe …
- Köszönöm a @marc_s észrevételeket, pontosan ezt az információt kerestem. Továbbá, helyénvaló-e azt mondani, hogy jó a nem fürtözött indexek tartománya (például 5-10 között van), vagy pusztán a táblázat igényeihez viszonyítva? Ha igen, mihez viszonyul?
Válasz
Az SQL Server mutatót mutat használni szeretné, mivel becslései szerint az index megkönnyíti az életet. Természetesen nincs szükség index létrehozására minden kereshető mezőben, valójában ez jelentősen rontja az írási teljesítményt. Ha mondjuk kevesebb, mint 5-10 index van az adott táblában, és ezt a lekérdezést folyamatosan futtatja, akkor valószínűleg pontosan úgy szeretné hozzáadni a javasolt indexet, mint az SSMS mutatja.
JNK szerkesztése az alábbiak szerint:
Fontos, hogy együtt nézzük meg a javasolt indexeket. A javaslatok úgymond silókban vannak, így egy teljes javasolt index helyettesíthető egy INCULDE
d mező hozzáadásával egy másik indexbe.
Például, lehet javaslatot tenni erre a két indexre:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Ha valójában mindkettő igényeit kielégítheti:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Láttam ezt sokkal bonyolultabb indexekkel (10-20 kulcsmező, 10-20 mellékelt mező), ahol egy mező hozzáadása a INCLUDE
list feleslegessé teszi a második index szükségességét.
Megjegyzések
- @MaxVernon: read Stairway to SQL Server Indexing – 1. rész, Bevezetés az indexekbe , majd a sorozat többi cikke – nagyjából mindent lefed az SQL Server indexekről, a bevezetőtől a haladó témákig
- @MaxVernon: vagy nézze meg a Index lefedése a mellékelt oszlopok használatával témakört e egy index ", amely lefedi a "
Válasz
Azért indokolja, hogy új indexet hozzon létre, mert az Ön indexe nem a lehető legoptimálisabb. A lekérdezés-optimalizáló meglehetősen szelektív módon választja ki, hogy melyik indexet használja, a következő link segít megérteni a szelektivitást:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Fentebb azt mondtad, hogy az összes oszlopot felvetted az indexbe – lényegében lemásolva a táblázat adatait. Ennek alapján mi lenne a kár, ha 3 külön indexet hozna létre az Ön által említett oszlopokon? A felhasznált hely kevesebb és a sebesség sokkal nagyobb lenne. Kitalálnék egy tippet, hogy a DTA / végrehajtási terv ezt mondja neked – csak más módon.
Nézze meg a végrehajtási terv részleteit, amelyeket a lekérdezés generál, hogy azonosítsa a palack nyakát, és ezt használja útmutatásként az indexek megtervezéséhez. Az SQL Server nagyon jól tudja tudni, mi a legjobb – bízz abban, amit mond neked.
Remélem, hogy ez segít.
Vélemény, hozzászólás?