15 mai 2014

utilisation de SYSDATE dans une requête - impact sur les performances

De la part de Gabriel : Lorsque l’on utilise SYSDATE dans une requête, Oracle évalue la valeur de la date système SYSDATE à chaque ligne.

Par exemple avec cette requête :
select count(*) from ZX8K where perpai='MT'||to_char(SYSDATE, 'YYYYMM'); 
Oracle lance environ 5 500 000 évaluations de SYSDATE. Le temps d’exécution est de 8,25 secondes.

Résolution : sous sqlplus, la valeur de la colonne SYSDAT est stockée dans une "variable sqlplus" nommée SYSDATE une fois pour toute :

set verify off 
column SYSDAT NEW_VALUE SYSDATE NOPRINT
select 'to_date('''
     || to_char(SYSDATE, 'YYYY-MM-DD-HH24.MI.SS')
     || ''', ''YYYY-MM-DD-HH24.MI.SS'')' as SYSDATE
from DUAL;


La requête devient :

select count(*) from ZX8K where perpai='MT'||to_char(&SYSDATE., 'YYYYMM'); 

Le temps d’exécution passe à 1 seconde.