oracle資料庫中執行的sql,很多時候會因為種種原因産生多個不同的執行版本,一個遊标的版本過多很容易引起資料庫的性能問題,甚至故障。
有時候一個sql的版本數量可能多達數萬個,以下是我之前在"雲和恩墨大講堂”分享過的一個案例。這個報告中的 sql,最高達到了26萬個 sql 版本。算是我見過的“之最”之一。
産生sql多版本的原因很多,通過如下的一些測試我們可以稍微來看看如何分析和找到可能的原因。
以下作為一個基礎測試資料,一條基本的sql查詢:
create table t1(c1 int, c2 nvarchar2(100)); alter system flush shared_pool; var b1 number; var b2 varchar2(10); exec :b1 := 1; exec :b2 := '0'; select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;
如果我們修改了優化器參數、環境變量、綁定變量等,都可能使得sql發生重新解析,産生不同的子遊标,也就是不同的version。
從oracle 9i開始,oracle對中文語言方式(simplified chinese和traditional chinese)提供了多種排序方式。主要由以下四種,大家可以進行修改嘗試:
當然可以逐一嘗試:
以上測試是基于11.2.0.3版本,在oracle 12c中,相關的可能因素已經多達64個,參考官方手冊可以了解 v$sql_shared_cursor 的更詳細資訊。