我遇到了有关我创建的选择查询的问题。查询如下:
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
的外键。
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
答案 0 :(得分:0)
所有费用都没有,特别是这个:
TABLE ACCESS WAVECONTACTS_HISTORY FULL 2
这是一个200万行表的全表扫描。
您的统计信息很可能是陈旧的。在表和索引上收集新的统计信息,您应该看到更智能,更高效的执行计划。 Find out more.
这可能不是整个解决方案。调整取决于许多因素,例如偏斜和分布。例如,如果您的联系历史记录中的广告系列相对较少而且它们分散在整个表格中,那么C.CAMPAIGNSID上的索引将无法为您带来任何魔力。如果这是一个你将要运行很多的查询,你应该按顺序考虑复合索引(CAMPAIGNSID,CONTACTSID)。
或者,由于您实际上并未使用WAVECONTACTS_HISTORY中的任何列,因此可以使用IN或EXISTS子查询替换连接。