2012-02-24 84 views
1

我有一個在oracle中的表的索引,我不知道它正在使用或不使用它。有沒有辦法記錄所有使用該索引的語句?如果沒有,有沒有辦法知道該索引是否正在使用?如何記錄在oracle中的索引上執行的語句?

謝謝,

+1

你的最終目標是什麼,即你爲什麼要這樣做?你想知道哪些索引被使用,哪些不是?就好像你在數據庫中有很多事情一樣,你可能不得不做一些非常討厭的東西來回答你的問題,並且可能有更簡單的方法來解決它。 – Ben 2012-02-24 00:26:47

+0

最終我需要知道我是否可以刪除桌面上的某些索引。 – 2012-02-24 15:17:02

回答

2

瞭解最終目標肯定會有所幫助。

您可以查詢GV$SQL_PLAN表看到在共享池中哪些查詢使用特定指數

SELECT * 
    FROM gv$sql_plan 
WHERE object_owner = <<owner of object> 
    AND object_name = <<name of index>> 

根據您的系統,但是,SQL語句可能不會停留在共享池中特別長,所以你可能需要相對頻繁地進行調查以確保您不會錯過任何事情。根據Oracle版本,版本和許可選項,您也可以查詢AWR表以獲取歷史計劃信息。但是,這隻會提供有關查詢的信息,這些查詢的成本足夠昂貴以至於在AWR快照中捕獲這些查詢。

SELECT * 
    FROM dba_hist_sql_plan 
WHERE object_owner = <<owner of object> 
    AND object_name = <<name of index>> 

如果你正在嘗試完成的是要弄清楚是否正在使用的索引,但是,你可能想使用類似index monitoring,讓正在使用哪些指標甲骨文軌道。但請注意,這種方法存在缺陷。例如indexes on foreign keys對於高效刪除是必需的,可能不會被標記爲由索引監視使用(也不會僅通過查看查詢計劃來捕獲它們)。儘管索引本身沒有被使用,索引監測也可能會丟失statistics on an index are used想出一個有效計劃的情況。

+0

如果我的最終目標是放棄不影響生產的指數,是否有另一種工具可以提供這些信息? – 2012-02-24 16:22:54

+0

@SeanNguyen - 首先,請注意,即使沒有任何聲明曾使用特定索引,但這並不一定意味着您可以放棄它而沒有風險。關於索引的統計信息(或者由於列索引而收集的列統計信息)可能是有可能的。您可以使用索引監控(更新我的答案),但也有缺陷。 – 2012-02-24 16:39:15

+0

我的索引是一個空間索引。它看起來不像我可以監控域索引。這是一個錯誤:SQL錯誤:ORA-29871:域索引的無效更改選項 – 2012-02-27 15:28:12