Je ne sais pas comment tout cela fonctionne en interne, mais selon la situation, je conseillerais de jouer avec une table qui "déploie" toutes les valeurs de d1, puis se joint à celle-ci. De cette façon, le moteur de requête peut identifier "exactement" le bon enregistrement au lieu d'avoir à trouver une combinaison de limites correspondant à la valeur recherchée.
ex.
x value
a 1
a 2
a 3
b 5
b 6
b 7
b 8
b 9
b 10
b 11
c 19 etc..
étant donné un index sur la colonne de valeur (**), cela devrait être un peu plus rapide que de se joindre avec le début ET la fin ENTRE sur la table d1 d'origine à mon humble avis.
Bien sûr, chaque fois que vous apportez des modifications à d1, vous devrez également ajuster la table déployée (déclencheur ?). Si cela se produit fréquemment, vous passerez plus de temps à mettre à jour le tableau déployé que vous n'en avez gagné au départ ! De plus, cela peut prendre rapidement un peu d'espace (disque) si certains des intervalles sont vraiment grands ; et aussi, cela suppose que nous n'avons pas besoin de rechercher des nombres non entiers (par exemple, que se passe-t-il si nous recherchons la valeur 3,14 ?)
(Vous pourriez envisager d'en expérimenter un unique sur (valeur, x) ici...)