簡體   English   中英

Oracle 11g XE緩慢的查詢執行

[英]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.CAMPAIGNSIDC.CONTACTSIDWC.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.

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