服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > Oracle开发 > 查看文档

rac环境中查询不到其他实例执行的sql

问题:在检查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上找到类似的信息。

扫描关注微信公众号