簡體   English   中英

SQL查詢的索引指導

[英]Index Guidance for SQL Query

任何人都有關於如何為以下查詢建立索引的指南? 該查詢按預期工作,但我似乎無法繞過全表掃描。 使用Oracle 11g。

SELECT   v.volume_id
  FROM   (  SELECT   MIN (usv.volume_id) volume_id
              FROM   user_stage_volume usv
             WHERE   usv.status = 'NEW'
                     AND NOT EXISTS
                           (SELECT   1
                              FROM   user_stage_volume kusv
                             WHERE   kusv.deal_num = usv.deal_num
                                     AND kusv.locked = 'Y')
          GROUP BY   usv.deal_num, usv.volume_type
          ORDER BY   MAX (usv.priority) DESC, MIN (usv.last_update) ASC) v
 WHERE   ROWNUM = 1;

請在注釋中索取您可能需要的更多信息,我將進行編輯。

這是表的創建腳本。 PK是VOLUME_ID。 DEAL_NUM不是唯一的。

CREATE TABLE ENDUR.USER_STAGE_VOLUME
(
  DEAL_NUM       NUMBER(38)                     NOT NULL,
  EXTERNAL_ID    NUMBER(38)                     NOT NULL,
  VOLUME_TYPE    NUMBER(38)                     NOT NULL,
  EXTERNAL_TYPE  VARCHAR2(100 BYTE)             NOT NULL,
  GMT_START      DATE                           NOT NULL,
  GMT_END        DATE                           NOT NULL,
  VALUE          FLOAT(126)                     NOT NULL,
  VOLUME_ID      NUMBER(38)                     NOT NULL,
  PRIORITY       INTEGER                        NOT NULL,
  STATUS         VARCHAR2(100 BYTE)             NOT NULL,
  LAST_UPDATE    DATE                           NOT NULL,
  LOCKED         CHAR(1 BYTE)                   NOT NULL,
  RETRY_COUNT    INTEGER                        DEFAULT 0 NOT NULL,
  INS_DATE       DATE                           NOT NULL
)

ALTER TABLE ENDUR.USER_STAGE_VOLUME ADD (
  PRIMARY KEY
 (VOLUME_ID))

(deal_num)上的索引將極大地幫助子查詢。 實際上,在(deal_num,locked)上的索引將允許子查詢完全避免使用表本身。

您應該期望對主查詢進行全表掃描,因為它會過濾未建立索引的狀態(並且很可能不會從建立索引中受益,除非“ NEW”對於狀態來說是非常少見的值)。

我認為它為外部子查詢的每次運行都運行一次內部子查詢(內部不存在...)。

那將是性能受到打擊的地方-它將遍歷user_stage_volume中每一行的所有user_stage_volume,即O(n ^ 2),n是usv中的行數。

一種替代方法是為內部子查詢創建一個視圖,然后使用該視圖,或者通過使用WITH來命名一個臨時視圖。

暫無
暫無

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

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