Domanda

Ad esempio:

Given columns A,B,C,D,

IX_A is an index on 'A'

IX_AB is a covering index on 'AB'

IX_A può essere tranquillamente rimosso, poiché è ridondante: IX_AB sarà utilizzato al suo posto. Voglio sapere se questo generalizza:

Se ho:

IX_AB
IX_ABC
IX_ABCD

e così via,

Possono gli indici minori ancora essere rimossi in modo sicuro? Cioè, fa IX_ABC fare IX_AB ridondante, e fa IX_ABCD fare sia IX_AB e IX_ABC ridondante?

È stato utile?

Soluzione

In generale - e questo varia da server a server -. Un indice di copertura coprirà piccoli-selezioni del index

Quindi, se si dispone di un indice che copre a, b, c, che di solito si dà automaticamente un indice che copre una, e a, b.

Non sono garantiti per avere, ad esempio, un indice di copertura di b, c.

Altri suggerimenti

Sì, per la maggior parte.

Tuttavia, IX_ABCD non è molto utile come un sostituto per, diciamo, IX_BCD.

C'è un avvertimento, però: gli indici possono ancora bisogno di letture del disco, quindi se C e D esplodere la dimensione dell'indice, ci sarà qualche inefficienza alzando A, B in IX_ABCD che non si verificano quando si cerca in IX_AB.

Tuttavia, tale differenza è probabilmente superato dal ulteriore calo di prestazioni di mantenere IX_AB separatamente.

La cosa importante è le colonne principali nell'indice. Se avete l'indice IX_ABCD le seguenti query utilizzerà l'indice:

select * from tabella in cui A = 1

select * from tabella dove A = 1 e B = 1

select * dalla tabella dove A = 1 e B = 1 e C = 1

Tuttavia, la seguente, molto probabilmente non utilizza l'indice (almeno non come si intende):

select * from tabella in cui B = 1

select * from tabella in cui C = 1

select * dalla tabella in cui B = 1 e C = 1

La cosa importante è che le colonne principali sono utilizzati. Pertanto l'ordine delle colonne quando si crea l'indice ha importanza.

Non necessariamente. Mentre è vero che un indice (A, B, C) può essere utilizzato per un predicato filtraggio su A o una richiesta di ordine su A o una condizione di join su A, che non significa necessariamente che l'indice (A) da solo è inutile . Se l'indice (A, B, C) è notevolmente più ampia di (A), quindi una scansione gamma su un solo salverà significativo di I / O, perché avrebbe dovuto leggere un minor numero di pagine (indice più stretta ).

ut ho admint che questa sarebbe stata l'eccezione piuttosto che la regola. In generale è possibile rimuovere un indice su A se un altro su (A, B) esiste. Si noti che un indice (A, B) non soddisfa alcun filtraggio su B modo, è possibile rimuovere solo se la colonna più a sinistra (s) sono uguali. Alcuni database hanno 'saltare-scan' gli operatori che possono utilizzare un indice su (A, B) per la ricerca di B, ma che è un caso di confine molto stretta.

Sempre meglio non assumere nulla di interni motore di database e controllare effettivamente i piani di query effettivi utilizzati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top