2017-06-08 1 views
0
SELECT COUNT(*) AS ct 
FROM TABLEA _tablea 
LEFT OUTER JOIN 
    (SELECT DISTINCT CM_CASE_ID, 
    LOG_TIMESTAMP, 
    ACTION_PERFORMED_BY, 
    CASE_FOLLOW_UP_DATE, 
    ACTION_PICKLIST_ID, 
    CASE_REQUEST_NOTE_VALUE, 
    CASE_STATUS_ID, 
    RESOLUTION_PICKLIST_ID, 
    PREVIOUS_REQUEST_OWNER, 
    CURRENT_REQUEST_OWNER, 
    CASE_FOLLOW_UP_NOTE_VALUE, 
    CM_PENDING_REASON_ID, 
    ACCOUNT_STATUS 
    FROM TABLEB _tableb 
    WHERE _tableb.LOG_TIMESTAMP 
    ||_tableb.CM_CASE_ID IN 
    (SELECT MIN(_tableb.LOG_TIMESTAMP) 
     ||_tableb.CM_CASE_ID AS col_0_0_ 
    FROM TABLEB _tableb 
    WHERE _tableb.CASE_STATUS_ID='A' 
    GROUP BY _tableb.CM_CASE_ID 
    ) 
) _tableb 
ON _tablea.CM_CASE_ID=_tableb.CM_CASE_ID 
WHERE _tablea.CASE_CREATION_DATE BETWEEN to_date('12/01/2016', 'mm/dd/yyyy') AND to_date('06/07/2017', 'mm/dd/yyyy') + 1 
AND _tablea.CASE_REQUEST_TYPE                      IN (1,2,3) 
AND _tablea.CASE_STATUS_ID                       IN ('A','B')  

la requête ci-dessus qui attend les enregistrements entre 01/12/2016 et 07/06/2017 est très bien de travail en moins de tempsrequête avec plus de résultats fonctionne très bien, mais avec moins de résultats en prenant le temps

SELECT COUNT(*) AS ct 
FROM TABLEA _tablea 
LEFT OUTER JOIN 
    (SELECT DISTINCT CM_CASE_ID, 
    LOG_TIMESTAMP, 
    ACTION_PERFORMED_BY, 
    CASE_FOLLOW_UP_DATE, 
    ACTION_PICKLIST_ID, 
    CASE_REQUEST_NOTE_VALUE, 
    CASE_STATUS_ID, 
    RESOLUTION_PICKLIST_ID, 
    PREVIOUS_REQUEST_OWNER, 
    CURRENT_REQUEST_OWNER, 
    CASE_FOLLOW_UP_NOTE_VALUE, 
    CM_PENDING_REASON_ID, 
    ACCOUNT_STATUS 
    FROM TABLEB _tableb 
    WHERE _tableb.LOG_TIMESTAMP 
    ||_tableb.CM_CASE_ID IN 
    (SELECT MIN(_tableb.LOG_TIMESTAMP) 
     ||_tableb.CM_CASE_ID AS col_0_0_ 
    FROM TABLEB _tableb 
    WHERE _tableb.CASE_STATUS_ID='A' 
    GROUP BY _tableb.CM_CASE_ID 
    ) 
) _tableb 
ON _tablea.CM_CASE_ID=_tableb.CM_CASE_ID 
WHERE _tablea.CASE_CREATION_DATE BETWEEN to_date('05/01/2017', 'mm/dd/yyyy') AND to_date('06/07/2017', 'mm/dd/yyyy') + 1 
AND _tablea.CASE_REQUEST_TYPE                      IN (1,2,3) 
AND _tablea.CASE_STATUS_ID IN ('A','B') 

cette requête qui attend des enregistrements entre 05/01/2017 et 06/07/2017 prend trop de temps autour de 20 minutes ...

Pls aider à savoir pourquoi la requête qui attendent plus de résultat fonctionne bien et moins.

+0

Pouvez-vous s'il vous plaît poster l'expliquer les plans pour les requêtes, y compris des informations sur la structure des tables impliquées (avec index) et le nombre de dossiers dans chaque table. – Aleksej

Répondre

0

vous faites de la confusion sql. mettre chaque table comme table CTE comme ceci: mais aussi il y a désordre dans où la condition qui devrait être fixée. J'ai suggéré de mettre chaque sélection dans CTE séparé et chaque condition JOIN dans la partie ON et toutes les autres conditions dans WHERE et éviter de mélanger trop de choses .part par part select, join, on, où ..., puis à la fin du groupe par le résultat. Ensuite, il suffit de comparer le plan d'exécution pour chaque requête, vous découvrirez écarts constatés

;with cte_tablea as (
SELECT CM_CASE_ID, CASE_CREATION_DATE, 
CASE_REQUEST_TYPE , CASE_STATUS_ID 
    FROM TABLEA) 
,cte_tableb as (
    SELECT DISTINCT CM_CASE_ID, 
    LOG_TIMESTAMP, 
    ACTION_PERFORMED_BY, 
    CASE_FOLLOW_UP_DATE, 
    ACTION_PICKLIST_ID, 
    CASE_REQUEST_NOTE_VALUE, 
    CASE_STATUS_ID, 
    RESOLUTION_PICKLIST_ID, 
    PREVIOUS_REQUEST_OWNER, 
    CURRENT_REQUEST_OWNER, 
    CASE_FOLLOW_UP_NOTE_VALUE, 
    CM_PENDING_REASON_ID, 
    ACCOUNT_STATUS 
FROM TABLEB 
) 

SELECT COUNT(*) AS ct 
FROM cte_tablea _tablea 
LEFT OUTER JOIN 
    cte_tablea _tableb 
    on _tablea.CM_CASE_ID=_tableb.CM_CASE_ID 
    WHERE _tableb.LOG_TIMESTAMP 
    ||_tableb.CM_CASE_ID IN 
    (SELECT MIN(_tableb.LOG_TIMESTAMP) 
    ||_tableb.CM_CASE_ID AS col_0_0_ 
     FROM TABLEB cte_tablea 
     WHERE _tableb.CASE_STATUS_ID='A' 
     GROUP BY _tableb.CM_CASE_ID 
    ) 
    and _tablea.CASE_CREATION_DATE BETWEEN to_date('05/01/2017', 
'mm/dd/yyyy') AND to_date('06/07/2017', 'mm/dd/yyyy') + 1 
    AND _tablea.CASE_REQUEST_TYPE                      
    IN (1,2,3) 
    AND _tablea.CASE_STATUS_ID IN ('A','B')