版本11gR2中引入cursor sharing遊标共享和mutex互斥鎖增強的一些特性,而這些特性也帶來了一些問題(主要展現在版本11.2.0.1和11.2.0.2上,11.2.0.3上基本已經修複)。 Cursor Obsolescence遊标廢棄是一種SQL Cursor遊标管理方面的增強特性,該特性啟用後若parent cursor父遊标名下的子遊标child cursor總數超過一定的數目,則該父遊标parent cursor将被廢棄,同時一個新的父遊标将被開始。 這樣做有2點好處:
避免程序去掃描長長的子遊标清單child cursor list以找到一個合适的子遊标child cursor
廢棄的遊标将在一定時間内被age out,其占用的記憶體可以被重新利用
實際在版本10g中就引入了該Cursor Obsolescence遊标廢棄特性,當時child cursor 的總數閥值是1024, 但是這個閥值在11g中被移除了,這導緻出現一個父遊标下大量child cursor即high version count的發生;由此引發了一系列的版本11.2.0.3之前的cursor sharing 性能問題,主要症狀是版本11.2.0.1和11.2.0.2上出現大量的Cursor: Mutex S 和 library cache lock等待事件。 增強更新檔Enhancement patch《Bug 10187168 - Enhancement to obsolete parent cursors if VERSION_COUNT exceeds a threshold》就該問題引入了新的隐藏參數_cursor_obsolete_threshold(Number of cursors per parent before obsoletion.),該"_cursor_obsolete_threshold"參數用以指定子遊标總數閥值,若一個父遊标的child cursor count<=>version count高于"_cursor_obsolete_threshold",則觸發Cursor Obsolescence遊标廢棄特性。 注意版本11.2.0.3中預設就有"_cursor_obsolete_threshold"了,而且預設值為100。 對于版本11.1.0.7、11.2.0.1和11.2.0.2則都有該Bug 10187168的bug backport存在,從2011年5月開始就有相關針對的one-off backport更新檔存在。 但是這些one-off backport更新檔不使用"_cursor_obsolete_threshold"參數。在版本11.1.0.7、11.2.0.1和11.2.0.2上需要設定合适的"_cursor_features_enabled"(預設值為2)參數,并設定必要的106001 event,該event的level值即是child cursor count的閥值,必須設定該106001事件後該特性才生效。 但是請注意
本文轉自maclean_007 51CTO部落格,原文連結:http://blog.51cto.com/maclean/1278491