1.1 性能指标 数据库的性能通常由响应时间和吞吐量两个指标来衡量。响应越快,吞吐量越大,数据库性能越好。在某些情况下,响应时间和吞吐量不能一起改善。
1.2 调优级别 对Sybase可从四个方面进行数据库性能调优: 一) 操作系统级:提高网络性能、操作系统参数、硬件性能等。 二) SQL Server等级:调整访问方法,改进内存管理和锁管理。 三) 数据库设计级别:采用降范式设计,合理设计索引,分布存储数据等。 四) 应用程序级:高效SQL合理安排事务,应用游标,处理锁。 本文不讨论第一、第三、第四方面的内容,第二方面提到的概念仅适用于Sybase数据库。
1.3 调优工具 在分析Sybase一些数据库系统本身提供的性能调统本身提供的一些性能调整工具,包括多个系统存储过程: 名称 简要介绍功能 sp_sysmon 企业级系统性能报告工具 sp_lock 检查锁的情况 sp_who 查看线程的活动 sp_procqmode 存储过程的查询处理模式 sp_configure 配置SQL Server系统级参数 sp_estspace 估计创建一个表所需的空间和时间 sp_spaceused 估计表的总行数、表和索引占用的空间 sp_monitor 监视CPU、I/O统计活动
在利用isql在等待一些工具时,还可以在查询会话中设置几个选项来显示SQL句子执行时的各种统计分析结果: 指令 On 的含义 set noexec on/off 分析SQL句子之后,还要执行 set statistics io on/off 统计SQL执行所需I/O set statistics time on/off 统计SQL语句执行耗时 set showplan on/off 显示查询计划
1.4 sp_sysmon 的使用 企业级性能报告工具,系统存储过程 sp_sysmon 使用方法: 在isql 下,首先输入 sp_sysmon ‘begin_sample’ 启动一个报告采样过一段时间後,再输入 sp_sysmon ‘end_sample’ 上次报告采样结束 或跟随一个参数 sp_sysmon ‘end_sample’, “dcache” 上次报告采样结束, 但只显示数据缓冲(Data Cache Management)这部分情况。 能替换dcache如下表所示: 参数 参数全称,内容范围解释 Dcache Data Cache Management,数据缓冲 Kernel Kernel Utilization,引擎、网络和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数据库系统的性能基准报告可以获得,但只有在相对稳定的状态下才能作为参考和比较的依据。
1.6 了解存储方法 只有了解数据库存储数据的基本细节,如数据页面、索引页面的物理结构、每行的大小计算、不同类型列的宽度等,我们才能对各种优化措施有深入的了解。关于这个问题,更复杂和详细,请参考相关的书籍。 一般来说,为了更改数据的操作,应尽量促进数据库的直接更新( Direct Updates ),所以要遵守以下几条原则: 1)避免使用允许,除非有必要。null值列和可变长度列。 2)如果varchar 和 varbinary 列填充满,毫不犹豫地转化为 char 和 binary 列。建表时指定的页面填充率(page fillfactor)数值大小应权衡确定参数。一般:小值适用于许多随机插入的表。该表的数据经常被删除和添加;大值适用于将大多数数据添加到表的末尾,如票务系统的票务存根和退票存根表。
2 SQL Server级的调优 2.1 管理共享内存 最优管理内存是数据库性能优化的首要方面。数据库占用的共享内存分为数据缓冲(data cache)、缓冲存储过程(Procedure cache)等几块。在isql 下使用 sp_configure ‘cache’ 可以看到存储过程中缓冲的百分比(procedure cache percent),整个数据缓冲大小(total data cache size) 等参数。
2.1.1 缓冲存储过程(Procedure cache) 保持以下对象的查询计划: Procedures :存储过程 Triggers :触发器 Views :视图 Rules :规则 Defaults :缺省 Cursors :游标 存储过程不能重新进入,这意味着每个并发用户都会在内存中产生副本。 Procedure, triggers, and views 当它们被装载时procedure cache中时优化查询优化器,建立查询计划。若存储过程处于缓冲状态,则不需要重新编译。如果procedure cache如果太小,存储过程往往会被其他转移到内存中的存储过程冲走。当再次调用时,存储过程被转移到内存中并重新编译,因此用户必须等待请求。如果procedure cache不够,存储过程甚至无法运行。所以在内存足够的情况下,procedure cache percent 尽可能大的参数。
2.1.2 数据缓冲(Data Cache) 数据缓冲用于缓存数据页面和索引页面,是除存储过程缓冲外的剩余内存空间。最有效的方法是通过向服务器添加物理内存来扩大数据缓冲。当然,如果不能添加内存,数据缓冲只能通过降低存储过程缓冲的比例来扩展。通过 sp_configure “extent I/O buffers”, 20(可调) 命令,在Data Cache在创建索引时保留一些页面,可以显著提高创建索引的性能。但需要注意的是,每次开放缓冲占用16K 系统内存字节。
2.1.3 命名缓冲 通过以下命令: 1>; sp_helpcache 2>; go 查看客票数据库中的命名缓冲,结果如下: 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 可以看出,有四个命名缓冲,包括客票系统的应用日志表、一些重要而常用的系统表、剩余票表和票价系列表,另一个是缺乏数据缓冲。这种配置不是最合理的,应该进一步处理Systemtable该命名缓冲细分为多个,每个系统表单独存储。
2.1.4 缓冲策略 缓冲策略是指将数据提前读入内存的机制,分为预提策略(Prefetch rategy,即大I/O策略)和立即放弃策略(Fetch-and-Discard)、提示策(Hints)等几种。表数据的预取策略可以设置在三个级别(Prefetch Strategy,即大I/O策略):对象级、会话级、查询级。如果设置了三个级别,其优先级是:对像级 >; 会话级 >; 查询级。如何在查询级使用指定的缓冲池,请查看以下示例(使用4K缓冲池): select au_fname, au_lname from authers (prefetch 4) where au_id in ( A372020631, …, A1887081515 ) go DSS应用程序受益于大I/O,应该放开large I/O strategy预取策略。 若应用程序倾向OLTP特征,用户可以关闭会话级别Prefetch提高性能。对於OLTP应用,关闭large I/O strategy预取策略。对于获得的页面不会重用,放开fetch-and-discard策略。该结论可用于存根数据的统计应用,如财务日结账、营销分析数据分类模块和综合查询。用以下命令查看几种操作频繁、较大的表面缓冲策略: sp_cachestrategy center,seat_area sp_cachestrategy center,sale_record0505
2.2 管理锁 2.2.1 页锁升级阀限制 优化锁的重要考虑因素是设置升级为表锁的阀限。尽量避免页锁迅速升级为表锁。在客票数据库中使用sp_configure 『lock』可见以下结果: deadlock checking period 500 0 100 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 可以看到頁鎖升級的閥限有三個:HWM(最高點) 為10000,LWM(最低點)為200,PCT為90。Sybase數據庫內部根據PCT值按公式PCTTAB_SZ/100得出計算閥限,如果計算閥限 < LWM, 鎖升級發生在LWM值;如果計算閥限 < HWM,鎖升級發生在HWM值。如果 LWM < 計算閥限 < HWM ,鎖升級發生在PCTTAB_SZ/100值。 鎖升級閥限設置分對像級和服務器級兩種。 針對對像級設置(數據庫上的表或表上的索引),配置命令是: sp_setpglockpromote {“database” | “table”}, objname, new_lwm,new_hwm, new_pct 針對服務器級設置,配置命令是: sp_setpglockpromote server, NULL, new_lwm, new_hwm, new_pct。 如果要刪除掉對像級上的頁鎖升級閥限,用: sp_dropglockpromote {“database” | “table”}, objname
2.2.2 減少鎖爭奪的方法: 1)降範式設計數據庫,創建冗余表。 2)把堆表(沒有聚族索引的表)分區。 3)對於小表,使用fillfactor和max_rows_per_page來減少行密度,從而使各行數據分佈到許多頁(此方法適用於SQL Server 11版,對於11.9.2版以後的Sybase數據,有了行級鎖,此方法必要性不大)。
2.3 管理臨時庫(tempdb) 管理臨時庫一個重要原則是要避免臨時表跨多個設備,可以把tempdb從master設備中分離出來,放到一個單獨的設備上去。這樣可以減少存取系統表時對I/O資源的爭奪。用sp_dropsegment 存儲過程從master設備中移除tempdb的default段和system段。為了進一步提高tempdb的I/O速度,可以考慮把tempdb整個放在RAM 驅動器或固態存儲設備上,存取速度是一般磁盤的1000倍。一般情況下,tempdb會非常頻繁地爭奪和佔用缺省數據緩衝,因為查詢會話中有許多臨時表要創建、計算和刪除。所以推薦把tempdb綁定到它自己的命名緩衝,這樣可以防止臨時對像在內存中的活動沖洗掉缺省數據緩衝中的其他對象,利於在多個緩衝間展開I/O。在使用臨時表的時候,還有一個原則:盡量縮小表規模和行的寬度,每一行只包括必要的列。例如在用select * into生成臨時表時,如果只需要幾個列的數值,就不要用這樣的語句,而直接選取需要的列。
2.4 使用多引擎(Multiple Network Engines) 如果操作系統使用了多個CPU,那麼用sp_configure 配置數據庫的參數:在線引擎數(max online engines),可以擴展系統的網絡I/O容量,分佈網絡I/O到各個引擎,從而提高性能,允許更多的用戶連接。 在用戶登錄數據庫時,總是先登錄到引擎0,由引擎0在可用引擎隊列中選擇一個掛最少連接的引擎來傳遞socket描述符,從而重定向連接到那個引擎,由該引擎去處理跟此用戶連接相關的所有網絡活動。 對於多引擎SMP結構,SQL Server引入了自旋鎖(spinlock)的一種數據結構,在多個引擎間共享。對於不同類型的任務,在哈希表上分配不同的自旋鎖,有頁鎖自旋鎖、表鎖自旋鎖和地址自旋鎖。 自旋鎖的配置: sp_configure “page lock spinlock ratio”, newval sp_configure “table lock spinlock ratio”, newval sp_configure “address lock spinlock ratio”, newval 增大數值,可以減少碰撞,提高並發操作度。但是每一個自旋鎖結構要佔用256字節的內存。 如果數據庫發生1279錯,可能原因: 1)不允許足夠的鎖,解決辦法是用sp_configure 調大 number of locks 數值 2)在engine freelock 緩衝中沒有足夠的鎖,解決辦法是用sp_configure調大 max engine freelocks 數值。 如果數據庫系統使用了4個引擎,那麼每個引擎的自由鎖緩衝中包含:each engine-specific freelock cache 包含 5000 * .20 /4 = 250 個鎖。 在平時,經常用sp_monitor和sp_sysmon監視CPU使用率,如果所有CPU的利用率高於85%,增加CPU,然後增大數據庫的引擎數,可以改善性能。
2.5 設備使用的優化 把最常插入的表分區,放在多個設備上,這樣可以創建多個頁鏈,從而改善多個並發插入時的性能,因為每一個插入都要找到頁鏈,頁鏈有多個,就允許多個插入同時進行。這一點,尤其適用於客票系統的存根表和訂票存根表(CG30_RRT),所帶來的性能改善會非常明顯。 物理I/O的代價遠大於邏輯I/O,所以要盡量減少磁盤進行物理I/O的次數,盡量多進行內存中的邏輯I/O。使用statistics io工具和sp_sysmon,來觀察磁盤I/O。可以配置使用大的I/O來減少物理I/O的次數,方法有三個: 1)用更多的磁盤; 2)表和索引分開到不同的磁盤; 3)增加一次I/O系統參數值的大小。 SQL Server總是為I/O請求建立一個磁盤檢查的調度環,用sp_configure "I/O polling process count"來提高數值,加長環,可以降低引擎的檢查次數,提高吞吐量。但較小的值一般有助於減少響應時間。 對於可用的磁盤I/O控制塊,要查看操作系統文檔,用sp_configure "disk i/o structures"配置,這個數值要盡可能高。 分離日誌和數據,到不同的設備;給tempdb自己的設備;分離表和索引到不同的設備。這些方法都可以減少I/O。
2.6 對事務處理的調優 2.6.1 事務類型 事務處理無外乎三種:1,OLTP; 2, DSS; 3, OLTP + DSS 的混合負載 OLTP(聯機事務處理)的特點: 數據插入、修改和刪除頻繁。 經常操作的是單個記錄。 當不適當設計時,傾向於碰撞和衝突。 DSS(決策支持系統)的特點: 數據修改不太頻繁。 如果有插入和刪除,是大批量的。 平時一般是只讀操作。 表連接很常見。 有比較特別的查詢。 OLTP + DSS 混合負載的特點權衡: 在性能方面要比較,是要吞吐量還是響應時間。 在鎖方面要比較,是要並發性強呢還是要數據一致性強。
2.6.2 事務管理原則 一般的事務管理原則有:
-
分解大的事務成多個小的事務。如客票數據的備份操作中,要刪除過期數據,如果設計小事務做循環,便不會影響應用,完全可以做到任何時候備份和刪除,不一定非得等服務器閒的時候做。
-
避免在單個事務中更新或刪除大量的數據行。比如客票系統的席位庫數據清理,即使在服務器閒的時候做這種操作,也會鎖定整個表,影響售票。
-
盡量用可以接受的最低孤立級(isolation level),來提高並發度。如在余票查詢等功能的應用中,使用這種孤立級,便可以最大程度地降低對售票的影響。
-
提高事務吞吐量的措施包括:避免延遲更新;盡可能使用存儲過程等等。
2.6.3 跟事務特徵相關的數據庫可調參數或特性 相對於OLTP應用,SQL Server有一些特性來滿足要求。
-
命名緩衝(Named cache)
對於命名緩衝,可以配置多個不同大小的內存池,來滿足不同的應用需求。對於多個引擎的情況,命名緩衝還有一項重要的功能是降低自旋鎖的內部爭奪。 2) 日誌I/O緩衝大小可配置 sp_logiosize [“default” | “size” | “all” ] 缺省值是4K,但如果4K內存池沒有配置,SQL Server會使用2K大小的內存池 3) 堆表可分區,分佈插入操作到各個設備 適用於頻繁插入的表和有並發BCP倒入數據的表,如客票系統的售票存根和退票存根表。 4) 鎖升級閥限可配置。
相對於DSS應用,SQL Server也有一些特性來滿足要求
-
應用大的 I/O 緩衝池
用sp_poolconfig來配置。 2) 綁定熱表到命名緩衝 如 sysindexes, syslogs, 注意如果把 syslogs 放到單獨的緩衝中,可以減少在缺省或其他命名緩衝上的自旋鎖爭奪。對於客票系統的train_dir, stop_time, 票價表, 取票存儲過程相關的表都可以放在單獨的命名緩衝上。 3) 取後丟棄緩衝策略 (Fetch-and-discard cache strategy) 不會沖洗掉緩衝中的常用對象,可以減少MRU鏈的爭奪,較少對OLTP事務的干擾。 對於收入統計應用,統計過往存根表中的數據,可以應用這一策略。
2.7 網絡方面的調優 Sybase客戶和服務器之建傳遞的是TDS包,缺省大小是512字節。對於要傳輸大批量數據的應用,如BCP、 文本/圖像的取用、大結果集SQL語句,要用下面的配置命令配置大的TDS包大小。 sp_configure “default network packet size”, nnn sp_configure “maximum network packet size”, nnn 對於isql 和bcp,可以在應用級指定TDS包的大小:isql -Usa -P –Annn,bcp -Usa -P –Annn。 注意在調大maximum network packet size的參數後,要增大 additional network memory 參數,來適應 maximum network packet size 的要求。