Mám vytvořit nehrnutý index na všech prohledávatelných sloupcích nebo jen na každém sloupci zvlášť?
On 15 února, 2021 by adminNejsem si jistý, zda správně používat seskupené indexy. Odhadovač plánu SSMS řekl, že přidá další index, když už byl v tabulce následující index.
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] )
Můj dotaz byl
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Moje otázka zní … mám vytvořit index pro všechny možné vyhledávací klíče? Hledám podle mzone, iso a postal v různých dotazech.
Díky
Komentáře
- Zahrnujete každý sloupec z tabulka?
- Ano, zahrnuji každý sloupec.
- Zahrnutí všech sloupců do jednoho indexu moc nepomůže – takový index nejprve v zásadě zdvojnásobí prostorové požadavky, a za druhé, lze jej použít jen pro n sloupců nejvíce vlevo – NE jen magicky zrychluje vyhledávání 17. sloupce v tabulce.
- A mít samostatný index pro každý sloupec – jen proto, že ho můžete někdy hledat – také není moc dobrý. Index vás stojí – z hlediska výkonu při každém vložení, aktualizaci, smazání. Nepoužívejte ' t nadindexovat – to ' je téměř horší, než mít vůbec žádné indexy ….
- Děkuji za tyto komentáře @marc_s, to je přesně ta informace, kterou jsem hledal. Je také vhodné říci, že existuje dobrá řada neseskupených indexů (například mezi 5–10), nebo je to čistě relativní vzhledem k potřebám tabulky? Pokud ano, s jakými věcmi to souvisí?
Odpověď
SQL Server vám zobrazí index chtělo by to použít, protože odhaduje, že index by usnadnil život. Určitě není třeba vytvářet index na každém prohledávatelném poli, ve skutečnosti to podstatně zhorší výkon zápisu. Pokud máte v dané tabulce méně než řekněme 5 až 10 indexů a tento dotaz spouštíte stále, pravděpodobně budete chtít přidat navrhovaný index přesně tak, jak to ukazuje SSMS.
Úpravy JNK Níže
Je také důležité podívat se společně na doporučené indexy. Návrhy jsou takříkajíc v silách, takže jeden celý navrhovaný index lze nahradit přidáním INCULDE
d pole do jiného indexu.
Například je možné mít návrhy pro tyto dva indexy:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Ve skutečnosti byste mohli vyhovět potřebám obou s:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Viděl jsem to s mnohem komplikovanějšími indexy (10-20 klíčových polí, 10-20 zahrnutých polí), kde přidání jednoho pole do INCLUDE
eliminuje potřebu druhého indexu.
Komentáře
- @MaxVernon: read Stairway to SQL Server Indexing – Part 1, Introduction to Indexes and then the rest of the articles in the series – covers almost much everything about SQL Server indexes, from intro to advanced topics
- @MaxVernon: nebo si přečtěte Krycí rejstřík pomocí zahrnutých sloupců , kde můžete diskutovat o zahrnutých sloupcích e index " zahrnující "
odpověď
Důvodem, proč vám říká, abyste vytvořili nový index, je ten, že ten, který máte, není ten nejoptimálnější možný. Optimalizátor dotazů je docela selektivní ve způsobu, jakým zvolí, který index se má použít, následující odkaz by vám měl pomoci porozumět selektivitě:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Výše jste řekl, že jste do indexu zahrnuli všechny sloupce – což v podstatě duplikuje data tabulky. Na základě čeho by byla škoda při vytváření 3 samostatných indexů ve sloupcích, které zmiňujete? Použitý prostor by byl menší a rychlost by byla mnohem rychlejší. Chtěl bych riskovat hádku, že to vám říká plán DTA / provedení – jen jiným způsobem.
Podívejte se na podrobnosti plánu provádění, které jsou generovány dotazem, abyste zjistili, kde jsou hrdla lahví, a použijte to jako vodítko, jak navrhnout vaše indexy. SQL Server umí dobře vědět, co je nejlepší – důvěřujte tomu, co vám říká.
Doufám, že vám to pomůže.
Napsat komentář