脚本之查询曾经在某个表上执行过的所有SQL
来源:互联网 发布:企业开淘宝店怎样记账 编辑:程序博客网 时间:2024/04/29 09:48
查询运行在某个表上的所有SQL
我们在查询和分析时候常会要查看某个表上运行的所有SQL,这里就简要举三个方法,其实就是对三个动态性能表的熟练查询。
申明:这里说的所有SQL指的是存在于v$sql中还没有被age out(Ps:老化移出)出去的SQL。
第一种方法最简单,也最不准确,就是直接查询sql_text:
select * from v$sql where lower(sql_text) like ‘%TABLE_NAME%’
最不准确是因为:
1. table_name可能会折行,like就无法匹配。
2. table_name可能同名,但是owner不一样。
3. 如果用户查询的是view或者synonym,而SQL语句中没有真实的表名。
使用这种方法主要是在当你要查询某个已知SQL的统计信息的时候。
第二种方法是通过查询v$sql_plan:
select * from v$sql where hash_value in (select hash_value from v$sql_plan where object_owner=’xxx’ and object_name=’TABLE_NAME’);
SQL被分析后,执行计划会被存储在v$sql_plan中,object_name就是执行计划里面的name那一列。So......此法可避免上面的三种情况。
但是此法也有个问题,就是当SQL执行计划中没有查询表的时候,SQL不会被显示。
例:下面SQL的执行计划中没有表名,只有索引名。
SYS@XFAN: SQL> explain plan for select * from test where x=1;
Explained.
SYS@XFAN: SQL> @?/rdbms/admin/utlxpls
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1416057887
-------------------------------------
| Id | Operation | Name |
-------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | INDEX RANGE SCAN | TEST_IDX |
-------------------------------------
这时候查询表名是得不到该SQL的,必须查询索引名字。所以须将表名和索引名都加到object_name中:
select * from v$sql where hash_value in (select hash_value from v$sql_plan where
object_owner=’xxx’ and object_name in (‘TABLE_NAME’,'INDEX1_NAME’,'INDEX2_NAME’,…));
另外这种方法也可以用于查询哪些SQL使用了该索引。
第三种方法是查询 v$object_dependency表:
select * from v$sql where hash_value in (select FROM_HASH from v$object_dependency where TO_OWNER=’table owner’ and TO_NAME=’table name’);
此法是比较准确的,即使SQL中使用了view或者synonym,还是可以找到SQL。但它不支持第二种的索引查询,dependency关系只是和表有关。
关于作者
- 脚本之查询曾经在某个表上执行过的所有SQL
- 如何查询运行在某个表上的所有SQL
- SQL查询某个时间段购买过商品的所有用户
- Sql Server 在数据库中所有表所有栏位 找出匹配某个值的 脚本
- 在服务器上的所有数据库上执行脚本
- 怎么 查看数据库最近曾经执行过的SQL语句
- 在ORACLE得到某个表所有列的注释的查询SQL
- SQL Server 学习笔记④ 查询某个数据所在数据库表中的哪个字段上出现过的存储过程
- 查询SQL Server中某个表的所有列名
- sql查询数据库中有某个值的所有表
- sql server 查询某个表的所有触发器名称
- sql server 查询某个表的所有触发器名称
- sql server 查询某个表的所有触发器名称
- oralce 查询执行过的sql
- 查询SQLSERVER执行过的SQL记录
- SQL语句之查找一个表在另一个表上的所有映射(如学生在选课表上的所有映射,即查询选修所有课程的学生姓名)
- 查看所有执行过的SQL语句&查询最耗IO资源的SQL语法&硬件性能瓶颈
- sql工具:一条sql语句,查询sql server某个指定表的所有列及其属性
- 给想提高的ios程序员一些建意
- android应用多线程守护让你很难杀死它
- android学习之利用MediaPlayer制作音乐播放器
- 校园助手APP--昨天看代码发现了一个好东西——UncaughtExceptionHandler
- 不知道的JavaScript Console调试命令
- 脚本之查询曾经在某个表上执行过的所有SQL
- 把现有Unity3d游戏向Windows Phone 8.1移植(类库兼容)
- AndEngine 入门---《Android游戏开发实践指南》带来的困扰(一)
- 你知道输出结果么?
- Python 代码调试技巧
- flume参考手册
- ImageView 使用研究
- WPF学习 第十一章2 触发器
- wcscpy与_tcscpy关系 strcpy_s与strcpy比较