Question

D'après ce que je comprends, les valeurs NULL ne sont pas indexables dans DB2, nous supposons donc que nous avons une table énorme (Sales) avec une colonne de date (sold_on) qui est normalement une date, mais qui est occasionnellement (10% du temps), null.

De plus, supposons qu'il s'agisse d'une application héritée que nous ne pouvons pas modifier. Par conséquent, ces valeurs nulles restent là et ont un sens (par exemple, les ventes qui ont été retournées).

Nous pouvons accélérer la requête suivante en plaçant un index sur les colonnes sold_on et total

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

Mais un index ne rendra pas cette requête plus rapide:

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

Parce que l'indexation est faite sur la valeur.

Puis-je indexer les valeurs NULL? Peut-être en changeant le type d'index? Indexer la colonne de l'indicateur?

Était-ce utile?

La solution

Je ne suis pas un expert de DB2, mais si 10% de vos valeurs sont null, je ne pense pas qu'un index sur cette colonne seule aidera jamais votre requête. 10%, c'est trop pour utiliser un index, il suffit de faire un scan de table. Si vous parlez de 2 ou 3%, je pense qu’il utiliserait votre indice.

Pensez au nombre d'enregistrements sur une page / un bloc - disons 20. La raison d'utiliser un index est d'éviter de récupérer des pages inutiles. La probabilité qu'une page donnée contienne 0 enregistrements nuls est de (90%) ^ 20 ou 12%. Ce ne sont pas de bonnes chances - vous aurez besoin de 88% de vos pages pour être récupérées de toute façon, utiliser l'index n'est pas très utile.

Si, toutefois, votre clause de sélection n'incluait que quelques colonnes (et non *) - disons uniquement salesid, vous pourriez probablement la faire utiliser un index sur (sold_on, salesid), car la lecture de la page de données ne le ferait pas. ne pas être nécessaire - toutes les données seraient dans l'index.

Autres conseils

D'où avez-vous eu l'impression que DB2 n'indexait pas les valeurs NULL? Je ne trouve rien dans la documentation ou les articles appuyant la revendication. Et je viens d'effectuer une requête dans une grande table en utilisant une restriction IS NULL impliquant une colonne indexée contenant une petite fraction de NULL; dans ce cas, DB2 a certainement utilisé l’index (vérifié par un EXPLAIN et en observant que la base de données a répondu instantanément au lieu de passer du temps à analyser les tables).

Ainsi: je prétends que DB2 n’a aucun problème avec les valeurs NULL dans les index de clé non primaire.

Mais comme d’autres l’ont écrit: Vos données peuvent être composées de manière à ce que DB2 pense que l’utilisation d’un index ne sera pas plus rapide. Ou bien les statistiques de la base de données ne sont pas à jour pour les tables impliquées.

La règle de base est qu'un index est utile pour des valeurs allant jusqu'à 15% des enregistrements. ... donc un index pourrait être utile ici.

Si DB2 n'indexe pas les valeurs NULL, je suggère d'ajouter un champ booléen, IsSold, et de le définir sur true à chaque fois que la date sold_on est définie (cette opération peut être effectuée dans un déclencheur).

Ce n’est pas la solution la plus agréable, mais c’est peut-être ce dont vous avez besoin.

Troels est correct; même les lignes avec une valeur SOLD_ON de NULL bénéficieront d'un index sur cette colonne. Si vous effectuez des recherches à distance sur SOLD_ON, vous pouvez en tirer un avantage supplémentaire en créant un index clusterisé commençant par SOLD_ON. Dans cet exemple particulier, le maintien de l'ordre de mise en cluster basé sur SOLD_ON peut ne pas nécessiter beaucoup de temps supplémentaire, car les nouvelles lignes ajoutées auront très probablement une date SOLD_ON plus récente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top