0

这是一个 4 部分的问题

  1. SQL_ID 背后的逻辑是什么。. . 同一个 SQL 的值是否会随着时间而改变?它是否在数据库重新启动之间持续存在?还是每次计划更改都会给出一个新的 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 报告。在这 2 个时期内,数据库上的负载没有差异。我怎么能找到这个的根源?我正在尝试查找计划更改的历史记录,但希望获得更多反馈以最好地分析此类问题。

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

4

1 回答 1

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.- 这个有很多事情要做。我将首先查看两个时间段内 AWR 中的前 5 个定时事件。如果它们相似,那么我会调查该声明的 PLAN 历史记录,看看它是否在期间发生了变化,以及数据在期间的表现如何。这三个之一应该会给你答案。

于 2014-05-10T06:03:00.333 回答