2011-09-06 91 views
1

這個想法是當用戶運行一個查詢並且具有成本高於特定閾值的錯誤笛卡爾時。然後oracle將它發送給我和用戶。我已經嘗試過幾件事,但它們在運行時不起作用。如果蟾蜍和sql開發人員可以看到執行計劃。那麼我相信那裏有我剛剛找到的信息。或者我可能不得不採用另一種邏輯。觸發器@執行計劃..笛卡爾產品

回答

1

一般來說,這可能是不可能的。

從理論上講,如果你真的確定,你可能會產生細粒度審計(FGA)觸發了系統中的每一個表中火爲每SELECTINSERTUPDATEDELETE,得到SQL_IDV$SESSION,加入到V$SQL_PLAN,並實現你想要的任何邏輯。這在技術上是可行的,但它會涉及到相當多的代碼,並且會爲系統中的每個查詢添加潛在的大量開銷。這可能不實際。

而不是試圖用一個觸發器,你可以寫原定通過DBMS_JOBDBMS_SCHEDULER包,將查詢V$SESSION所有活動會話每隔幾分鐘運行一個程序,加入到V$SQL_PLAN,和你想什麼邏輯來實現。這消除了每次用戶執行任何語句時嘗試運行觸發器的開銷。但是它仍然需要大量的代碼。

根據您嘗試解決的業務問題,可能會更容易創建resource limits on the user's profile,以便Oracle強制限制任何單個SQL語句可以使用的資源數量。例如,您可以設置用戶的CPU_PER_CALL,LOGICAL_READS_PER_CALLCOMPOSITE_LIMIT來限制Oracle殺死它之前單個語句可以執行的CPU數量,邏輯I/O數量或CPU和邏輯I/O的組合限制。

如果你想要更多的控制,你可以使用Oracle Resource Manager。這可以允許您執行任何操作,防止Oracle運行某些用戶的查詢(如果估計它們運行時間過長或者限制一組用戶在爭用這些資源時可以使用的資源)。 Oracle可以自動將特定用戶的長時間運行的查詢移動到較低優先級的組,它可以自動終止長時間運行的查詢,它可以阻止它們首先運行,或者這些事情的任意組合。

+0

謝謝,這讓我的思維開始思考不同。請問如何可能像蟾蜍和SQL開發人員的應用程序可以和用戶像我一樣可以。或者這是你已經提到的,我需要一個非常大的一段代碼。 – Imran

+0

@Imran - 沒有什麼能夠阻止你訪問查詢計劃(儘管Toad和SQL Developer做的獨立會話要容易得多)。您可以在'SQL_ID'上將'V $ SESSION'連接到'V $ SQL_PLAN',並在每個會話中查看當前正在執行的SQL語句的查詢計劃 - 如果您編寫了計劃作業,您將會這樣做。只是需要編寫邏輯來分析查詢計劃,並且人們想要在這個一般空間中解決的大多數問題都可以使用配置文件和/或資源管理器更好地解決。 –

+0

謝謝真的很感謝你的答案 – Imran