| |
问题:在检查sql语句状态的时候,rac环境中的一个实例可能无法查询到另一个实例上所执行的sql。
解决方法:在下面这个示例中大家可以看到正在运行的sql:
sql> select instance_number, instance_name from v$instance;
instance_number instance_name
--------------- ----------------
1 tradedb1
sql> select sql_text from v$sql
2 where hash_value in (select sql_hash_value from v$session where sid = 135);
sql_text
---------------------------------------
begin dbms_mview.refresh('ord_hit_comm', 'c'); end;
|
但在以下的示例中却无法查询到结果:
sql> select instance_number, instance_name from v$instance;
instance_number instance_name
--------------- ----------------
2 tradedb2
sql> select sql_text
2 from gv$sql
3 where inst_id = 1
4 and hash_value in
5 (
6 select sql_hash_value
7 from gv$session
8 where sid = 135
9 and inst_id = 1
10 );
未选定行
|
相同的语句在第一个示例上可以得到正确的结果:
sql> select instance_number, instance_name from v$instance;
instance_number instance_name
--------------- ----------------
1 tradedb1
sql> select sql_text
2 from gv$sql a
3 where a.inst_id = 1
4 and a.hash_value in
5 (
6 select /*+ no_merge(b) */ sql_hash_value
7 from gv$session b
8 where b.sid = 135
9 and b.inst_id = 1
10 );
sql_text
----------------------------------
begin dbms_mview.refresh('ord_hit_comm', 'c'); end;
而且在实例2上,如果分布执行上面的语句,是可以得到结果的:
sql> select instance_number, instance_name from v$instance;
instance_number instance_name
--------------- ----------------
2 tradedb2
sql> select sql_hash_value from gv$session where sid = 135 and inst_id = 1;
sql_hash_value
--------------
1300018675
sql> select sql_text from gv$sql where hash_value = '1300018675';
sql_text
---------------------------------
begin dbms_mview.refresh('ord_hit_comm', 'c'); end;
|
此处可能是oracle的执行计划出现了错误,尝试使用rule提示,结果为正常:
sql> select /*+ rule */ sql_text
2 from gv$sql a
3 where a.inst_id = 1
4 and a.hash_value in
5 (
6 select sql_hash_value
7 from gv$session b
8 where b.sid = 135
9 and b.inst_id = 1
10 );
sql_text
-----------------------------------
begin dbms_mview.refresh('ord_hit_comm', 'c'); end;
|
如果不用in的方式,而采用关联的写法,也可以得到正确结果:
sql> select sql_text
2 from gv$sql a, gv$session b
3 where a.inst_id = 1
4 and b.inst_id = 1
5 and b.sid = 135
6 and a.hash_value = b.sql_hash_value
7 ;
sql_text
---------------------------------
begin dbms_mview.refresh('ord_hit_comm', 'c'); end;
|
总结
现在我们就可以断定是oracle在merge视图gv$session的时候出现了错误,这个错误是因为没有在metalink上找到类似的信息。 |
|