Come combinare potenziali indici

voti
0

Alcuni codice indice mancante (vedi sotto) che ho ricevuto da ricerche su Internet sta elencando un sacco di potenziali indici mancanti per una particolare tabella. Letteralmente è dire che ho bisogno di 30 indici. Ho già avuto 8 prima di eseguire il codice. La maggior parte degli esperti affermano che una tabella dovrebbe media 5. Posso combinare una maggioranza di questi indici mancanti in modo che copra la maggior parte delle tavole rotanti esigenze?

Ad esempio: Questi due indici sono abbastanza simili che sembra che essi potrebbero essere combinati. Ma si può?

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])

Se li combino che sarebbe simile a questa:

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

NOTA: Ho appena preso la prima dichiarazione e ha aggiunto [SecRestOnly]ad esso.

DOMANDA: Sarebbe combinando questi rispondono entrambe le esigenze indice? E se no, come sarebbe un tavolo altamente utilizzato con un sacco di campi mai semplicemente avere 5 indici?

Ecco il codice utilizzato per ottenere indici mancanti:

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;```
È pubblicato 10/10/2019 alle 00:49
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

Il campione che hai dato non vi darà il risultato desiderato. L'indice su ([PatSample], [SecRestOnly]) ottimizzerà condizione di ricerca, ad esempio "PatSample = val1 e SecRestOnly = val2". L'indice combinato non perché ci sono altri segmenti tra le due colonne nella condizione di ricerca. La chiave per ricorda che è indice di multi-segmentato può essere utilizzato solo per ottimizzare multipla ricerca "uguaglianza" quando le colonne nella ricerca sono i segmenti consecutivi iniziali dell'indice.

Dato che, può essere motivata che si supponga di avere un indice su (col1, col2) e un altro su (col1, col2, col3), poi la prima non è necessario.

Quante indice per avere è un compromesso tra prestazioni di aggiornamento e le prestazioni di ricerca. Altro indice rallenta inserimento / aggiornamento / cancellazione, ma vi darà Query Optimizer di più opzioni per ottimizzare le ricerche. Dato il tuo esempio, la vostra applicazione richiede la ricerca su "SecRestOnly" di per sé spesso, se questo è il caso, sarebbe meglio avere un indice con "secRestOnly" da solo o come il primo segmento di un indice multi-segmento. Se la ricerca avviene raramente sulla colonna, allora può essere ragionevole non hanno tale indice.

Risposto il 10/10/2019 a 03:23
fonte dall'utente

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