2012-05-11 15 views
9

Per le tabelle 'grandi', c'è qualche ragione per non inserire un filtro sugli indici per le colonne facoltative?Indici filtrati SQL: devo sempre inserire un filtro in un indice per le colonne facoltative?

Quindi per un indice sulla colonna AAA (perché le persone possono cercare su AAA),
Posso impostare il filtro su ([AAA] IS NOT NULL).
Ciò consente di risparmiare spazio di archiviazione, quindi consente di risparmiare denaro.

Alcuni altri vantaggi dal technet:

  • prestazioni e piano di qualità migliorata di query
  • Riduzione dei costi di manutenzione indice
  • i costi di storage indice ridotti

La gente dice che è bene mettere un filtra su un indice per le colonne che sono per lo più vuote. Ma perché non dovrei inserire un filtro sugli indici per le colonne che sono vuote come l'1%? C'è qualche ragione per non farlo se ha solo vantaggi?

risposta

5

Questo è di solito una buona idea con due trucchi:

  1. Il progettista tavolo ha un bug (solo pre Denali!). Quando ricostruisce una tabella, cancella tutti i filtri.
  2. Assicurarsi che l'ottimizzatore può dire staticamente che il predicato non permetterà mai le righe nulle da restituire. Di solito, questo è il caso della semantica SQL NULL (sussurrando l'unico caso in cui aiutano invece di ostacolare). Esempio: select distinct col from T non utilizzerà l'indice perché potrebbe essere trovato un valore nullo. Usa questo: select distinct col from T where col is not null.

indici filtrati vengono notevolmente sottoutilizzate. Possono anche essere usati per rendere unica una colonna nullable.

mia raccomandazione pratica: Basta provare per qualche mese e imparare per lei se ci sono problemi imprevisti aggiuntivi.

Se siete in tecniche di query avanzate di SQL Server, guardate anche visualizzazioni degli annunci indicizzati. Sono un super set di indici filtrati (almeno su Enterprise).

+1

+1 per una risposta diretta e un suggerimento distinto e nullo! –

0

Tutti gli indici hanno vantaggi e svantaggi: Svantaggi:

  1. occupano spazio su disco
  2. devono essere mantenuti (il saldo del dell'albero indice deve essere reorgansised periodicamente per garantire qualsiasi l'ottimizzazione delle query non sta utilizzando la distribuzione dei dati bum), che può significare che devono essere messi fuori linea - cattive notizie se sono occupati
  3. hanno bisogno di tempo per aggiornarsi al volo se ci sono inserimenti frequenti

Vantaggi:

  1. correttamente progettati, possono eliminare costose scansioni di tabella
  2. correttamente progettato, (un indice di copertura) possono elimiate qualsiasi tabella leggere.

Così come di solito dipende.

  1. Troppi indici possono drammaticamente lento performanace scrittura
  2. Troppi indici possono aumentare notevolmente l'utilizzo dispace
  3. Non l'indice di destra può diminuire drasticamente le prestazioni di lettura

Alcune persone fanno una vita molto buona di conoscere davvero la loro roba sugli indici: C'è materiale immensamente buono qui http://www.insidesqlserver.com/

Quindi dipende dalla frequenza con cui gli utenti restituiscono i dati a cui fa riferimento l'indice rispetto alla frequenza con cui aggiornano i dati contenuti tramite l'indice.

Gli indici per colonne sparse non sono diversi, tuttavia dove la colonna è (in gran parte) vuota, quindi gli indici filtrati sono più efficienti. Una volta diminuito lo spargimento (ad esempio 50/50), la distribuzione dei dati può diventare molto importante quando l'ottimizzatore decide il piano migliore per restituire i dati.Un indice filtrato non conoscerà la distribuzione dei dati al di fuori del filtro - un po 'ovvio ma deve essere detto.

+2

penso che vi siete persi il punto della questione. Non riguarda gli indici in generale, riguarda i filtri sugli indici. Ci toglie il tuo svantaggio di occupare spazio su disco ecc. –

+0

Scusa, stavo cercando di sottolineare che, se si considera generalmente di avere un indice, le considerazioni generali iniziano nello stesso punto. Densità dei dati, letture e scritture, ecc. Il risultato dovrebbe essere indice/nessun indice e se indice, quindi tipo indice. È inoltre possibile utilizzare i proc memorizzati dall'indice mancante/non utilizzato per ottimizzare le prestazioni con il passare del tempo e la distribuzione dei dati cambia. Un indice filtrato occupa più spazio di qualsiasi indice, meno spazio di un indice non filtrato. Non sto cercando di iniziare una guerra! –

+0

Così ora la mia domanda: Tu dici "dove la colonna è in gran parte vuote indici poi filtrati sono più efficienti" -> Perché non dovrei mettere un filtro su un indice per una colonna che è solo vuota per il 5%, o addirittura Mi piace (1%? (potrebbe ancora essere come 500000 righe, quindi salva spazio.) –

Problemi correlati