2017-04-18 4 views
0

Pour améliorer les performances de la requête suivante, nous devons supprimer la clause OR et utiliser UNION. La clause OR ne permet pas de considérer l'index, c'est pourquoi nous devons utiliser UNION à la place. Veuillez me faire savoir s'il existe une autre meilleure façon d'améliorer les performances de cette requête et éviter d'utiliser la clause OR?Amélioration des performances de la requête SQL en remplaçant OU par UNION

 SELECT *      
      FROM A 
      LEFT OUTER JOIN B 
       ON A.NBR_CH = B.NBR_CH 
      LEFT OUTER JOIN C 
       ON B.ID = C.ID     
      WHERE A.LIS IN (:IdList) 
       AND ((C.TYP_C = :Type 
       AND C.R_NBR LIKE :rNbr) 
       OR (A.R_NBR LIKE :rNbr))   
      WITH UR 
+2

Qu'est-ce que 'WITH UR'? –

+0

@GordonLinoff 'WITH {RR | RS | CS | UR}' indique au plan d'être compilé avec le niveau d'isolement spécifié, dans ce cas, lecture non validée. – mustaccio

+0

Quelle plateforme et quelle version? Pourquoi pensez-vous que la RO empêche l'utilisation de l'index? – Charles

Répondre

0

Serait-ce comme ça?

SELECT *      
      FROM A 
      LEFT OUTER JOIN B 
       ON A.NBR_CH = B.NBR_CH 
      LEFT OUTER JOIN C 
       ON B.ID = C.ID     
      WHERE A.LIS IN (:IdList) 
       AND ((C.TYP_C = :Type 
       AND C.R_NBR LIKE :rNbr))   
      WITH UR 
    UNION 

SELECT *      
      FROM A 
      LEFT OUTER JOIN B 
       ON A.NBR_CH = B.NBR_CH 
      LEFT OUTER JOIN C 
       ON B.ID = C.ID     
      WHERE A.LIS IN (:IdList) 
       AND A.R_NBR LIKE :rNbr  
      WITH UR 
0

Ce qui précède est correct. Mais je voulais savoir s'il y avait un autre moyen de le faire sans utiliser l'UNION