Domanda

Sono consapevole del fatto che i null non sono indicizzabili in DB2, quindi supponendo che abbiamo una tabella enorme (Vendite) con una colonna data (sold_on) che è normalmente una data, ma è occasionalmente (10% delle volte) null.

Supponiamo inoltre che si tratti di un'applicazione legacy che non possiamo modificare, quindi quei null restano lì e significano qualcosa (diciamo vendite che sono state restituite).

Possiamo velocizzare la seguente query inserendo un indice nelle colonne sold_on e totali

Select * from Sales 
where 
Sales.sold_on between date1 and date2
and Sales.total = 9.99

Ma un indice non renderà questa query più veloce:

Select * from Sales 
where 
Sales.sold_on is null
and Sales.total = 9.99

Perché l'indicizzazione viene eseguita sul valore.

Posso indicizzare i null? Forse cambiando il tipo di indice? Indicizzare la colonna dell'indicatore?

È stato utile?

Soluzione

Non sono un esperto di DB2, ma se il 10% dei tuoi valori è nullo, non credo che un indice su quella colonna da solo possa mai aiutare la tua query. Il 10% è troppo per preoccuparsi di usare un indice - farà solo una scansione della tabella. Se tu parlassi del 2-3%, penso che userebbe davvero il tuo indice.

Pensa a quanti record ci sono su una pagina / blocco - diciamo 20. Il motivo per usare un indice è evitare di recuperare le pagine che non ti servono. Le probabilità che una data pagina contenga 0 record che sono nulli è (90%) ^ 20 o 12%. Quelle non sono buone probabilità: avrai comunque bisogno di recuperare l'88% delle tue pagine, utilizzando l'indice non è molto utile.

Se, tuttavia, la clausola select includesse solo alcune colonne (e non *), ad esempio solo salesid, è possibile che si utilizzi un indice su (sold_on, salesid), poiché la lettura della pagina di dati non non sarebbe necessario - tutti i dati sarebbero nell'indice.

Altri suggerimenti

Da dove hai avuto l'impressione che DB2 non indicizzi i NULL? Non riesco a trovare nulla nella documentazione o negli articoli a supporto del reclamo. E ho appena eseguito una query in una tabella di grandi dimensioni utilizzando una restrizione IS NULL che coinvolge una colonna indicizzata contenente una piccola frazione di NULL; in questo caso, DB2 ha certamente utilizzato l'indice (verificato da un EXPLAIN e osservando che il database ha risposto immediatamente invece di perdere tempo per eseguire una scansione della tabella).

Quindi: sostengo che DB2 non ha alcun problema con i NULL negli indici delle chiavi non primarie.

Ma come altri hanno scritto: i tuoi dati potrebbero essere composti in un modo in cui DB2 pensa che l'utilizzo di un indice non sarà più veloce. Oppure le statistiche del database non sono aggiornate per le tabelle interessate.

La regola empirica è che un indice è utile per valori fino al 15% dei record. ... quindi un indice potrebbe essere utile qui.

Se DB2 non indicizzerà i valori null, suggerirei di aggiungere un campo booleano, IsSold, e impostarlo su true ogni volta che viene impostata la data sold_on (ciò potrebbe essere fatto in un trigger).

Non è la soluzione migliore, ma potrebbe essere quello che ti serve.

Troels è corretto; anche le righe con un valore SOLD_ON di NULL beneficeranno di un indice su quella colonna. Se stai effettuando ricerche a distanza su SOLD_ON, potresti trarre ancora più vantaggi dalla creazione di un indice cluster che inizia con SOLD_ON. In questo esempio particolare, potrebbe non essere necessario un sovraccarico aggiuntivo per mantenere l'ordine del cluster in base a SOLD_ON, poiché le righe più recenti aggiunte avranno molto probabilmente una data SOLD_ON più recente.

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