0

我正在尝试编写一个简单的查询来计算大表的结果。

SELECT COUNT(*)
FROM DM.DM_CUSTOMER_SEG_BRIDGE_CORP_DW AL3
WHERE (AL3.REFERENCE_YEAR(+)   =2012)

上面的查询大约需要 24 秒才能返回我的输出。如果我删除 where 子句并执行相同的查询,它会在 2 秒内给我结果。

我可以知道这是什么原因。我对 SQL 查询比较陌生。

请帮忙

谢谢,纳文

4

2 回答 2

1

您可能需要在表上建立索引。通常,您需要在 where 子句中使用的任何列上建立索引

至于 (+) 语法,我认为它是多余的(我不是 Oracle 专家),但请参阅Oracle 的加号 (+) 表示法和 ansi JOIN 表示法之间的区别?

于 2013-06-20T22:50:44.443 回答
0

原因可能看起来很微妙。但是 Oracle 可以通过多种方式处理这样的查询:

SELECT COUNT(*)
FROM DM.DM_CUSTOMER_SEG_BRIDGE_CORP_DW AL3

一种方法是读取表中的所有行。因为这是一张大桌子,所以这不是最有效的方法。第二种方法是使用某种统计信息,其中行数在统计信息中。我认为甲骨文从来没有这样做过,但这是可以想象的。

最后一种方法是读取索引。通常,索引会比表小得多,并且它可能已经在内存中。上面的查询将读取更少量的数据。(是一篇关于计算表中所有行的有趣文章。)

当你引入where从句时,

WHERE (AL3.REFERENCE_YEAR(+)   =2012)

Oracle 不能再扫描任何索引。它必须扫描reference_year索引。问题是什么?如果它扫描一个索引,它仍然需要获取数据记录以获取reference_year-- 的值,这与扫描整个表是等效的(实际上更糟)。

即使有一个索引 on reference_year,也不能保证您使用该索引。问题是所谓的选择性。相对于数据库中的行数,您正在获取的行数可能仍然很大(在这种情况下,10% 是“相当大的”)。Oracle 优化可能会选择执行全表扫描而不是读取索引。

于 2013-06-20T23:28:54.153 回答