SQL_ID,CBO,Optimizer_Mode和计划更改历史记录

时间:2013-09-16 00:54:20

标签: sql performance oracle oracle10g database-performance

这是一个4部分的问题

  1. SQL_ID背后的逻辑是什么。 。 。随着时间的推移,相同SQL的值是否会发生变化? DB Restarts之间是否存在?或者每个计划更改都会提供一个新的SQL_ID?

  2. 如何检查特定查询的计划更改历史记录?鉴于SQL_ID,我尝试查询dba_hist_sqlstat表,但它没有给出计划更改的时间和其他详细信息,以便能够与v $ sql_plan表匹配。

  3. 我将参数optimizer_mode设置为FIRST_ROWS。即使这样,当看到表dba_hist_sqlstat时,它指示一些SQL_ID的ALL_ROWS。 。 。 oracle可以忽略实例级参数来使用它认为最合适的吗?

  4. 晚上8点到2点之间,查询效果不佳。执行时间为6秒。在下午3点之后,查询开始响应< 1秒。我有显示此详细信息的时段的AWR报告。在这两个时期内,DB的负载没有差异。我怎么能到达这个根?我正在努力寻找计划变更的历史,但希望获得更多反馈,以便最好地分析这些问题。

  5. 数据库版本是在AIX 5.3 64b上运行的Oracle 10.1.0.4

1 个答案:

答案 0 :(得分:1)

1.- SQLID是根据实际的SQL文本计算的哈希函数,它不应该随着重启而在数据库之间改变至少相同的版本,不同的oracle版本可以有不同的哈希函数吗?所以只要你不要更改sql文本(这包括空白逗号和所有内容)SQLID将保持不变。

2.-使用DBMS_XPLAN.DISPLAY_AWR显示SQL_ID的所有计划:select * from table(dbms_xplan.display_awr(sql_id => '[your SQL_ID]'));

3.-如果查询中包含OPTIMIZER GOAL提示,Oracle将仅执行此操作。

4.-这个有很多事情要发挥作用。我将从两个时期的AW​​R中查看前5个定时事件开始。如果它们是相似的,那么我将调查该陈述的PLAN历史,看它是否在期间发生变化以及数据在这些期间的表现如何。这三个中的一个应该给你答案。