Oracle 11g XE执行速度慢

时间:2014-08-27 06:25:16

标签: oracle performance oracle11g query-optimization

我遇到了有关我创建的选择查询的问题。查询如下:

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.CONTACTSIDC.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

1 个答案:

答案 0 :(得分:0)

所有费用都没有,特别是这个:

TABLE ACCESS     WAVECONTACTS_HISTORY        FULL           2

这是一个200万行表的全表扫描。

您的统计信息很可能是陈旧的。在表和索引上收集新的统计信息,您应该看到更智能,更高效的执行计划。 Find out more.

这可能不是整个解决方案。调整取决于许多因素,例如偏斜和分布。例如,如果您的联系历史记录中的广告系列相对较少而且它们分散在整个表格中,那么C.CAMPAIGNSID上的索引将无法为您带来任何魔力。如果这是一个你将要运行很多的查询,你应该按顺序考虑复合索引(CAMPAIGNSID,CONTACTSID)。

或者,由于您实际上并未使用WAVECONTACTS_HISTORY中的任何列,因此可以使用IN或EXISTS子查询替换连接。