Bonjour.
J'aimerais faire une VIEW pour y lister tous les entiers possible (de -2,147,483,648 à 2,147,483,647).
Dans la plupart des cas, les valeurs utilisées seraient les entiers strictement positifs juq'uà une certaine valeur (1000 ? 10000 ?).
Afin de tirer parti d'un index, je pensais donc faire une table indexée allant de 1 à 4096.
Donc la view est l'union des valeurs
-2,147,483,648 à 0 (valeurs calculés)
1 à 4096 (table indexée)
4097 à 2,147,483,647 (valeurs calculés)
Malheureusement si je fais par exemple sur une telle view un COUNT pour tout entier entre 10 et 20, la requête est très très longue.
Alors qu'elle pourrait se contenter d'utiliser l'index de la table, la requête fait un tas d'opération inutiles (d'un regard humain).
J'ai pourtant bien essayer d'aider SQL Server à bien comprendre l'origine des différentes plages de valeurs à grand renfort de BETWEEN avec quelques essaient même de CASE, de subqueries et j'en passe.
Malheureusement, il n'existe pas à ma connaissance de possibilité d'indiqué que le résultat d'une colonne est par exempe un entier entre 4097 à 2,147,483,647.
Je dis ça, parce que si ma view renvoie par exemple :
pour n de -2,147,483,648 à 0, 0 pour la colonne 'table'
pour n de 1 à 4096, 1 pour la colonne 'table'
pour n de 4097 à 2,147,483,647, 0 pour la colonne 'table'
Et que je fais un query pour retrouver n entre 10 et 20 et 'table' = 1, SQL server se rend bien compte que la valeur 1 n'est présente que dans le résultat en provenance de la table.
Savez vous que faire pour:
1) soit donner un "hint" à sql server sur le range d'une valeur de colonne
2) soit créer un type entier dans un range
3) soit faire comprendre autrement à SQL Server où chercher les lignes
?
Merci.
Partager