【发布时间】:2013-05-23 08:58:45
【问题描述】:
假设有两个表:
TRANSACTION
Primary Key: REF_NO
Columns: REF_NO, TXN_DATE, ITEM_CODE, QUANTITY
ITEM
Primary Key: ITEM_CODE
Columns: ITEM_CODE, ITEM_DESC
查询(1):
SELECT T.REF_NO, T.TXN_DATE, T.ITEM_CODE,
I.ITEM_DESC,
T.QUANTITY
FROM TRANSACTION T, ITEM I
WHERE T.ITEM_CODE = I.ITEM_CODE
查询(2):
SELECT T.REF_NO, T.TXN_DATE, T.ITEM_CODE,
(SELECT ITEM_DESC FROM ITEM WHERE ITEM_CODE = T.ITEM_CODE) AS ITEM_DESC,
T.QUANTITY
FROM TRANSACTION T
索引(索引)根据需要在两个表上。
以上是我正在做的事情的一个非常简化的版本,但概念是一样的。
有人告诉我,(1)由于索引而更有效,Explain Plan 实际上表明确实如此。 (1)的解释计划显示了两个表的索引访问。 (2) 的解释计划显示对 ITEM 的索引访问,但对 TRANSACTION 的全表访问。
但我的困境是,当我在非常大的数据集上运行它们以计算实际性能时,(2) 比 (1) 快 四倍!可能的原因是什么?为什么我应该选择(1)而不是(2)? (我们决定选择(2)而不是(1)。)
【问题讨论】:
-
我错过了基数,但 (2) 的成本要高得多,这非常令人费解。 (不在系统再次测试。)
标签: sql performance oracle