【发布时间】:2013-11-07 14:30:30
【问题描述】:
我在 Oracle 11g 中有这样的查询:
SELECT *
FROM CATAT, CG, CCSD
WHERE CATAT.ID = 1007642
AND CG.C_ID = CATAT.ID
AND CATAT.IS_PARENT = 1
AND CCSD.G_ID = CG.ID
在这种情况下,查询返回零行,并且几乎立即执行。但是,如果我将其更改为:
SELECT COUNT(*) AS ROW_COUNT
FROM CATAT, CG, CCSD
WHERE CATAT.ID = 1007642
AND CG.C_ID = CATAT.ID
AND CATAT.IS_PARENT = 1
AND CCSD.G_ID = CG.ID
它永远不会回来 - 我已经让查询运行超过 5 分钟,但它仍然没有完成。事实上,除了 SELECT * 之外的任何东西都需要很长时间才能运行。例如。 SELECT CG.ID FROM...,或SELECT CATAT.* FROM...
这个查询唯一不寻常的是 CCSD 表中有数百万行数据。 CCSD.G_ID上有一个索引,所以不可能是缺少索引。
我只是不明白为什么如果您执行除此之外的任何其他操作,那么使用 SELECT * 立即返回零行的查询会花费这么长时间吗?任何人都可以对此有所了解吗?
更新
这是SELECT * FROM... 查询的解释计划:
这是SELECT COUNT(*) FROM... 查询的解释计划:
【问题讨论】:
-
你可以为这两个查询输入解释计划吗?
-
应要求,我已经发布了解释计划!
-
如果你尝试
select count(*) from (<your root select * query>)会发生什么? -
尝试 COUNT(1) 而不是 COUNT(*)。
-
Russel.. count(*) 和 count(1) 相同。请参阅以下来自 Tom Kyte asktom.oracle.com/pls/asktom/… 的帖子