Jak spojit potenciální indexy

hlasů
0

Kód „Chybí index“ (viz níže), jsem dostal od vyhledávání na internetu je výpis spoustu potenciálních chybějících indexů pro konkrétní tabulky. Doslova říká, že musím 30 indexy. Už jsem měl 8 před spuštěním kódu. Většina odborníků se uvádí, že tabulka by měla v průměru 5. Mohu kombinovat většinu těchto chybějících indexy tak, že pokrývá většinu tabulek indexování potřeby?

Například: Tyto dva indexy jsou natolik podobné, že se zdá, jako by mohly být kombinovány. Ale mohou?

CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable] ([PatSample], [StatusID], [Sub1Sample]) INCLUDE ([PatID], [ProgID], [CQINumber])


CREATE INDEX [NCI_2535_2534] ON [DB].[dbo].[someTable] ([PatSample], [SecRestOnly]) INCLUDE ([CQINumber])

Mám-li zkombinovat to by vypadat takto:

CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable] ([PatSample], [StatusID], [Sub1Sample], [SecRestOnly]) INCLUDE ([PatID], [ProgID], [CQINumber])

POZNÁMKA: Jen jsem vzal první příkaz a přidal [SecRestOnly]k tomu.

OTÁZKA: Bude kombinovat tyto uspokojí jak potřeby indexu? A pokud ne, jak by se velmi používá stůl se spoustou polí někdy stačí 5 indexy?

Zde je kód používaný k získání „chybějící indexy“:

SELECT
   migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, LEFT (PARSENAME(mid.STATEMENT, 1), 32) as TableName,
  'CREATE INDEX [NCI_' + CONVERT (VARCHAR, mig.index_group_handle) + '_' + CONVERT (VARCHAR, mid.index_handle)
  + '_' + LEFT (PARSENAME(mid.STATEMENT, 1), 32) + ']'
  + ' ON ' + mid.STATEMENT
  + ' (' + ISNULL (mid.equality_columns,'')
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END
    + ISNULL (mid.inequality_columns, '')
  + ')'
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
  migs.*, mid.database_id, mid.[object_id]
FROM [sys].dm_db_missing_index_groups mig
INNER JOIN [sys].dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN [sys].dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC;```
Položena 10/10/2019 v 00:49
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Vzorek vám dal vám nedává požadovaný výsledek. Index na ([PatSample], [SecRestOnly]) bude optimalizovat vyhledávací podmínku, jako je "PatSample = val1 a SecRestOnly = val2". Kombinovaný index nebude, protože existují i ​​jiné segmenty mezi dvěma sloupy ve stavu vyhledávání. Klíčem k pamatuje je, že multi-segmentový index lze použít pouze pro optimalizaci více „rovnosti“ vyhledávání, kdy sloupce v hledání jsou počáteční po sobě jdoucí segmenty indexu.

Vzhledem k tomu, že může být odůvodněno, že předpokládám, že máte jeden index (col1, col2) a další na (col1, col2, col3), pak není potřeba bývalý.

Kolik index mít představuje kompromis mezi výkonem a výkonem v aktualizacích vyhledávání. Více index zpomalí insert / update / smazat, ale dá optimalizace dotazů více možností, jak optimalizovat vyhledávání. Vzhledem k tomu, váš příklad, vaše aplikace vyžaduje vyhledávání na „SecRestOnly“ sama o sobě často, je-li to ten případ, že by bylo lepší mít index s „secRestOnly“ sám o sobě nebo jako první segment index multi-segmentu. Pokud hledání je zřídka provádí na sloupci, pak to může být rozumné, že nebude mít takový index.

Odpovězeno 10/10/2019 v 03:23
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more