我在oracle 10g中有一个表,其中包含大约51列和2500万条记录。当我在表上执行一个简单的选择查询来提取3列时,我得到的成本太高了大约182k。所以我需要降低成本效应。有没有办法减少它?
查询:
select a,b,c
from X
a - char
b - varchar2
c - varchar2
TIA
答案 0 :(得分:3)
在这种情况下,如果不知道为什么需要查询2500万条记录,很难提出好的建议。正如@Ryan所说,通常你会有一个WHERE子句;或者,也许你正在将结果提取到另一张表或其他东西?
覆盖索引(即在a,b,c上)可能是对性能产生任何影响的唯一方法 - 然后查询可以执行快速的完整索引扫描,并且每个块的检索会获得更多记录。
答案 1 :(得分:2)
嗯......如果你知道你只需要这些值的子集,那么在那里抛出WHERE子句显然会有所帮助。如果你真的需要所有2500万条记录,并且表格被正确编入索引,那么我会说你真的没什么可做的。
答案 2 :(得分:0)
是的,更好地说明选择的目的是作为杰弗里肯普说的。
如果正常选择,您只需要为您可以执行的字段提供索引,提供索引上的表统计信息(DBMS_STATS.GATHER_TABLE_STATS),检查每个字段的统计信息以确保您的索引正确(阅读:{ {3}})。
如果需要加载到另一个表,请使用cursor,通过批量插入(FORALL技术)限制每个执行的记录并加载到表中。