Oracle

DISTINCT 不使用索引

  • April 18, 2014

我有表(2139868 行):

COLUMN1 NUMBER(20,0)
COLUMN2 XMLTYPE
COLUMN3 XMLTYPE
COLUMN4 VARCHAR2(50 BYTE)
COLUMN5 VARCHAR2(50 BYTE)
COLUMN6 VARCHAR2(50 BYTE)
COLUMN7 VARCHAR2(50 BYTE)
COLUMN8 VARCHAR2(50 BYTE)
COLUMN9 VARCHAR2(500 BYTE)
COLUMN10 VARCHAR2(100 BYTE)
COLUMN11 VARCHAR2(50 BYTE)
COLUMN12 VARCHAR2(20 BYTE)
COLUMN13 VARCHAR2(20 BYTE)
COLUMN14 TIMESTAMP(6)
COLUMN15 VARCHAR2(50 BYTE)
COLUMN16 PROPERTIES_ARRAY_TYPE
COLUMN17 TIMESTAMP(6)
COLUMN18 TIMESTAMP(6)

在數據庫中

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

我正在嘗試選擇COLUMN4;的所有不同值 COLUMN4不幸的是,儘管被索引,這大約需要 18 秒。只有 5 個獨特的項目。

如何加快查詢速度?

(工作不讓我上傳圖片,所以我會打出執行計劃,發揮你的想像力)

Operation             OBJECT_NAME CARDINALITY   COST
---------------------- ----------- ----------- ------
SELECT STATEMENT       NIL                    4 65463
+ HASH(UNIQUE)         NIL                    4 65463
++ TABLE ACCESS (FULL) TABLE1           2010857 65334

如果我看到一個數據模型,其中一個表有 210 萬行,其中一個列只有 5 個不同的值,並且我知道人們想要定期獲取這些不同值的列表,我強烈懷疑數據模型缺少查找/維度表。與其嘗試調整您目前的查詢,我敢打賭,更好的答案是創建一個只有這 5 個不同值的單獨表,在目前表和新查找表之間創建外鍵關係,然後修改您的查詢以命中新的查找表。

如果 Oracle 只掃描索引,它無法確定該列中是否存在 NULL 行。所以它會進行全表掃描。一種可能的解決方法:在 column4 上創建點陣圖索引。該索引也包含 NULL 列。可以在這篇文章中找到更多詳細資訊,為什麼 oracle 不使用索引進行不同的查詢?

引用自:https://dba.stackexchange.com/questions/63449