Devo creare un indice non cluster su tutte le colonne ricercabili o solo su ciascuna colonna separatamente?
Su Febbraio 15, 2021 da adminNon sono sicuro di utilizzare correttamente gli indici non cluster. Lo stimatore del piano SSMS ha detto di aggiungere un altro indice quando il seguente indice era già sul tavolo.
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] )
La mia query era
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
La mia domanda è … dovrei creare un indice per tutte le possibili chiavi di ricerca? Cerco per mzone, iso e postale in query diverse.
Grazie
Commenti
- Stai includendo tutte le colonne di la tabella?
- Sì, includo ogni colonna.
- Includere tutte le colonne in un singolo indice non aiuterà molto: un tale indice prima di tutto fondamentalmente raddoppia i requisiti di spazio, e in secondo luogo, può essere utilizzato solo per le n colonne più a sinistra: NON semplicemente rende magicamente più rapida la ricerca della diciassettesima colonna nella tabella.
- E avere un un indice separato per ogni colonna, solo perché potresti cercarlo un giorno, non è molto buono. Un indice ti costa – in termini di prestazioni su ogni inserimento, aggiornamento, cancellazione. Non ' overindex – che ' è quasi peggio che non avere alcun indice ….
- Grazie per quei commenti @marc_s, che sono esattamente le informazioni che stavo cercando. Inoltre, è appropriato dire che cè una buona gamma di indici non cluster da avere (tra 5-10 per esempio) o è puramente relativo alle esigenze della tabella? In tal caso, a che tipo di cose è relativo?
Risposta
SQL Server ti mostrerà un indice vorrebbe usare, poiché stima che lindice renderebbe la vita più facile. Non è certamente necessario creare un indice su ogni campo ricercabile, infatti così facendo si peggiorano notevolmente le prestazioni in scrittura. Se hai meno di dire da 5 a 10 indici sulla tabella data ed esegui quella query tutto il tempo, probabilmente vorrai aggiungere lindice suggerito esattamente come lo mostra SSMS.
JNK” s Modifica sotto
È anche importante esaminare insieme gli indici suggeriti. I suggerimenti sono tutti in silos, per così dire, quindi un intero indice suggerito potrebbe essere sostituito aggiungendo un campo INCULDE
d su un altro indice.
Ad esempio, è possibile avere suggerimenti per questi due indici:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Quando in effetti potresti soddisfare le esigenze di entrambi con:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Lho “visto con indici molto più complicati (10-20 campi chiave, 10-20 inclusi) dove si aggiunge un campo al INCLUDE
eliminerà la necessità del secondo indice.
Commenti
- @MaxVernon: read Stairway to SQL Server Indexing – Part 1, Introduction to Indexes e poi il resto degli articoli della serie – copre praticamente tutto ciò che riguarda gli indici di SQL Server, dallintroduzione agli argomenti avanzati
- @MaxVernon: oppure vedi Indice di copertura utilizzando colonne incluse per una discussione sulle colonne incluse da creare e un indice " che copre "
Risposta
Il motivo per cui ti sta dicendo di creare un nuovo indice è perché quello che hai non è il più ottimale possibile. Query Optimizer è abbastanza selettivo nel modo in cui sceglie quale indice utilizzare, il seguente link dovrebbe aiutarti a comprendere la selettività:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Hai detto sopra di aver incluso tutte le colonne allinterno dellindice, essenzialmente duplicando i dati della tabella. Su questa base, quale sarebbe il danno nel creare 3 indici separati sulle colonne che citi? Lo spazio utilizzato sarebbe minore e la velocità sarebbe molto maggiore. Azzarderei lipotesi che questo sia ciò che ti sta dicendo il DTA / piano di esecuzione, solo in un modo diverso.
Guarda i dettagli del piano di esecuzione che sono generati dalla query per identificare dove sono i tuoi colli di bottiglia e usali come linee guida su come progettare i tuoi indici. SQL Server è abbastanza bravo a sapere cosa è meglio: fidati di ciò che ti sta dicendo.
Spero che questo ti aiuti.
Lascia un commento