第一種方法最簡單,也最不準確,就是直接查詢sql_text
select * from v$sql where lower(sql_text) like ‘%TABLE_NAME%’
最不準確是因為他有幾個問題:
1. table_name可能會被折行,這樣like就無法被匹配
2. 可能存在表名一樣,但是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那一列。這種方法可以避免上面所說的三個問題。
但是這個方法也有個問題,就是當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關系只是和表有關。