暂无图片
Oracle数据库怎样抓出带有自定义函数的SQL?
我来答
分享
三阳
2023-06-15
Oracle数据库怎样抓出带有自定义函数的SQL?

Oracle数据库怎样抓出带有自定义函数的SQL?

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新

在开发过程中,应该避免在SQL语句中调用自定义函数,可以通过以下SQL语句抓出调用了自定义函数的SQL。

select distinct sql_id,sql_text,module

  from V$SQL,

          (select object_name

             from DBA_OBJECTS O

           where owner = 'SCOTT'

               and object_type in ('FUNCTION','PACKAGE''))

 where (instr(upper(sql_text),object_name) >0)

    and plsql_exec_time >0

    and regexp_like(upper(sql_fulltext),'^[SELECT]')

    and parsing_schema_name='SCOTT'; 

暂无图片 评论
暂无图片 有用 5
暂无图片
Thomas

在开发过程中,应该避免在SQL语句中调用自定义函数。请问,为何要尽量避免,这样做的弊端是什么呢?

暂无图片 评论
暂无图片 有用 0
2023-06-16
使用了自定义函数,容易造成列上的索引失效。
Thomas

哦,谢谢!

暂无图片 评论
暂无图片 有用 0
刘晓华

where条件里用的function会使索引失效

select 字段里的function, 会导致SQL引擎和PL/SQL引擎的上下文切换,影响性能

暂无图片 评论
暂无图片 有用 1
广州_老虎刘

顶楼的方法应该是参考了落落书上的写法,方法不错,有2个小改进建议:1.可以改从v$sqlarea里面查,可以避免v$sql子游标多导致的性能问题(用instr关联,应尽量把结果集变小); 2.regexp_like只是把select开头的sql抓出来,可能还有一些sql以with as,注释等开头,还有create table,insert ,update,delete,merge 语句里面可能也会用自定义函数, 建议把regexp_like条件,改成command_type in(1,2,3,6,7,189);    

暂无图片 评论
暂无图片 有用 1
Thomas

where条件里用的function会使索引失效,准确地说,应该是使得查询不走索引吧?怎么可能使索引失效呢?失效我感觉应该是索引状态为INVALID才是吧。

暂无图片 评论
暂无图片 有用 0
刘晓华
2023-06-16
是的,你说的对
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏