调整表选择在Oracle 10g中具有RAW列的SQL

时间:2010-10-06 08:42:00

标签: sql oracle performance

我有一个包含多个列和一个唯一RAW列的表。我在RAW列上创建了一个唯一索引。

我的查询选择表格中的所有列(600万行)。

当我看到查询的成本太高(51K)。它仍然使用INDEX FULL扫描。查询没有任何过滤条件,它是一个普通的select * from。

请建议我如何调整查询操作。

提前致谢。

2 个答案:

答案 0 :(得分:10)

如果要检索所有行中的所有列,为什么要暗示它使用索引?只有在对索引列进行过滤时,索引才有用。如果您只检索索引列,则INDEX_FFS提示可能会有所帮助。但是,如果您必须返回任何非索引列的数据,那么使用索引会在一定比例的返回数据之外产生相反的效果,因为您不得不重复访问索引数据块和表数据块。

答案 1 :(得分:3)

因此,您的查询是:

select /*+ index (rawdata idx_test) */
       rawdata.*
from   v_wis_cds_cp_rawdata_test rawdata

你想知道Oracle为什么选择INDEX FULL扫描?

好吧,正如亚历克斯所说,原因是“index (raw data idx_text)”提示。这是一个指示Oracle优化器的指令,“当您访问rawdata时,在idx_text索引上使用索引访问”,这意味着Oracle将尽可能地执行 - 甚至如果那不是最好的计划

提示不会自动更快地进行查询。它们是告诉优化器要做什么的一种方式。

我以前见过这样的查询 - 有时会添加这样的提示,以便按排序顺序返回行,而不实际进行排序。但是,如果这是要求,我强烈建议无论如何都要添加ORDER BY子句,因为如果提示由于某种原因变得无效(例如索引被删除或重命名),则排序将不再发生且不会出现错误报道。

如果您不需要以任何特定顺序返回的行,我建议您删除提示并查看性能是否有所提升。

相关问题