1.1 性能指標(biāo)
數(shù)據(jù)庫性能一般用兩個(gè)方面的指標(biāo)來衡量:響應(yīng)時(shí)間和吞吐量。響應(yīng)越快,吞吐量越大,數(shù)據(jù)庫性能越好。響應(yīng)時(shí)間和吞吐量有些情況下不能一起得到改善。
1.2 調(diào)優(yōu)級別
對Sybase數(shù)據(jù)庫性能調(diào)優(yōu),可以從四個(gè)方面進(jìn)行:
一) 操作系統(tǒng)級:對網(wǎng)絡(luò)性能、操作系統(tǒng)參數(shù)、硬件性能等作改進(jìn)。
二) SQL Server級:調(diào)整存取方法,改善內(nèi)存管理和鎖管理等。
三) 數(shù)據(jù)庫設(shè)計(jì)級:採用降範(fàn)式設(shè)計(jì),合理設(shè)計(jì)索引,分佈存放數(shù)據(jù)等。
四) 應(yīng)用程序級:採用高效SQL語句,合理安排事務(wù),應(yīng)用游標(biāo),處理鎖。
本文對第一、第三、第四方面的內(nèi)容不做討論,第二方面提到的概念只適用於Sybase數(shù)據(jù)庫。
1.3 調(diào)優(yōu)工具
在分析Sybase數(shù)據(jù)庫的性能時(shí),要用到一些數(shù)據(jù)庫系統(tǒng)本身提供的性能調(diào)優(yōu)工具,包括幾個(gè)系統(tǒng)存儲過程:
名稱 功能簡要介紹
sp_sysmon 企業(yè)級系統(tǒng)性能報(bào)告工具
sp_lock 查看鎖的情況
sp_who 查看線程的活動情況
sp_procqmode 存儲過程的查詢處理模式
sp_configure 配置SQL Server系統(tǒng)級參數(shù)
sp_estspace 估計(jì)創(chuàng)建一個(gè)表需要的空間和時(shí)間
sp_spaceused 估計(jì)表的總行數(shù)及表和索引佔(zhàn)用的空間
sp_monitor 監(jiān)視CPU、I/O的統(tǒng)計(jì)活動情況
在利用isql等一些工具時(shí),還可以設(shè)置查詢會話中的幾個(gè)選項(xiàng),來顯示SQL語句執(zhí)行時(shí)的各種統(tǒng)計(jì)分析結(jié)果:
指令 On 的含義
set noexec on/off 分析SQL語句後,還要執(zhí)行
set statistics io on/off 統(tǒng)計(jì)SQL執(zhí)行所需I/O
set statistics time on/off 統(tǒng)計(jì)SQL語句執(zhí)行耗時(shí)
set showplan on/off 顯示查詢計(jì)劃
1.4 sp_sysmon 的使用
企業(yè)級性能報(bào)告工具、系統(tǒng)存儲過程 sp_sysmon 的使用方法:
在isql 下,首先輸入 sp_sysmon 'begin_sample' 啟動一個(gè)報(bào)告採樣過一段時(shí)間後,再輸入 sp_sysmon 'end_sample' 結(jié)束上次報(bào)告採樣
或者緊跟一參數(shù) sp_sysmon 'end_sample', "dcache" 結(jié)束上次報(bào)告採樣, 但只顯示數(shù)據(jù)緩衝(Data Cache Management)這一部分的情況。
能替換dcache的可選參數(shù)如下表所示:
參數(shù) 參數(shù)全稱,內(nèi)容範(fàn)圍解釋
Dcache Data Cache Management,數(shù)據(jù)緩衝
Kernel Kernel Utilization,有關(guān)引擎、網(wǎng)絡(luò)和I/O等情況
Wpm Worker Process Management
Parallel Parallel Query Management
Taskmgmt Task Management
Appmgmt Application Management
Esp ESP Management
Housekeeper Housekeeper Task Activity
Monaccess Monitor Access to Executing SQL
Xactsum Transaction Profile
Xactmgmt Transaction Management
Indexmgmt Index Management,索引管理
Mdcache Metadata Cache Management
Locks Lock Management,鎖管理
Pcache Procedure Cache Management
Memory Memory Management
Recovery Recovery Management
Diskio Disk I/O Management,磁盤I/O管理
Netio Network I/O Management
1.5
用sp_sysmon可以得到數(shù)據(jù)庫系統(tǒng)的性能基準(zhǔn)報(bào)告,但要在比較穩(wěn)定的狀態(tài)下產(chǎn)生,方可作為參考和對照的依據(jù)。
1.6 理解存儲方法
只有清楚數(shù)據(jù)庫存儲數(shù)據(jù)的底層細(xì)節(jié),如數(shù)據(jù)頁、索引頁的物理結(jié)構(gòu),每一行的大小計(jì)算,不同類型列佔(zhàn)用的寬度等等問題,才能對各種調(diào)優(yōu)措施有個(gè)深入領(lǐng)會。關(guān)於這個(gè)問題,比較複雜和細(xì)緻,請自行參閱有關(guān)書籍。
一般地,對於更改數(shù)據(jù)的操作,要盡量促進(jìn)數(shù)據(jù)庫進(jìn)行直接更新( Direct Updates ),所以要遵守以下幾條原則:
1)除非必要,避免使用允許null值的列和可變長度的列。
2)如果varchar 和 varbinary 列填充得比較滿,毫不猶豫轉(zhuǎn)成 char 和 binary 列。對於建表時(shí)指定的頁填充率(page fillfactor)參數(shù),要權(quán)衡確定數(shù)值大小。一般:小值,適合於有許多隨機(jī)插入的表,該表的數(shù)據(jù)經(jīng)常被刪除,又經(jīng)常被增加;大值,適合於大多數(shù)的數(shù)據(jù)被增加到表末尾,如客票系統(tǒng)的售票存根和退票存根表。
2 SQL Server級的調(diào)優(yōu)
2.1 管理共享內(nèi)存
數(shù)據(jù)庫性能優(yōu)化的首要方面是最優(yōu)管理內(nèi)存。數(shù)據(jù)庫佔(zhàn)用的共享內(nèi)存分成數(shù)據(jù)緩衝(data cache)、存儲過程緩衝(Procedure cache)等幾塊。在isql 下使用 sp_configure 'cache' 可以看到存儲過程緩衝所佔(zhàn)百分比(procedure cache percent),整個(gè)數(shù)據(jù)緩衝大?。╰otal data cache size) 等參數(shù)。
2.1.1 存儲過程緩衝(Procedure cache)
存儲過程緩衝保持以下對象的查詢計(jì)劃:
Procedures :存儲過程
Triggers :觸發(fā)器
Views :視圖
Rules :規(guī)則
Defaults :缺省
Cursors :游標(biāo)
存儲過程不可重入,意即每個(gè)並發(fā)用戶調(diào)用都會在內(nèi)存中產(chǎn)生一個(gè)拷貝。
Procedure, triggers, and views 當(dāng)它們被裝載到procedure cache中時(shí),被查詢優(yōu)化器優(yōu)化,建立查詢計(jì)劃。如果存儲過程在緩衝中,被調(diào)用時(shí)就不需要重新編譯。如果procedure cache太小,存儲過程就會經(jīng)常被其他調(diào)入內(nèi)存的存儲過程沖洗掉,當(dāng)再次被調(diào)用時(shí),存儲過程又被調(diào)入內(nèi)存,再重新編譯,用戶請求因此不得不等待。最嚴(yán)重的情況,如果procedure cache不夠,存儲過程甚至都不能運(yùn)行。所以在內(nèi)存足夠的情況下,procedure cache percent 參數(shù)盡可能大一些。
2.1.2 數(shù)據(jù)緩衝(Data Cache)
數(shù)據(jù)緩衝用來緩存數(shù)據(jù)頁和索引頁,是除去存儲過程緩衝,系統(tǒng)其他佔(zhàn)用的緩衝外的剩餘內(nèi)存空間。通過給服務(wù)器增加物理內(nèi)存擴(kuò)大數(shù)據(jù)緩衝,是最有效的方法。當(dāng)然,如果不能加內(nèi)存,就只能通過減少存儲過程緩衝的比例等方法來擴(kuò)大數(shù)據(jù)緩衝了。通過 sp_configure "extent I/O buffers", 20(可調(diào)) 命令,在Data Cache中保留一些頁專用於創(chuàng)建索引時(shí)使用,可以顯著提高創(chuàng)建索引的性能。但要注意每開闢一個(gè)緩衝佔(zhàn)用16K 字節(jié)的系統(tǒng)內(nèi)存。
2.1.3 命名緩衝
通過如下的命令:
1>; sp_helpcache
2>; go
查看某客票數(shù)據(jù)庫中命名緩衝,得到的結(jié)果如下:
Cache Name Config Size Run Size Overhead
------------------------ ------------- ---------- ----------
DS30_Tran_Log 20.00 Mb 20.00 Mb 2.05 Mb
Systemtable 20.00 Mb 20.00 Mb 2.05 Mb
default data cache 0.00 Mb 4462.86 Mb 464.97 Mb
left_base_center 16.00 Mb 16.00 Mb 1.57 Mb
price_cache 8.00 Mb 8.00 Mb 0.85 Mb
可以看出有4個(gè)命名緩衝,分別綁定客票系統(tǒng)的應(yīng)用日誌表、一些重要且常用的系統(tǒng)表、余票表、票價(jià)系列表,另外1個(gè)是缺省數(shù)據(jù)緩衝。這種配置還不是最合理,應(yīng)該進(jìn)一步把Systemtable這個(gè)命名緩衝細(xì)分成很多個(gè),每一個(gè)單獨(dú)存放一張系統(tǒng)表。
2.1.4 緩衝策略
緩衝策略是指把數(shù)據(jù)提前讀入內(nèi)存的機(jī)制,分預(yù)取策略(Prefetch rategy,即大I/O策略)和取後馬上丟棄策略(Fetch-and-Discard)、提示策(Hints)等幾種。可以在三個(gè)級別上設(shè)置表數(shù)據(jù)的預(yù)取策略(Prefetch Strategy,即大I/O策略)於:對像級,會話級,查詢級。如果三個(gè)級別上都有設(shè)置,它們發(fā)生作用的優(yōu)先順序是:對像級 >; 會話級 >; 查詢級。對於如何在查詢級利用指定的緩衝池,可以查看下面例子(使用4K緩衝池):
select au_fname, au_lname
from authers (prefetch 4)
where au_id in ( A372020631, ..., A1887081515 )
go
DSS應(yīng)用往往得益於大的I/O,應(yīng)該放開large I/O strategy預(yù)取策略。
如果一個(gè)應(yīng)用傾向於OLTP特徵,用戶能在會話級關(guān)掉Prefetch來提高性能。對於OLTP應(yīng)用,關(guān)閉large I/O strategy預(yù)取策略。對於所取到的頁不會有重用的情況,放開fetch-and-discard策略??推毕到y(tǒng)對存根數(shù)據(jù)進(jìn)行統(tǒng)計(jì)的應(yīng)用,如財(cái)收日結(jié)賬,營銷分析數(shù)據(jù)整理模塊和綜合查詢等,都可以利用這一結(jié)論。查看幾個(gè)操作頻繁且較大的表上的緩衝策略,用如下命令:
sp_cachestrategy center,seat_area
sp_cachestrategy center,sale_record0505
2.2 管理鎖
2.2.1 頁鎖升級閥限
優(yōu)化鎖的重要考慮是設(shè)置頁級鎖升級升級成表級鎖的閥限。要盡量避免頁鎖很快升級成表級鎖。在某客票數(shù)據(jù)庫中,用sp_configure 『lock』可以看到如下結(jié)果:
deadlock checking period 500 0 1000 1000
number of locks 5000 46875 200000 200000
page lock promotion HWM 200 0 10000 10000
page lock promotion LWM 200 0 200 200
page lock promotion PCT 100 0 90 90
可以看到頁鎖升級的閥限有三個(gè):HWM(最高點(diǎn)) 為10000,LWM(最低點(diǎn))為200,PCT為90。Sybase數(shù)據(jù)庫內(nèi)部根據(jù)PCT值按公式PCT*TAB_SZ/100得出計(jì)算閥限,如果計(jì)算閥限 < LWM, 鎖升級發(fā)生在LWM值;如果計(jì)算閥限 < HWM,鎖升級發(fā)生在HWM值。如果 LWM < 計(jì)算閥限 < HWM ,鎖升級發(fā)生在PCT*TAB_SZ/100值。
鎖升級閥限設(shè)置分對像級和服務(wù)器級兩種。
針對對像級設(shè)置(數(shù)據(jù)庫上的表或表上的索引),配置命令是:
sp_setpglockpromote {"database" | "table"}, objname, new_lwm,new_hwm, new_pct
針對服務(wù)器級設(shè)置,配置命令是:
sp_setpglockpromote server, NULL, new_lwm, new_hwm, new_pct。
如果要?jiǎng)h除掉對像級上的頁鎖升級閥限,用:
sp_dropglockpromote {"database" | "table"}, objname
2.2.2 減少鎖爭奪的方法:
1)降範(fàn)式設(shè)計(jì)數(shù)據(jù)庫,創(chuàng)建冗余表。
2)把堆表(沒有聚族索引的表)分區(qū)。
3)對於小表,使用fillfactor和max_rows_per_page來減少行密度,從而使各行數(shù)據(jù)分佈到許多頁(此方法適用於SQL Server 11版,對於11.9.2版以後的Sybase數(shù)據(jù),有了行級鎖,此方法必要性不大)。
2.3 管理臨時(shí)庫(tempdb)
管理臨時(shí)庫一個(gè)重要原則是要避免臨時(shí)表跨多個(gè)設(shè)備,可以把tempdb從master設(shè)備中分離出來,放到一個(gè)單獨(dú)的設(shè)備上去。這樣可以減少存取系統(tǒng)表時(shí)對I/O資源的爭奪。用sp_dropsegment 存儲過程從master設(shè)備中移除tempdb的default段和system段。為了進(jìn)一步提高tempdb的I/O速度,可以考慮把tempdb整個(gè)放在RAM 驅(qū)動器或固態(tài)存儲設(shè)備上,存取速度是一般磁盤的1000倍。一般情況下,tempdb會非常頻繁地爭奪和佔(zhàn)用缺省數(shù)據(jù)緩衝,因?yàn)椴樵儠捴杏性S多臨時(shí)表要?jiǎng)?chuàng)建、計(jì)算和刪除。所以推薦把tempdb綁定到它自己的命名緩衝,這樣可以防止臨時(shí)對像在內(nèi)存中的活動沖洗掉缺省數(shù)據(jù)緩衝中的其他對象,利於在多個(gè)緩衝間展開I/O。在使用臨時(shí)表的時(shí)候,還有一個(gè)原則:盡量縮小表規(guī)模和行的寬度,每一行只包括必要的列。例如在用select * into生成臨時(shí)表時(shí),如果只需要幾個(gè)列的數(shù)值,就不要用這樣的語句,而直接選取需要的列。
2.4 使用多引擎(Multiple Network Engines)
如果操作系統(tǒng)使用了多個(gè)CPU,那麼用sp_configure 配置數(shù)據(jù)庫的參數(shù):在線引擎數(shù)(max online engines),可以擴(kuò)展系統(tǒng)的網(wǎng)絡(luò)I/O容量,分佈網(wǎng)絡(luò)I/O到各個(gè)引擎,從而提高性能,允許更多的用戶連接。
在用戶登錄數(shù)據(jù)庫時(shí),總是先登錄到引擎0,由引擎0在可用引擎隊(duì)列中選擇一個(gè)掛最少連接的引擎來傳遞socket描述符,從而重定向連接到那個(gè)引擎,由該引擎去處理跟此用戶連接相關(guān)的所有網(wǎng)絡(luò)活動。
對於多引擎SMP結(jié)構(gòu),SQL Server引入了自旋鎖(spinlock)的一種數(shù)據(jù)結(jié)構(gòu),在多個(gè)引擎間共享。對於不同類型的任務(wù),在哈希表上分配不同的自旋鎖,有頁鎖自旋鎖、表鎖自旋鎖和地址自旋鎖。
自旋鎖的配置:
sp_configure "page lock spinlock ratio", newval
sp_configure "table lock spinlock ratio", newval
sp_configure "address lock spinlock ratio", newval
增大數(shù)值,可以減少碰撞,提高並發(fā)操作度。但是每一個(gè)自旋鎖結(jié)構(gòu)要佔(zhàn)用256字節(jié)的內(nèi)存。
如果數(shù)據(jù)庫發(fā)生1279錯(cuò),可能原因:
1)不允許足夠的鎖,解決辦法是用sp_configure 調(diào)大 number of locks 數(shù)值
2)在engine freelock 緩衝中沒有足夠的鎖,解決辦法是用sp_configure調(diào)大 max engine freelocks 數(shù)值。
如果數(shù)據(jù)庫系統(tǒng)使用了4個(gè)引擎,那麼每個(gè)引擎的自由鎖緩衝中包含:each engine-specific freelock cache 包含 5000 * .20 /4 = 250 個(gè)鎖。
在平時(shí),經(jīng)常用sp_monitor和sp_sysmon監(jiān)視CPU使用率,如果所有CPU的利用率高於85%,增加CPU,然後增大數(shù)據(jù)庫的引擎數(shù),可以改善性能。
2.5 設(shè)備使用的優(yōu)化
把最常插入的表分區(qū),放在多個(gè)設(shè)備上,這樣可以創(chuàng)建多個(gè)頁鏈,從而改善多個(gè)並發(fā)插入時(shí)的性能,因?yàn)槊恳粋€(gè)插入都要找到頁鏈,頁鏈有多個(gè),就允許多個(gè)插入同時(shí)進(jìn)行。這一點(diǎn),尤其適用於客票系統(tǒng)的存根表和訂票存根表(CG30_RRT),所帶來的性能改善會非常明顯。
物理I/O的代價(jià)遠(yuǎn)大於邏輯I/O,所以要盡量減少磁盤進(jìn)行物理I/O的次數(shù),盡量多進(jìn)行內(nèi)存中的邏輯I/O。使用statistics io工具和sp_sysmon,來觀察磁盤I/O??梢耘渲檬褂么蟮腎/O來減少物理I/O的次數(shù),方法有三個(gè):
1)用更多的磁盤;
2)表和索引分開到不同的磁盤;
3)增加一次I/O系統(tǒng)參數(shù)值的大小。
SQL Server總是為I/O請求建立一個(gè)磁盤檢查的調(diào)度環(huán),用sp_configure "I/O polling process count"來提高數(shù)值,加長環(huán),可以降低引擎的檢查次數(shù),提高吞吐量。但較小的值一般有助於減少響應(yīng)時(shí)間。
對於可用的磁盤I/O控制塊,要查看操作系統(tǒng)文檔,用sp_configure "disk i/o structures"配置,這個(gè)數(shù)值要盡可能高。
分離日誌和數(shù)據(jù),到不同的設(shè)備;給tempdb自己的設(shè)備;分離表和索引到不同的設(shè)備。這些方法都可以減少I/O。
2.6 對事務(wù)處理的調(diào)優(yōu)
2.6.1 事務(wù)類型
事務(wù)處理無外乎三種:1,OLTP; 2, DSS; 3, OLTP + DSS 的混合負(fù)載
OLTP(聯(lián)機(jī)事務(wù)處理)的特點(diǎn):
? 數(shù)據(jù)插入、修改和刪除頻繁。
? 經(jīng)常操作的是單個(gè)記錄。
? 當(dāng)不適當(dāng)設(shè)計(jì)時(shí),傾向於碰撞和衝突。
DSS(決策支持系統(tǒng))的特點(diǎn):
? 數(shù)據(jù)修改不太頻繁。
? 如果有插入和刪除,是大批量的。
? 平時(shí)一般是只讀操作。
? 表連接很常見。
? 有比較特別的查詢。
OLTP + DSS 混合負(fù)載的特點(diǎn)權(quán)衡:
? 在性能方面要比較,是要吞吐量還是響應(yīng)時(shí)間。
? 在鎖方面要比較,是要並發(fā)性強(qiáng)呢還是要數(shù)據(jù)一致性強(qiáng)。
2.6.2 事務(wù)管理原則
一般的事務(wù)管理原則有:
1) 分解大的事務(wù)成多個(gè)小的事務(wù)。如客票數(shù)據(jù)的備份操作中,要?jiǎng)h除過期數(shù)據(jù),如果設(shè)計(jì)小事務(wù)做循環(huán),便不會影響應(yīng)用,完全可以做到任何時(shí)候備份和刪除,不一定非得等服務(wù)器閒的時(shí)候做。
2) 避免在單個(gè)事務(wù)中更新或刪除大量的數(shù)據(jù)行。比如客票系統(tǒng)的席位庫數(shù)據(jù)清理,即使在服務(wù)器閒的時(shí)候做這種操作,也會鎖定整個(gè)表,影響售票。
3) 盡量用可以接受的最低孤立級(isolation level),來提高並發(fā)度。如在余票查詢等功能的應(yīng)用中,使用這種孤立級,便可以最大程度地降低對售票的影響。
4) 提高事務(wù)吞吐量的措施包括:避免延遲更新;盡可能使用存儲過程等等。
2.6.3 跟事務(wù)特徵相關(guān)的數(shù)據(jù)庫可調(diào)參數(shù)或特性
相對於OLTP應(yīng)用,SQL Server有一些特性來滿足要求。
1) 命名緩衝(Named cache)
對於命名緩衝,可以配置多個(gè)不同大小的內(nèi)存池,來滿足不同的應(yīng)用需求。對於多個(gè)引擎的情況,命名緩衝還有一項(xiàng)重要的功能是降低自旋鎖的內(nèi)部爭奪。
2) 日誌I/O緩衝大小可配置
sp_logiosize ["default" | "size" | "all" ]
缺省值是4K,但如果4K內(nèi)存池沒有配置,SQL Server會使用2K大小的內(nèi)存池
3) 堆表可分區(qū),分佈插入操作到各個(gè)設(shè)備
適用於頻繁插入的表和有並發(fā)BCP倒入數(shù)據(jù)的表,如客票系統(tǒng)的售票存根和退票存根表。
4) 鎖升級閥限可配置。
相對於DSS應(yīng)用,SQL Server也有一些特性來滿足要求
1) 應(yīng)用大的 I/O 緩衝池
用sp_poolconfig來配置。
2) 綁定熱表到命名緩衝
如 sysindexes, syslogs, 注意如果把 syslogs 放到單獨(dú)的緩衝中,可以減少在缺省或其他命名緩衝上的自旋鎖爭奪。對於客票系統(tǒng)的train_dir, stop_time, 票價(jià)表, 取票存儲過程相關(guān)的表都可以放在單獨(dú)的命名緩衝上。
3) 取後丟棄緩衝策略 (Fetch-and-discard cache strategy)
不會沖洗掉緩衝中的常用對象,可以減少M(fèi)RU鏈的爭奪,較少對OLTP事務(wù)的干擾。
對於收入統(tǒng)計(jì)應(yīng)用,統(tǒng)計(jì)過往存根表中的數(shù)據(jù),可以應(yīng)用這一策略。
2.7 網(wǎng)絡(luò)方面的調(diào)優(yōu)
Sybase客戶和服務(wù)器之建傳遞的是TDS包,缺省大小是512字節(jié)。對於要傳輸大批量數(shù)據(jù)的應(yīng)用,如BCP、 文本/圖像的取用、大結(jié)果集SQL語句,要用下面的配置命令配置大的TDS包大小。
sp_configure "default network packet size", nnn
sp_configure "maximum network packet size", nnn
對於isql 和bcp,可以在應(yīng)用級指定TDS包的大?。篿sql -Usa -P –Annn,bcp -Usa -P –Annn。
注意在調(diào)大maximum network packet size的參數(shù)後,要增大 additional network memory 參數(shù),來適應(yīng) maximum network packet size 的要求。
數(shù)據(jù)庫性能一般用兩個(gè)方面的指標(biāo)來衡量:響應(yīng)時(shí)間和吞吐量。響應(yīng)越快,吞吐量越大,數(shù)據(jù)庫性能越好。響應(yīng)時(shí)間和吞吐量有些情況下不能一起得到改善。
1.2 調(diào)優(yōu)級別
對Sybase數(shù)據(jù)庫性能調(diào)優(yōu),可以從四個(gè)方面進(jìn)行:
一) 操作系統(tǒng)級:對網(wǎng)絡(luò)性能、操作系統(tǒng)參數(shù)、硬件性能等作改進(jìn)。
二) SQL Server級:調(diào)整存取方法,改善內(nèi)存管理和鎖管理等。
三) 數(shù)據(jù)庫設(shè)計(jì)級:採用降範(fàn)式設(shè)計(jì),合理設(shè)計(jì)索引,分佈存放數(shù)據(jù)等。
四) 應(yīng)用程序級:採用高效SQL語句,合理安排事務(wù),應(yīng)用游標(biāo),處理鎖。
本文對第一、第三、第四方面的內(nèi)容不做討論,第二方面提到的概念只適用於Sybase數(shù)據(jù)庫。
1.3 調(diào)優(yōu)工具
在分析Sybase數(shù)據(jù)庫的性能時(shí),要用到一些數(shù)據(jù)庫系統(tǒng)本身提供的性能調(diào)優(yōu)工具,包括幾個(gè)系統(tǒng)存儲過程:
名稱 功能簡要介紹
sp_sysmon 企業(yè)級系統(tǒng)性能報(bào)告工具
sp_lock 查看鎖的情況
sp_who 查看線程的活動情況
sp_procqmode 存儲過程的查詢處理模式
sp_configure 配置SQL Server系統(tǒng)級參數(shù)
sp_estspace 估計(jì)創(chuàng)建一個(gè)表需要的空間和時(shí)間
sp_spaceused 估計(jì)表的總行數(shù)及表和索引佔(zhàn)用的空間
sp_monitor 監(jiān)視CPU、I/O的統(tǒng)計(jì)活動情況
在利用isql等一些工具時(shí),還可以設(shè)置查詢會話中的幾個(gè)選項(xiàng),來顯示SQL語句執(zhí)行時(shí)的各種統(tǒng)計(jì)分析結(jié)果:
指令 On 的含義
set noexec on/off 分析SQL語句後,還要執(zhí)行
set statistics io on/off 統(tǒng)計(jì)SQL執(zhí)行所需I/O
set statistics time on/off 統(tǒng)計(jì)SQL語句執(zhí)行耗時(shí)
set showplan on/off 顯示查詢計(jì)劃
1.4 sp_sysmon 的使用
企業(yè)級性能報(bào)告工具、系統(tǒng)存儲過程 sp_sysmon 的使用方法:
在isql 下,首先輸入 sp_sysmon 'begin_sample' 啟動一個(gè)報(bào)告採樣過一段時(shí)間後,再輸入 sp_sysmon 'end_sample' 結(jié)束上次報(bào)告採樣
或者緊跟一參數(shù) sp_sysmon 'end_sample', "dcache" 結(jié)束上次報(bào)告採樣, 但只顯示數(shù)據(jù)緩衝(Data Cache Management)這一部分的情況。
能替換dcache的可選參數(shù)如下表所示:
參數(shù) 參數(shù)全稱,內(nèi)容範(fàn)圍解釋
Dcache Data Cache Management,數(shù)據(jù)緩衝
Kernel Kernel Utilization,有關(guān)引擎、網(wǎng)絡(luò)和I/O等情況
Wpm Worker Process Management
Parallel Parallel Query Management
Taskmgmt Task Management
Appmgmt Application Management
Esp ESP Management
Housekeeper Housekeeper Task Activity
Monaccess Monitor Access to Executing SQL
Xactsum Transaction Profile
Xactmgmt Transaction Management
Indexmgmt Index Management,索引管理
Mdcache Metadata Cache Management
Locks Lock Management,鎖管理
Pcache Procedure Cache Management
Memory Memory Management
Recovery Recovery Management
Diskio Disk I/O Management,磁盤I/O管理
Netio Network I/O Management
1.5
用sp_sysmon可以得到數(shù)據(jù)庫系統(tǒng)的性能基準(zhǔn)報(bào)告,但要在比較穩(wěn)定的狀態(tài)下產(chǎn)生,方可作為參考和對照的依據(jù)。
1.6 理解存儲方法
只有清楚數(shù)據(jù)庫存儲數(shù)據(jù)的底層細(xì)節(jié),如數(shù)據(jù)頁、索引頁的物理結(jié)構(gòu),每一行的大小計(jì)算,不同類型列佔(zhàn)用的寬度等等問題,才能對各種調(diào)優(yōu)措施有個(gè)深入領(lǐng)會。關(guān)於這個(gè)問題,比較複雜和細(xì)緻,請自行參閱有關(guān)書籍。
一般地,對於更改數(shù)據(jù)的操作,要盡量促進(jìn)數(shù)據(jù)庫進(jìn)行直接更新( Direct Updates ),所以要遵守以下幾條原則:
1)除非必要,避免使用允許null值的列和可變長度的列。
2)如果varchar 和 varbinary 列填充得比較滿,毫不猶豫轉(zhuǎn)成 char 和 binary 列。對於建表時(shí)指定的頁填充率(page fillfactor)參數(shù),要權(quán)衡確定數(shù)值大小。一般:小值,適合於有許多隨機(jī)插入的表,該表的數(shù)據(jù)經(jīng)常被刪除,又經(jīng)常被增加;大值,適合於大多數(shù)的數(shù)據(jù)被增加到表末尾,如客票系統(tǒng)的售票存根和退票存根表。
2 SQL Server級的調(diào)優(yōu)
2.1 管理共享內(nèi)存
數(shù)據(jù)庫性能優(yōu)化的首要方面是最優(yōu)管理內(nèi)存。數(shù)據(jù)庫佔(zhàn)用的共享內(nèi)存分成數(shù)據(jù)緩衝(data cache)、存儲過程緩衝(Procedure cache)等幾塊。在isql 下使用 sp_configure 'cache' 可以看到存儲過程緩衝所佔(zhàn)百分比(procedure cache percent),整個(gè)數(shù)據(jù)緩衝大?。╰otal data cache size) 等參數(shù)。
2.1.1 存儲過程緩衝(Procedure cache)
存儲過程緩衝保持以下對象的查詢計(jì)劃:
Procedures :存儲過程
Triggers :觸發(fā)器
Views :視圖
Rules :規(guī)則
Defaults :缺省
Cursors :游標(biāo)
存儲過程不可重入,意即每個(gè)並發(fā)用戶調(diào)用都會在內(nèi)存中產(chǎn)生一個(gè)拷貝。
Procedure, triggers, and views 當(dāng)它們被裝載到procedure cache中時(shí),被查詢優(yōu)化器優(yōu)化,建立查詢計(jì)劃。如果存儲過程在緩衝中,被調(diào)用時(shí)就不需要重新編譯。如果procedure cache太小,存儲過程就會經(jīng)常被其他調(diào)入內(nèi)存的存儲過程沖洗掉,當(dāng)再次被調(diào)用時(shí),存儲過程又被調(diào)入內(nèi)存,再重新編譯,用戶請求因此不得不等待。最嚴(yán)重的情況,如果procedure cache不夠,存儲過程甚至都不能運(yùn)行。所以在內(nèi)存足夠的情況下,procedure cache percent 參數(shù)盡可能大一些。
2.1.2 數(shù)據(jù)緩衝(Data Cache)
數(shù)據(jù)緩衝用來緩存數(shù)據(jù)頁和索引頁,是除去存儲過程緩衝,系統(tǒng)其他佔(zhàn)用的緩衝外的剩餘內(nèi)存空間。通過給服務(wù)器增加物理內(nèi)存擴(kuò)大數(shù)據(jù)緩衝,是最有效的方法。當(dāng)然,如果不能加內(nèi)存,就只能通過減少存儲過程緩衝的比例等方法來擴(kuò)大數(shù)據(jù)緩衝了。通過 sp_configure "extent I/O buffers", 20(可調(diào)) 命令,在Data Cache中保留一些頁專用於創(chuàng)建索引時(shí)使用,可以顯著提高創(chuàng)建索引的性能。但要注意每開闢一個(gè)緩衝佔(zhàn)用16K 字節(jié)的系統(tǒng)內(nèi)存。
2.1.3 命名緩衝
通過如下的命令:
1>; sp_helpcache
2>; go
查看某客票數(shù)據(jù)庫中命名緩衝,得到的結(jié)果如下:
Cache Name Config Size Run Size Overhead
------------------------ ------------- ---------- ----------
DS30_Tran_Log 20.00 Mb 20.00 Mb 2.05 Mb
Systemtable 20.00 Mb 20.00 Mb 2.05 Mb
default data cache 0.00 Mb 4462.86 Mb 464.97 Mb
left_base_center 16.00 Mb 16.00 Mb 1.57 Mb
price_cache 8.00 Mb 8.00 Mb 0.85 Mb
可以看出有4個(gè)命名緩衝,分別綁定客票系統(tǒng)的應(yīng)用日誌表、一些重要且常用的系統(tǒng)表、余票表、票價(jià)系列表,另外1個(gè)是缺省數(shù)據(jù)緩衝。這種配置還不是最合理,應(yīng)該進(jìn)一步把Systemtable這個(gè)命名緩衝細(xì)分成很多個(gè),每一個(gè)單獨(dú)存放一張系統(tǒng)表。
2.1.4 緩衝策略
緩衝策略是指把數(shù)據(jù)提前讀入內(nèi)存的機(jī)制,分預(yù)取策略(Prefetch rategy,即大I/O策略)和取後馬上丟棄策略(Fetch-and-Discard)、提示策(Hints)等幾種。可以在三個(gè)級別上設(shè)置表數(shù)據(jù)的預(yù)取策略(Prefetch Strategy,即大I/O策略)於:對像級,會話級,查詢級。如果三個(gè)級別上都有設(shè)置,它們發(fā)生作用的優(yōu)先順序是:對像級 >; 會話級 >; 查詢級。對於如何在查詢級利用指定的緩衝池,可以查看下面例子(使用4K緩衝池):
select au_fname, au_lname
from authers (prefetch 4)
where au_id in ( A372020631, ..., A1887081515 )
go
DSS應(yīng)用往往得益於大的I/O,應(yīng)該放開large I/O strategy預(yù)取策略。
如果一個(gè)應(yīng)用傾向於OLTP特徵,用戶能在會話級關(guān)掉Prefetch來提高性能。對於OLTP應(yīng)用,關(guān)閉large I/O strategy預(yù)取策略。對於所取到的頁不會有重用的情況,放開fetch-and-discard策略??推毕到y(tǒng)對存根數(shù)據(jù)進(jìn)行統(tǒng)計(jì)的應(yīng)用,如財(cái)收日結(jié)賬,營銷分析數(shù)據(jù)整理模塊和綜合查詢等,都可以利用這一結(jié)論。查看幾個(gè)操作頻繁且較大的表上的緩衝策略,用如下命令:
sp_cachestrategy center,seat_area
sp_cachestrategy center,sale_record0505
2.2 管理鎖
2.2.1 頁鎖升級閥限
優(yōu)化鎖的重要考慮是設(shè)置頁級鎖升級升級成表級鎖的閥限。要盡量避免頁鎖很快升級成表級鎖。在某客票數(shù)據(jù)庫中,用sp_configure 『lock』可以看到如下結(jié)果:
deadlock checking period 500 0 1000 1000
number of locks 5000 46875 200000 200000
page lock promotion HWM 200 0 10000 10000
page lock promotion LWM 200 0 200 200
page lock promotion PCT 100 0 90 90
可以看到頁鎖升級的閥限有三個(gè):HWM(最高點(diǎn)) 為10000,LWM(最低點(diǎn))為200,PCT為90。Sybase數(shù)據(jù)庫內(nèi)部根據(jù)PCT值按公式PCT*TAB_SZ/100得出計(jì)算閥限,如果計(jì)算閥限 < LWM, 鎖升級發(fā)生在LWM值;如果計(jì)算閥限 < HWM,鎖升級發(fā)生在HWM值。如果 LWM < 計(jì)算閥限 < HWM ,鎖升級發(fā)生在PCT*TAB_SZ/100值。
鎖升級閥限設(shè)置分對像級和服務(wù)器級兩種。
針對對像級設(shè)置(數(shù)據(jù)庫上的表或表上的索引),配置命令是:
sp_setpglockpromote {"database" | "table"}, objname, new_lwm,new_hwm, new_pct
針對服務(wù)器級設(shè)置,配置命令是:
sp_setpglockpromote server, NULL, new_lwm, new_hwm, new_pct。
如果要?jiǎng)h除掉對像級上的頁鎖升級閥限,用:
sp_dropglockpromote {"database" | "table"}, objname
2.2.2 減少鎖爭奪的方法:
1)降範(fàn)式設(shè)計(jì)數(shù)據(jù)庫,創(chuàng)建冗余表。
2)把堆表(沒有聚族索引的表)分區(qū)。
3)對於小表,使用fillfactor和max_rows_per_page來減少行密度,從而使各行數(shù)據(jù)分佈到許多頁(此方法適用於SQL Server 11版,對於11.9.2版以後的Sybase數(shù)據(jù),有了行級鎖,此方法必要性不大)。
2.3 管理臨時(shí)庫(tempdb)
管理臨時(shí)庫一個(gè)重要原則是要避免臨時(shí)表跨多個(gè)設(shè)備,可以把tempdb從master設(shè)備中分離出來,放到一個(gè)單獨(dú)的設(shè)備上去。這樣可以減少存取系統(tǒng)表時(shí)對I/O資源的爭奪。用sp_dropsegment 存儲過程從master設(shè)備中移除tempdb的default段和system段。為了進(jìn)一步提高tempdb的I/O速度,可以考慮把tempdb整個(gè)放在RAM 驅(qū)動器或固態(tài)存儲設(shè)備上,存取速度是一般磁盤的1000倍。一般情況下,tempdb會非常頻繁地爭奪和佔(zhàn)用缺省數(shù)據(jù)緩衝,因?yàn)椴樵儠捴杏性S多臨時(shí)表要?jiǎng)?chuàng)建、計(jì)算和刪除。所以推薦把tempdb綁定到它自己的命名緩衝,這樣可以防止臨時(shí)對像在內(nèi)存中的活動沖洗掉缺省數(shù)據(jù)緩衝中的其他對象,利於在多個(gè)緩衝間展開I/O。在使用臨時(shí)表的時(shí)候,還有一個(gè)原則:盡量縮小表規(guī)模和行的寬度,每一行只包括必要的列。例如在用select * into生成臨時(shí)表時(shí),如果只需要幾個(gè)列的數(shù)值,就不要用這樣的語句,而直接選取需要的列。
2.4 使用多引擎(Multiple Network Engines)
如果操作系統(tǒng)使用了多個(gè)CPU,那麼用sp_configure 配置數(shù)據(jù)庫的參數(shù):在線引擎數(shù)(max online engines),可以擴(kuò)展系統(tǒng)的網(wǎng)絡(luò)I/O容量,分佈網(wǎng)絡(luò)I/O到各個(gè)引擎,從而提高性能,允許更多的用戶連接。
在用戶登錄數(shù)據(jù)庫時(shí),總是先登錄到引擎0,由引擎0在可用引擎隊(duì)列中選擇一個(gè)掛最少連接的引擎來傳遞socket描述符,從而重定向連接到那個(gè)引擎,由該引擎去處理跟此用戶連接相關(guān)的所有網(wǎng)絡(luò)活動。
對於多引擎SMP結(jié)構(gòu),SQL Server引入了自旋鎖(spinlock)的一種數(shù)據(jù)結(jié)構(gòu),在多個(gè)引擎間共享。對於不同類型的任務(wù),在哈希表上分配不同的自旋鎖,有頁鎖自旋鎖、表鎖自旋鎖和地址自旋鎖。
自旋鎖的配置:
sp_configure "page lock spinlock ratio", newval
sp_configure "table lock spinlock ratio", newval
sp_configure "address lock spinlock ratio", newval
增大數(shù)值,可以減少碰撞,提高並發(fā)操作度。但是每一個(gè)自旋鎖結(jié)構(gòu)要佔(zhàn)用256字節(jié)的內(nèi)存。
如果數(shù)據(jù)庫發(fā)生1279錯(cuò),可能原因:
1)不允許足夠的鎖,解決辦法是用sp_configure 調(diào)大 number of locks 數(shù)值
2)在engine freelock 緩衝中沒有足夠的鎖,解決辦法是用sp_configure調(diào)大 max engine freelocks 數(shù)值。
如果數(shù)據(jù)庫系統(tǒng)使用了4個(gè)引擎,那麼每個(gè)引擎的自由鎖緩衝中包含:each engine-specific freelock cache 包含 5000 * .20 /4 = 250 個(gè)鎖。
在平時(shí),經(jīng)常用sp_monitor和sp_sysmon監(jiān)視CPU使用率,如果所有CPU的利用率高於85%,增加CPU,然後增大數(shù)據(jù)庫的引擎數(shù),可以改善性能。
2.5 設(shè)備使用的優(yōu)化
把最常插入的表分區(qū),放在多個(gè)設(shè)備上,這樣可以創(chuàng)建多個(gè)頁鏈,從而改善多個(gè)並發(fā)插入時(shí)的性能,因?yàn)槊恳粋€(gè)插入都要找到頁鏈,頁鏈有多個(gè),就允許多個(gè)插入同時(shí)進(jìn)行。這一點(diǎn),尤其適用於客票系統(tǒng)的存根表和訂票存根表(CG30_RRT),所帶來的性能改善會非常明顯。
物理I/O的代價(jià)遠(yuǎn)大於邏輯I/O,所以要盡量減少磁盤進(jìn)行物理I/O的次數(shù),盡量多進(jìn)行內(nèi)存中的邏輯I/O。使用statistics io工具和sp_sysmon,來觀察磁盤I/O??梢耘渲檬褂么蟮腎/O來減少物理I/O的次數(shù),方法有三個(gè):
1)用更多的磁盤;
2)表和索引分開到不同的磁盤;
3)增加一次I/O系統(tǒng)參數(shù)值的大小。
SQL Server總是為I/O請求建立一個(gè)磁盤檢查的調(diào)度環(huán),用sp_configure "I/O polling process count"來提高數(shù)值,加長環(huán),可以降低引擎的檢查次數(shù),提高吞吐量。但較小的值一般有助於減少響應(yīng)時(shí)間。
對於可用的磁盤I/O控制塊,要查看操作系統(tǒng)文檔,用sp_configure "disk i/o structures"配置,這個(gè)數(shù)值要盡可能高。
分離日誌和數(shù)據(jù),到不同的設(shè)備;給tempdb自己的設(shè)備;分離表和索引到不同的設(shè)備。這些方法都可以減少I/O。
2.6 對事務(wù)處理的調(diào)優(yōu)
2.6.1 事務(wù)類型
事務(wù)處理無外乎三種:1,OLTP; 2, DSS; 3, OLTP + DSS 的混合負(fù)載
OLTP(聯(lián)機(jī)事務(wù)處理)的特點(diǎn):
? 數(shù)據(jù)插入、修改和刪除頻繁。
? 經(jīng)常操作的是單個(gè)記錄。
? 當(dāng)不適當(dāng)設(shè)計(jì)時(shí),傾向於碰撞和衝突。
DSS(決策支持系統(tǒng))的特點(diǎn):
? 數(shù)據(jù)修改不太頻繁。
? 如果有插入和刪除,是大批量的。
? 平時(shí)一般是只讀操作。
? 表連接很常見。
? 有比較特別的查詢。
OLTP + DSS 混合負(fù)載的特點(diǎn)權(quán)衡:
? 在性能方面要比較,是要吞吐量還是響應(yīng)時(shí)間。
? 在鎖方面要比較,是要並發(fā)性強(qiáng)呢還是要數(shù)據(jù)一致性強(qiáng)。
2.6.2 事務(wù)管理原則
一般的事務(wù)管理原則有:
1) 分解大的事務(wù)成多個(gè)小的事務(wù)。如客票數(shù)據(jù)的備份操作中,要?jiǎng)h除過期數(shù)據(jù),如果設(shè)計(jì)小事務(wù)做循環(huán),便不會影響應(yīng)用,完全可以做到任何時(shí)候備份和刪除,不一定非得等服務(wù)器閒的時(shí)候做。
2) 避免在單個(gè)事務(wù)中更新或刪除大量的數(shù)據(jù)行。比如客票系統(tǒng)的席位庫數(shù)據(jù)清理,即使在服務(wù)器閒的時(shí)候做這種操作,也會鎖定整個(gè)表,影響售票。
3) 盡量用可以接受的最低孤立級(isolation level),來提高並發(fā)度。如在余票查詢等功能的應(yīng)用中,使用這種孤立級,便可以最大程度地降低對售票的影響。
4) 提高事務(wù)吞吐量的措施包括:避免延遲更新;盡可能使用存儲過程等等。
2.6.3 跟事務(wù)特徵相關(guān)的數(shù)據(jù)庫可調(diào)參數(shù)或特性
相對於OLTP應(yīng)用,SQL Server有一些特性來滿足要求。
1) 命名緩衝(Named cache)
對於命名緩衝,可以配置多個(gè)不同大小的內(nèi)存池,來滿足不同的應(yīng)用需求。對於多個(gè)引擎的情況,命名緩衝還有一項(xiàng)重要的功能是降低自旋鎖的內(nèi)部爭奪。
2) 日誌I/O緩衝大小可配置
sp_logiosize ["default" | "size" | "all" ]
缺省值是4K,但如果4K內(nèi)存池沒有配置,SQL Server會使用2K大小的內(nèi)存池
3) 堆表可分區(qū),分佈插入操作到各個(gè)設(shè)備
適用於頻繁插入的表和有並發(fā)BCP倒入數(shù)據(jù)的表,如客票系統(tǒng)的售票存根和退票存根表。
4) 鎖升級閥限可配置。
相對於DSS應(yīng)用,SQL Server也有一些特性來滿足要求
1) 應(yīng)用大的 I/O 緩衝池
用sp_poolconfig來配置。
2) 綁定熱表到命名緩衝
如 sysindexes, syslogs, 注意如果把 syslogs 放到單獨(dú)的緩衝中,可以減少在缺省或其他命名緩衝上的自旋鎖爭奪。對於客票系統(tǒng)的train_dir, stop_time, 票價(jià)表, 取票存儲過程相關(guān)的表都可以放在單獨(dú)的命名緩衝上。
3) 取後丟棄緩衝策略 (Fetch-and-discard cache strategy)
不會沖洗掉緩衝中的常用對象,可以減少M(fèi)RU鏈的爭奪,較少對OLTP事務(wù)的干擾。
對於收入統(tǒng)計(jì)應(yīng)用,統(tǒng)計(jì)過往存根表中的數(shù)據(jù),可以應(yīng)用這一策略。
2.7 網(wǎng)絡(luò)方面的調(diào)優(yōu)
Sybase客戶和服務(wù)器之建傳遞的是TDS包,缺省大小是512字節(jié)。對於要傳輸大批量數(shù)據(jù)的應(yīng)用,如BCP、 文本/圖像的取用、大結(jié)果集SQL語句,要用下面的配置命令配置大的TDS包大小。
sp_configure "default network packet size", nnn
sp_configure "maximum network packet size", nnn
對於isql 和bcp,可以在應(yīng)用級指定TDS包的大?。篿sql -Usa -P –Annn,bcp -Usa -P –Annn。
注意在調(diào)大maximum network packet size的參數(shù)後,要增大 additional network memory 參數(shù),來適應(yīng) maximum network packet size 的要求。
posted on 2008-09-02 15:29 存鷹之心于高遠(yuǎn),取鷹之志而凌云,習(xí)鷹之性以涉險(xiǎn),融鷹之神在山巔. 閱讀(1441) 評論(0) 編輯 收藏 所屬分類: Sybase