avant de parler d'optimisation, parle de fonctionnel.
est-ce que sémantiquement, le test sur completed = 0 a un sens ?
il faut garder à l'esprit que ta requête c'est pas du oneshot, et qu'elle sera utile aussi pour des valeurs > 10000.
a ce moment, différencier les valeurs de completed est-il utile ?
je prend par exemple le cas de l'ERP sur lequel je travaille.
un évènement est identifié par la clé composite suivante :
codsoc = société
achvte = achat/vente
typeve = type d'évènement
numeve = numéro d'évènement
le paramétrage impose que les numeve soient différents pour chaque évènement, quels que soient leur type au sein d'une même société.
la clé pourrait donc être tout bêtement codsoc/numeve
mais
est-ce que ça à un sens de recherche un évènement par son numéro sans savoir ce que c'est ? non
alors le typeve doit absolument être intégré à la clé, même s'il n'apporte rien à l'index de clé primaire.
ensuite, une commande (typeve = CDE) ça peut être une commande d'achar (achvte = A) ou de vente (achvte = V). à nouveau, est-ce que ça à un sens de savoir si je recherche une commande donnée sans savoir si c'est une vente ou un achat ? non. à nouveau, achvte doit être ajouté à la clé, même si ça n'apporte rien à la clé.
pour finir, j'ai un code état (codeta). est-ce que ça à un sens de savoir si je cherche une commande de vente sans savoir si elle est validée ou soldée ? oui. à ce moment, le codeta ne sera pas membre de la clé.
bref, dans ton cas on ne parle que d'index et de critère, alors que moi je parle de clé. mais la problématique revient au même. la question est donc "est-ce que ça a un sens ?". je ne connais pas tes données, mais c'est comme faire des plans sur la comète dans mon cas, et se dire que tout évènement dont le dateve < 20051231 sera forcément soldé ou annulé, ce qui est vrai. cependant, jamais de la vie je vais ajouter ce type de clause, tout simplement parceque le jour où on réutilise cette requête pour une autre date, la requête devient fausse, et surtout, si par hasard j'ai des données "incohérentes" d'un point de vue logique, mais cohérentes d'un point de vue fonctionnel, je ne vais pas les retrouver. il est donc impératif de ne se baser que sur le fonctionnel pur, sans faire de suppositions logiques.
c'est avec ce genre de plans sur la comète que ce matin je me suis paluché des centaines de lignes de paramétrage d'un flux extrêment complexe afin de trouver un bug dans une procédure de calcul de stocks. tout simplement parceque j'ai supposé que si un produit était en stock et n'avais pas de réservation, il ne pouvait pas correspondra à une commande en relicat... ben si. (erreur de saisie, mais rien ne l'empêche d'un point de vue fonctionnelle : une commande passée en 2004 avec une livraison prévue en 4004... c'est ballo, mais du coup elle est en relicat et pourtant n'apparaît pas dans le suivit des évènements puisque la date est future)