我有一个包含多个列和一个唯一RAW列的表。我在RAW列上创建了一个唯一索引。
我的查询选择表格中的所有列(600万行)。
当我看到查询的成本太高(51K)。它仍然使用INDEX FULL扫描。查询没有任何过滤条件,它是一个普通的select * from。
请建议我如何调整查询操作。
提前致谢。
答案 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子句,因为如果提示由于某种原因变得无效(例如索引被删除或重命名),则排序将不再发生且不会出现错误报道。
如果您不需要以任何特定顺序返回的行,我建议您删除提示并查看性能是否有所提升。