簡體   English   中英

查詢更多結果可以正常工作,但花費時間較少

[英]Query with more results works fine but with less results taking time

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')       

上面的查詢期望在2016年12月1日到2017年7月7日之間的記錄可以在更少的時間內正常工作

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')   

此查詢期望在05/01/2017到06/07/2017之間的記錄需要大約20分鍾的時間...

請幫忙,為什么期望更多結果的查詢可以正常工作,而更少則不能工作。

您正在使sql混淆。 像這樣將每個表作為CTE表放置:但是在應該修復的條件位置也很混亂。我建議將每個選擇放在單獨的CTE中,將每個JOIN條件放在ON部分中,將每個其他條件放在WHERE中,避免混合太多東西逐個選擇,在...上加入,然后按結果分組。 然后只需比較每個查詢的執行計划,您就會發現差異

;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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM