[英]Oracle 11g XE slow query execution
我遇到有關我創建的選擇查詢的問題。 查詢如下:
SELECT --184.791
C.MSISDN
FROM
CONTACTS_HISTORY C
INNER JOIN WAVECONTACTS_HISTORY WC
ON C.CONTACTSID = WC.CONTACTSID
WHERE
C.CAMPAIGNSID = 472;
對C.CAMPAIGNSID
, C.CONTACTSID
和WC.CONTACTSID
列進行索引,並且WC.CONTACTSID
是C.CONTACTSID的C.CONTACTSID
。
CONTACTS_HISTORY
表具有3.000.000條記錄,而WAVECONTACTS_HISTORY
表則具有2.000.000條記錄。
當我在查詢中包括聯接時,執行速度太慢。
SQLDeveloper的執行計划的總成本為3。
我不明白為什么執行速度太慢。 這是因為XE版本的局限性嗎?
Oracle DB安裝在我的筆記本電腦Intel Core i3上,具有8GB RAM(但我知道此版本的局限性是1 CPU,1 Gb RAM)
OPERATION OBJECT_NAME OPTIONS COST
SELECT STATEMENT 3
NESTED LOOPS
NESTED LOOPS 3
TABLE ACCESS WAVECONTACTS_HISTORY FULL 2
INDEX IX_CONTACTS_HISTORY_CMPSID RANGE SCAN 1
Access Predicates
TABLE ACCESS CONTACTS_HISTORY BY INDEX ROWID 1
Filter Predicates
WC.CONTACTSID=C.CONTACTSID
所有的成本都是無法承受的,尤其是這一項:
TABLE ACCESS WAVECONTACTS_HISTORY FULL 2
那是一個200萬行表的FULL TABLE SCAN。
您的統計數據很可能是過時的。 在表和索引上收集新的統計信息,您應該看到一個更聰明,更有效的執行計划。 了解更多。
那可能不是全部解決方案。 調整取決於許多因素,例如偏斜和分布。 例如,如果您的聯系歷史記錄中的廣告系列相對較少,並且分布在整個表中,則C.CAMPAIGNSID上的索引對您沒有任何作用。 如果這是一個查詢,您將要運行很多,則應考慮按此順序在(CAMPAIGNSID,CONTACTSID)上使用復合索引。
另外,由於您實際上並不使用WAVECONTACTS_HISTORY中的任何列,因此可以將連接替換為IN或EXISTS子查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.