DB2中SORTHEAP、SHEAPTHRES_SHR和SHEAPTHRES引數的用法(轉自飛天)
分類:
在DB2實踐中,我們經常發現很多使用者對排序的幾個引數使用不當,造成效能的嚴重下降。本文詳細介紹這幾個引數的使用原理,並介紹在新版本中v9.1的一些變化,希望對大家有所幫助。
1) DB2 v8
當 需要對資料行進行順序讀取(order)時,比如order by\group by\distinct等,如果沒有索引滿足要求,或者最佳化器認為索引的代價更高時,就需要掃描資料表並進行排序。DB2裡,存在兩種型別的排序:私有排 序(private sort)和共享排序(shared sort)。我們知道,DB2的記憶體模型包括:例項級共享記憶體、資料庫級共享記憶體、應用共享記憶體和代理記憶體。其中,私有排序就發生在代理記憶體(agent private memory);而共享排序發生在資料庫共享記憶體。
對於私有排序,例項配置引數sheapthres指定了某個給定時間可為所有私有排序分配的軟記憶體限制(soft limit)。當為私有排序分配的記憶體達到了此限制,新請求的私有排序的記憶體大小分配將會減少。同時,在db2diag.log日誌裡會給出提示:
"Not enough memory available for a (private) sort heap of size size of sortheap. Trying smaller size..."
當 出現此類錯誤的時候,需要檢查是否分配了太大的sortheap,sortheap指定了為每個私有排序分配的最大記憶體,這是個資料庫配置引數,預設值是 256個4k頁,即1M大小。對於大部分OLTP應用來說,預設值就可滿足要求。如果設的太大,會很容易超出sheapthres限制。對於OLAP應 用,往往需要處理大量資料,對排序的要求也會增加,可適當增加sortheap和sheapthres的值。
當 設定了intra-partition分割槽內並行或者connection contentrator(連線集中器,當MAX_CONNECTIONS>MAX_COORDAGENTS時)時,DB2可能選擇會共享排序。如 果執行共享排序,那麼排序發生在資料庫共享記憶體,可供分配的共享排序大小由sheapthres_shr資料庫引數來控制,這個值是硬限制(hard limit)。當達到此限制後,請求排序的新的應用會收到SQL0955(reason code 2)錯誤,只有當消耗的共享排序值低於此限制後才允許新應用請求共享排序。對於共享排序,當資料庫啟用或第一次連線時就會分配sheapthres_shr引數指定的資料庫共享記憶體。
當發現排序次數太多或者有排序溢位的時候,需要檢查是否在表上建立了合適的索引。通常大的表掃描會導致的大量的排序,嚴重影響效能。
intra-partition parallelism:指的是在一個單分割槽資料庫中把一個操作分成多個部分,然後同時執行。比較典型的有index creation,complex sql query,load等,透過enable intra-partition,可以充分利用SMP的多處理器的處理能力。
2)DB2 v9.1的變化
在DB2 v9.1中,sheapthres_shr引數是一個軟限制。需要時,排序記憶體堆可使用其他未使用的資料庫共享記憶體。當例項級引數sheapthres設 置為0時,僅適用資料庫共享記憶體進行共享排序,排序記憶體分配受sheapthres_shr配置引數值的約束。
而且,僅當資料庫管理器配置引數 sheapthres 設定為 0 時,才允許自動調整 sheapthres_shr和sortheap。在DB2 V8 中,無論如何設定 sheapthres 引數值,只有 SMP 環境中(intra_partition=yes)的排序或執行可由多個代理程式訪問的集中器的排序才會消耗共享記憶體。在 DB2 V9.1 中,如果將sheapthres資料庫管理器配置引數設定為 0,則所有排序都將使用共享記憶體。如果將 sheapthres 資料庫管理器配置引數設定為大於 0 的值,則只有 SMP 環境中的排序或執行可由多個代理程式訪問的集中器的排序將會消耗共享記憶體,其餘進行私有排序。
3)使用建議
- 透過get snapshot for sorts on 進行監控鎖的使用 (需先開啟開關 update monitor switches using sort on)
- sheapthres的值依賴於sortheap的大小和應用的併發執行數,應用的併發執行數可以透過get snapshot for database來監控。考慮到單個應用需要多次排序,sheapthres可設為:sortheap*併發數*2
- 減少排序次數,建立合適的索引
- 需要對大表進行排序時,適當增大sortheap和sheapthres引數值
- 對於v9.1,建議用預設值。(dbm cfg: sheapthres=0 ; db cfg: sheapthres_shr=automatic, sortheap=automatic
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26224914/viewspace-2125286/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle中引數session和 processes的設定(轉)OracleSession
- iOS可變引數(不定引數)的用法iOS
- Python 中 key 引數的含義及用法Python
- Python中key引數的含義及用法Python
- TCanvas中SaveDC和RestoreDC的用法 (轉)CanvasREST
- Shell 中 $ 關於指令碼引數的幾種用法指令碼
- PHP中引號的用法PHP
- (轉)Oracle中的啟動引數檔案:spfile和pfileOracle
- 彙編中引數的傳遞和堆疊修正(轉)
- DB2中的限制之二數值的限制 (轉)DB2
- JVM引數以及用法JVM
- mysql反引號和引號的用法MySql
- js中關於單引號和雙引號的一點用法JS
- asp.net中關於雙引號和單引號的用法ASP.NET
- 關於 Express API app.use 中的 path 引數用法ExpressAPIAPP
- C#中ref、out及特殊說明引數的用法C#
- C#中命名引數和可選引數C#
- DB2 效能最佳化引數DB2
- Laravel同時接收路由引數和查詢字串中的引數Laravel路由字串
- 瞭解路由器中的管理間距和量度引數(轉)路由器
- C# 中的 in 引數和效能分析C#
- linux 中解析命令列引數 (getopt_long用法)Linux命令列
- javascript的雙引號和單引號的用法和區別JavaScript
- Oracle中INITRANS和MAXTRANS引數Oracle
- python sorted()函式的引數用法Python函式
- jquery-autocomplete的用法及引數jQuery
- python引數解析argparse用法Python
- oracle中INSERT對應db2中的LOCATE函式用法OracleDB2函式
- 李飛飛親自撰文:大模型不存在主觀感覺能力,多少億引數都不行大模型
- Oracle和SUN Solaris核心引數(轉)Oracle
- DB2 HADR相關引數1DB2
- kettle 引數——變數引數和常量引數變數
- 轉 sql 中 case 的用法SQL
- 計算兩個日期相差的天數,Calendar用法
- C#中的值引數,引用引數及輸出引數C#
- laravel hasManyThrough用法及引數LaravelASM
- Java中static變數作用和用法詳解Java變數
- Qt5.9中QObject::connect()函式用法(函式使用的前提條件和引數詳解)QTObject函式