【发布时间】:2011-03-19 15:59:30
【问题描述】:
如果您的查询效率低下,并且您添加了索引来提高性能,那么查询是否应该“立即”开始使用索引?
或者你需要清除runningalter system flush shared_pool;的Oracle“缓存”(我相信是v$sql)?
【问题讨论】:
标签: oracle indexing oracle10g sql-execution-plan
如果您的查询效率低下,并且您添加了索引来提高性能,那么查询是否应该“立即”开始使用索引?
或者你需要清除runningalter system flush shared_pool;的Oracle“缓存”(我相信是v$sql)?
【问题讨论】:
标签: oracle indexing oracle10g sql-execution-plan
正如 DBA 喜欢回答的那样,“这取决于。”
这取决于 Oracle 是否认为索引有助于提高性能。如果 Oracle 认为索引不是查询的最佳选择,那么 Oracle 无论如何都不会使用它。
这取决于您是否使用准备好的语句。准备好的语句在其生命周期内不会重新解析,因此如果正在运行的应用程序使用您尝试修复的准备好的语句,您将需要重新启动应用程序。
刷新共享池将迫使 Oracle 重新解析和重新优化所有语句(硬解析),因此如果 Oracle 认为索引有助于提高性能,那么刷新共享池就可以解决问题。但是,它也可能在实时生产系统中产生深远的影响——导致“解析风暴”,因为使用中的每个语句都必须重新解析和重新优化——并且只能作为最后的手段。
【讨论】:
您应该重新收集有关表格的统计信息。您可以计算或估计统计数据。示例用法
计算
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS (
OwnName => 'ENROLLMENT'
,TabName => 'STUDENTS'
,Estimate_Percent => 0
,Degree => 4
,Cascade => TRUE
,No_Invalidate => FALSE);
END;
/
注意 cascade 参数告诉 oracle 也收集表上任何索引的统计信息。
估计
BEGIN
SYS.DBMS_STATS.GATHER_TABLE_STATS (
OwnName => 'ENROLLMENT'
,TabName => 'STUDENTS'
,Estimate_Percent => DBMS_STATS.AUTO_SAMPLE_SIZE
,Degree => 4
,Cascade => TRUE
,No_Invalidate => FALSE);
END;
/
【讨论】:
Shared pool 不用于缓存数据。
Oracle Server 有两个性能度量,逻辑读取和物理读取。物理读取是磁盘读取性能的度量。逻辑读取是从内存中读取数据的度量。
在任何读取方法(索引、全表扫描等)中,必须将块中的行检索到缓冲区缓存中。这是物理阅读的动作。
逻辑读是命中后从缓存返回结果,如果使用索引来提高SQL性能,就是逻辑读的提高。
所以简而言之,没有必要。
【讨论】: