|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
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. |
|
|
00
|
|
|
#2 | |
|
Membre Expert
![]() |
Avez vous un check sur la table indexée stipulant que les valeurs sont comprises entres 1 et 4096?
Peut-on voir le code de la vue? Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#3 | |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Quant à tout avoir en table, 4 milliards d'entiers dans une table c'est au moins 20Giga en SQL Server (Logs exclu). |
|
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() |
Oui j'avais édité mon message entre-temps
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#5 | |
|
Membre Expert
![]() |
Citation:
Après on va clairement vous demander l’intérêt d'une telle 'VUE'. Avez vous essayé de préciser le BETWEEN dans la définition de la vue en ajoutant un prédicat sur la table indexée?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#6 | ||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
J'ai essayé plein de choses dont celle là.
Mais rien n'y a fait. Par contre depuis j'ai réussit à mieux cerné le cas qui pose le problème. L problème apparaît avec les nombres négatifs, si je retire tout ce qui est soustraction, SQL Server parvient à agir intelligemment. Le problème est que je souhaite pouvoir parcourir ces nombres négatifs. Code :
|
||
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() |
Soit...
Déjà vous pouvez enlever les UNION ALL vu que les prédicats font le DISTINCT... Donc si vous interrogez cette vue avec un predicat between 10 and 20 par exemple il ne se contente pas d'utiliser la table?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#8 | ||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Je suis donc revenu à l'UNION ALL moins lourd. Citation:
Vous pouvez faire des tests si vous avez des doutes (et si vous êtes curieux). |
||
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() |
Code :
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#10 | |||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
Le test devient très rapide. Mais vous savez, l'objectif premier derrière la création d'une view est rarement d'en faire des tests triviaux... L'objectif des view est d'offrir à ses utilisateurs de l'abstraction (et donc de la facilité) pour des queries utiles à leurs métiers. S'il faut commencer à rédiger chaque et tous les appels à ces view en sous-query pour inclure une clause TOP, on se retrouve avec tout sauf de l'abstraction. Si vous avez d'autres idées (même ponctuées de points de suspension), n'hésitez pas. |
|||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() |
Pas d'idées mais une question: a quoi vous sert cette vue?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#12 |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
À itérer en toute liberté mais aussi, devant le défis, à parfaire mes connaissance d'SQL Server.
Abandonner une réflexion en se disant "y a moyen de s'en passer" est un recourt à éviter au maximum si on souhaite être bon plutôt qu'à peine capable. |
|
|
00
|
|
|
#13 | |
|
Membre Expert
![]() |
Citation:
Par exemple migrer en base un fichier CSV en passant par .NET en itérant sur chaque ligne plutôt que de faire ça de manière ensembliste...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com