Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle. Empêcher la sous-requête de fusion et les conditions de requête principale

ROWNUM est le moyen le plus sûr d'empêcher les transformations de l'optimiseur et d'assurer la sécurité des types. Utilisation de ROWNUM fait croire à Oracle que l'ordre des lignes est important et empêche des choses comme la poussée de prédicat et la fusion de vues.

select *
from
(
   select id, value, rownum --Add ROWNUM for type safety.
   from eav
   where attr like 'sal%' 
)
where to_number(value) > 5000;

Il existe d'autres moyens de le faire, mais aucun d'entre eux n'est fiable. Ne vous embêtez pas avec des vues en ligne simples, des expressions de table courantes, CASE , l'ordre des prédicats ou les conseils. Ces méthodes courantes ne sont pas fiables et je les ai toutes vues échouer.

La meilleure solution à long terme consiste à modifier la table EAV pour avoir une colonne différente pour chaque type, comme je le décris dans cette réponse . Corrigez cela maintenant ou les futurs développeurs maudiront votre nom lorsqu'ils devront écrire des requêtes complexes pour éviter les erreurs de type.