??xml version="1.0" encoding="utf-8" standalone="yes"?>
Sybase ASE表分區的?
表分區是目前各L數據庫都提供的常用技術,各大數據庫基g同的體系i構提供了各L色的實現Q如果能合理使用這種技術,為pȝ性能的提升帶來意想不到的效果Q本文以Sybase ASE數據庫為例來說明這種技術的使用Ҏ?
在Sybase ASE中,未分區的不帶聚烦引的表有一個雙向的數據庫頁鏈鏈接。在插入數據行時Q將查找並鎖定頁鏈的最後一頁,如果最後一頁空間用盡,Sybase ASE分配新的一頁,如果表進行大量ȝ的數據插入,引起對最後一頁鎖資源的競爭,如果一個事務(TransactionQ正在用最後一頁的排它鎖,那麼其他向同一張表插入數據的事務必須等待,直到該事務結束釋放資源,解除排它鎖?
Sybase ASE?1.5開始提供新的Ҏ表分區。表分區產生附加的頁鏈Q每個頁鏈有自己的最後一頁,這樣插入操作可以獲得多個最後一頁,實現並發操作Q從而提高數據n插入性能。若包含表的D分佈在多個物理設備上Q表分區通過降低服務器從高速m存向盤進行數據h的I/O衝突而提高數據插入性能。對ȝ地追加數據到表中或進行大塊數據的拷入、拷出操作,採用表分區技術,能極大地提升系i性能?
劃分表分區的操作步驟如下:
1. 在同一數據庫設備上劃分表分區?先創Q再用alter table ?partition 語句劃分表分區?
create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... )
alter table opt_plnexrcd partition 5
2. 在多個數據na備上劃分表分區時,先徏一個數據nD在多個數據n上,然後再將表徏在該D上Q最後對表分區?
sp_addsegment seg1, oil, oil_data1
sp_extendsement seg1, oil, oil_data2
...
sp_extendsement seg1, oil, oil_data5
create table opt_plnexrcd ( per_date datetime, per_sndstn char(4), ... ) on seg1
或徏完表後執行sp_placeobject:
sp_placeobject seg1, opt_plnexrcd
最後對表分區:
alter table opt_plnexrcd partition 5
如果表分?個分區Q表所在的D又分跨5個數據na備Q那麼每個分區分別映到該段所在的5個數據na備上。一般劃分表分區的原則是Q表分區數等於或大於表所在段分跨的數據na備數。但要注意有些表不能分區Q它們是pȝ表、正在用的表、臨時表和有聚簇索引的表?
Sybase ASE使用保存在分區控制頁上的箔a數據,來評測基於分區的並行掃瞄方式,以挑選最優執行計劃。如果表中數據在多個分區上是分佈均衡的,表分區ip數據是精的Q那麼掃瞄效率就比較高,並行處理有很好的性能Q所以表分區的維護對g行查詢處理十分重要。Sybase ASE的異常停止和某些情況下的事務回退都可能造成分區ip數據不精,Sybase ASE提供了兩個系i函數data_pgs和ptn_data_pgs,用它們可分別a算數據頁面敔R。如果兩者不相同Q說明分區ip不精,需要維PSybase ASE 提供如下命o來更新分區和頁面箔a數據:
1.更新每個分區的頁面箔a數據:
update partition statistics
2.更新表上索引的分佈頁面,同時更新各個表分區的控刉面的ip數據Q?
update all statistics table_name
3.示表分區的當前信息:
sp_helpartition
如果分區的表進行了大量的插入、更新和刪除後,數據有可能分佈不均勻Q用BCP加載大量數據後,也可能會出現數據分佈不均勻,此外一些其他原因也可能致數據分佈不均勅R^衡分區數據有兩E方法:一是對有數據的表徏聚簇索引Q二是用並行塊拯Q指定數據加載到某個分區的方法,Sybase ASE 新的BCP允許用戶指定分區Q把數據加載到指定的分區中?
1. 增强可用性:如果表的某个分区出现故障Q表在其他分区的数据仍然可用;
2. l护方便Q如果表的某个分区出现故障,需要修复数据,只修复该分区卛_;
3. 均衡I/OQ可以把不同的分区映到盘以^衡I/OQ改善整个系l性能;
4. 改善查询性能Q对分区对象的查询可以仅搜烦自己兛_的分区,提高索速度?/p>
DM数据库提供对表的分区Ҏ有两U:
1、范围分区:范围分区是对表中的某个值的范围q行分区Q根据某个值的范围Q决定将该数据存储在哪个分区上?/p>
2、HASH分区QHASH分区是通过指定分区~号来均匀分布数据的一U分区类型,因ؓ通过在I/O讑֤上进行散列分区,使得q些分区大小一致?/p>
除了对表q行分区Q还可以对烦引进行分区。DM支持下面三种cd的分区烦引:
1、本地烦引:其分区方式与其所在基表的分区方式一模一L索引。本地烦引的每个分区仅对应于其所在基表的一个分区?/p>
2、全局分区索引Q用不同于其所在表的分区键q行分区的烦引,其所在表可以是分或非分区表?/p>
3、全局非分区烦引:全局非分区烦引基本上和非分区表的索引一栗烦引结构是不分区的?/p>
1.1 水^分区表的创徏
在介l水q_的创Z前。先要了解分区键的概c?/p>
分区键:分区键是分区表的某一列,它决定了分区表中每一行数据划分到哪个分区。该列的数据cd为DM常用数据cdQ不支持BLOB、TEXT、ROWID、BIT、BINARY、VARBINARY、时间间隔等cd和用戯定义cd。分区键不可以删除或修改?/p>
范围分区通过LEFT或RIGHT关键字来指定每个值是W一个分区的上边?(LEFT) q是W二个分区的下边?(RIGHT)。边界g要求是递增的序列,但是不能重复Q边界g可以为NULLQ支持用常量表辑ּ或返回常量值的函数来指定分区的边界倹{?/p>
如:建立范围分区表CREATE TABLE TAB1(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE (C1) LEFT FOR VALUES (1, 100, 10000);
PARTITION NO1234
VALUESVAL<=11
建立HASH分区表CREATE TABLE TAB2(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY HASH(C1) PARTITIONS 3; TAB2以C1为分区键Q且分区Cؓ3?/p>
范围区间或HASH分区数目不能过64个。不同的分区可以指定C同的文gl。?
1.2 分区索引的创?/strong>
本地索引、全局非分区烦引、全局分区索引可以建立在范围分或HASH分区表上Q普通表上可以徏立全局分区索引?/p>
如:CREATE TABLE T(C1 INT, C2 INT, C3 VARCHAR(100)) PARTITION BY RANGE(C1) LEFT FOR VALUES(1, 100);
CREATE INDEX T_IND1 ON T (C2); -- 本地索引Q系l将自动创徏3个分区子索引Q这些分区子索引按照C1q行分区?/p>
CREATE NOT PARTIAL INDEX T_IND2 ON T (C2); -- 全局非分区烦引,索引不分区?/p>
CREATE INDEX T_IND3 ON T (C2) PARTITION BY RANGE(C2) LEFT FOR VALUES(5, 55); -- 全局分区索引Q烦引按照C2列分?/p>
1.3 水^分区表和分区索引的维?/strong>
DM支持对范围分和范围分上的索引q行合ƈ和拆分。HASH分区表和HASH分区表上的烦引不支持合ƈ和拆分,本地分区索引不允许合q和拆分?/p>
分区合ƈ通过指定分区号将盔R的两个分区合q成一个分区。MERGE分区Ӟ盔R的两个分区可以是相同的文件组Q也可以是不同的文gl?/p>
分区拆分通过指定帔R表达式值将某一个分区拆分成两个分区Q指定的帔R表达式g能是原有的分围倹{SPLIT分区Ӟ可以指定新的文gl,或者不指定文gl?/p>
1.4 水^分区的?/strong>
水^分区表、分区烦引的使用和普通表、普通烦引的使用一栗用户通过SQL语句建立范围分区和HASH分区表,以及水^分区索引以后Q普通的INSERT、DELETE、UPDATE、SELECT语句的用不受Q何媄响?/p>
分区拆分或合q以后,普通的INSERT、DELETE、UPDATE、SELECT语句的用不受Q何媄响?/p>
二、适合读者对?/strong>Q数据库开发程序员Q数据库的数据量很多Q涉及到对SPQ存储过E)的优化的目开发h员,Ҏ据库有浓厚兴的人?
三、介l?/strong>Q在数据库的开发过E中Q经怼遇到复杂的业务逻辑和对数据库的操作Q这个时候就会用SP来封装数据库操作。如果项目的SP较多Q书写又没有一定的规范Q将会媄响以后的pȝl护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,׃遇到优化的问题,否则速度有可能很慢,l过亲nl验Q一个经q优化过的SP要比一个性能差的SP的效率甚至高几百倍?
四、内?/strong>Q?
1、开发h员如果用到其他库的Table或ViewQ务必在当前库中建立View来实现跨库操作,最好不要直接?#8220;databse.dbo.table_name”Q因为sp_depends不能昄SP所使用的跨库table或viewQ不方便校验?
2、开发h员在提交SP前,必须已经使用set showplan on分析q查询计划,做过自n的查询优化检查?
3、高E序q行效率Q优化应用程序,在SP~写q程中应该注意以下几点:
a)SQL的用规范:
i.量避免大事务操作,慎用holdlock子句Q提高系lƈ发能力?
ii.量避免反复讉K同一张或几张表,其是数据量较大的表Q可以考虑先根据条件提取数据到临时表中Q然后再做连接?
iii.量避免使用游标Q因为游标的效率较差Q如果游标操作的数据过1万行Q那么就应该改写Q如果用了游标Q就要尽量避免在游标循环中再q行表连接的操作?
iv.注意where字句写法Q必考虑语句序Q应该根据烦引顺序、范围大来定条g子句的前后顺序,可能的让字D顺序与索引序怸_范围从大到小?
v.不要在where子句中的“=”左边q行函数、算术运或其他表达式运,否则pȝ可能无法正用烦引?vi.量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用Q而且count(1)比count(*)更有效率?
vii.量使用“>=”Q不要?#8220;>”?
viii.注意一些or子句和union子句之间的替?
ix.注意表之间连接的数据cdQ避免不同类型数据之间的q接?
x.注意存储q程中参数和数据cd的关pR?
xi.注意insert、update操作的数据量Q防止与其他应用冲突。如果数据量过200个数据页面(400kQ,那么pȝ会q行锁升U,锁会升成表U锁?
b)索引的用规范:
i.索引的创与应用结合考虑Q徏议大的OLTP表不要超q?个烦引?
ii.可能的使用索引字段作ؓ查询条gQ尤其是聚簇索引Q必要时可以通过index index_name来强制指定烦?
iii.避免对大表查询时q行table scanQ必要时考虑新徏索引?iv.在用烦引字D作为条件时Q如果该索引是联合烦引,那么必须使用到该索引中的W一个字D作为条件时才能保证pȝ使用该烦引,否则该烦引将不会被用?v.要注意烦引的l护Q周期性重建烦引,重新~译存储q程?
c)tempdb的用规范:
i.量避免使用distinct、order by、group by、having、join、cumputeQ因些语句会加重tempdb的负担?
ii.避免频繁创徏和删除时表Q减系l表资源的消耗?
iii.在新Z时表Ӟ如果一ơ性插入数据量很大Q那么可以用select into代替create tableQ避免logQ提高速度Q如果数据量不大Qؓ了缓和系l表的资源,先create tableQ然后insert?
iv.如果临时表的数据量较大,需要徏立烦引,那么应该创Z时表和徏立烦引的q程攑֜单独一个子存储q程中,q样才能保证pȝ能够很好的用到该时表的烦引?
v.如果使用C临时表,在存储过E的最后务必将所有的临时表显式删除,先truncate tableQ然后drop tableQ这样可以避免系l表的较长时间锁定?
vi.慎用大的临时表与其他大表的连接查询和修改Q减低系l表负担Q因U操作会在一条语句中多次使用tempdb的系l表?
d)合理的算法用:
Ҏ上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,l合实际应用,采用多种法q行比较,以获得消耗资源最、效率最高的Ҏ?
具体可用ASE调优命oQset statistics io on, set statistics time on , set showplan on {?
文章描述了通过sp_sysmon对Adaptive Serverpȝq行情况有一个全面系l了解,有利于更好地熟悉pȝ性能Q更为有效地q行pȝ理Q合理地利用和配|系l资源,辑ֈpȝ性能调优的目的?
?8个方面了解在用系l性能状况Qƈ在适当的时候利用环境参数进行性能调优Q?
1、内核管理(kernalQ?br />
2、应用管理(appmgmtQ?br />
3、数据缓存管理(dcacheQ?
4、ESP理QespQ?br />
5、烦引管理(indexmgmtQ?
6、锁理QlocksQ?
7、内存管理(memoryQ?br />
8、元数据高速缓存管理(mdcacheQ?br />
9、Q务管理(taskmgmtQ?
10、监视器讉KSQL的执行(monaccessQ?
11、网lI/O理QnetioQ?
12、ƈ行查询管理(parallelQ?br />
13、过E缓存管理(pcacheQ?br />
14、恢复管理(recoveryQ?
15、事务管理(xactmgmtQ?br />
16、事务概要(xactsumQ?
17、磁盘I/O理QdiskioQ?
18、工作进E管理(wpmQ?
括号后英文短词是该模块参数?
步骤Q执行sp_sysmon “00:10:00”QserverU系l存贮过E,不需要打开某个数据库)Q或者执行如下格式的q程Q查看具体操作批命o对应pȝ性能情况Q(10分钟pȝ查看Q?
sp_sysmon begin_sample
SQL语句或者存贮过E?
sp_sysmon commit_sample
本实验采?sp_sysmon “hh:mm:ss”,性能模块名?
可了解当前系l在各方面的pȝq行状况Q性能出现什么问题和不^衡不协调之处Q学会用相应的参数和措施进行解军_调优Q不断比较对照调整前后的性能状况Q最l改善系l性能?
说明Q?、该命o执行l果集的开头相同如下:
======================================================================
Sybase Adaptive Server Enterprise System Performance Report
======================================================================
Server Version: Adaptive Server Enterprise/11.9.2/1031/P/NT (IX86)/OS 3.
Server Name: Server is Unnamed
Run Date: May 28, 2001
Statistics Cleared at: 15:57:27
Statistics Sampled at: 16:07:28
Sample Interval: 00:10:00
2、执行结果集的每列信息提C:
per sec Q?采样期间每秒的^均?
per xactQ?采样期间每提交一个事务的q_?
count Q?采样期间每秒的总计?
% of totalQ?占L的百分比Q根据不同情况各有不?
3、结果集对应l出性能情况描述、分析以及可调性说?
4、只l出部分模块的监视结果(可能有删节)Q用sp_sysmon “hh:mm:ss”可看全部详细情况?
单元一Q监视内核利用情?
命o行:sp_sysmon “00:10:00”,kernal
l果Q?
Kernel Utilization Q内核利用)
------------------
Engine Busy Utilization
Engine 0 1.8 %
引擎J忙E度应在80%-90%之间Q如果长期在90%以上Q应考虑增加引擎数来改善性能。因为此时内部管理进E无法向盘写入Q则查点需要将许多写回磁盘,而检查点q程很可能将CPU的利用率提高?00%Q导致响应时间明昑֢加?
CPU Yields by Engine per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Engine 0 6.6 0.6 3949 100.0 %
引擎攑ּCPUơ数Q? of total=1个引擎放弃次?所有引擎放弃次敎ͼ如果昄引擎利用率较低,可通过攑ּ数判断是否真实反映引擎的停止情况。增?#8220;runnable process search count”Q引擎放弃CPUlOS之前一个引擎@环查扑֏执行d的次敎ͼ参数可增加CPU的驻留时_而如果想减少引擎在空闲时查I/O的时_可减该参数的倹{?
Network Checks
Total Network I/O Checks 0.0 0.0 0 n/a
引擎发送或接收|络包的ơ数。引擎空闲时频繁查网l包Q如果该值很低?#8220;CPU Yields by Engine”的值高Q表明引擎可能被频繁攑ּ?
可能包括d和非d两种查方式。非d方式不管有无I/O{待都对|络q行I/O查。如果引擎已被放弃ƈ正执行阻塞网l检查,则在|络包到达以后仍保持一D늝眠时_潜伏期)。此时增?#8220;runnable process search count”Q缺?000Q参数可减少潜伏期,保持引擎有较长的循环查时_而不是过早被攑ּ?
Disk I/O Checks盘I/O查情况:
Total Disk I/O Checks 693.2 58.8 415939 n/a
Checks Returning I/O 469.9 39.9 281921 67.8 %
引擎对I/O情况的有效检查(I/O完成ơ数Q,如过高或q低Q用“i/o polling process count”QServer的调度程序在查磁盘I/O或网lI/O之前可执行的最大进E数Q参数增加或减少查频率。通常说增加该值可增加有大量磁盘或|络I/O的应用的吞吐量,反之Q减该值有可改善其响应旉?
Avg Disk I/Os Returned n/a n/a 0.03020 n/a
增加引擎在检查期间的{待旉可改善吞吐量Q因为减引擎检查I/O旉相应增加执行q程的时间?
单元二:监视q行查询理
命o行:sp_sysmon “00:10:00”,parallel
l果Q?报告q行查询ơ数、执行期间调整了多少工作q程Q以及在merge和sort操作时加锁情c?
Parallel Query Management
-------------------------
Parallel Query Usage per sec per xact count % of total
------------------------- --------- --------- ------- ----------
Total Parallel Queries 0.1 8.0 16 n/a
优化器自动确定是否ƈ行操作,以及为此使用多少工作q程?
WP Adjustments Made
Due to WP Limit 0.0 0.0 0 0.0 %
会话U的限制?#8220;set parallel_degree” or “set scan_parallel_degree”参数控制?
Due to No WPs 0.0 0.0 0 0.0 %
~Z可用的工作进E导致申请工作进E数减少。可适当增加“number of worker processes”
Merge Lock Requests per sec per xact count % of total
报告q行merge操作的锁h敎ͼ很快授予锁的数目Q下?U类型锁的等待情况:
------------------------- --------- --------- ------- ----------
Network Buffer Merge Locks
Granted with no wait 4.9 438.5 877 56.2 %
Granted after wait 3.7 334.5 669 42.9 %
Result Buffer Merge Locks
Granted with no wait 0.0 0.0 0 0.0 %
Granted after wait 0.0 0.0 0 0.0 %
Work Table Merge Locks
Granted with no wait 0.1 7.0 14 0.9 %
Granted after wait 0.0 0.0 0 0.0 %
------------------------- --------- --------- -------
Total # of Requests 8.7 780.0 1560
Sort Buffer Waits per sec per xact count % of total
------------------------- --------- --------- ------- ----------
Total # of Waits 0.00.0 0 n/a
q行排序所?#8220;排序~冲区等?#8221;锁。如果等待数较高Q可考虑加大“number of sort buffers”的倹{?
======================================================================
单元三:监视执行SQL的访问情?
命o行:sp_sysmon “00:10:00”,monaccess
l果Q?
Monitor Access to Executing SQLQ监视执行SQL的访问情况)
-------------------------------
per sec per xact count % of total
------------ ------------ ---------- ----------
Waits on Execution Plans 0.0 0.00 n/a
每个试图使用sp_showplan但必ȝ待获得访问查询计划的读资|报告{待ơ数?
Number of SQL Text Overflows 0.0 0.0 0 n/a
SQLҎ本超q文本缓冲区大小的溢出次数?
Maximum SQL Text Requested n/a n/a 0 n/a
(since beginning of sample)
“max SQL text monitored”Q缺省ؓ0Q参数指定分配给每个q接用户的内存量Q用以保存SQL文本到内存,供sever监视器共享。推荐gؓ1024?
======================================================================
单元四:事务概要
命o行:sp_sysmon “00:10:00”,xactsum
l果Q?
Transaction ProfileQ事务概要)
报告提交的事务数Q要量减少多数据库事务的提交(一个事务对多数据库的访问)
Transaction Summary per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Committed Xacts 11.8 n/a 7073 n/a
Transaction Detailper sec per xactcount% of total
------------------------- ------------ ------------ ---------- ----------
Inserts
APL Heap Table 13.6 1.2 8189 100.0 %
如果大量堆表数据插入Q结合查看锁的堆表最后一锁情况Q是否引起严重的锁争夺,随之调整相应的数据表Q避免因为锁资源争夺引v性能降低?
APL Clustered Table 0.0 0.0 0 0.0 %
对全锁的表插入数据行,注意可能引v的页分裂?
Data Only Lock Table 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ---------- ----------
Total Rows Inserted 13.6 1.2 8189 100.0 %
单元五:事务理
命o行:sp_sysmon “00:10:00”,xactmgmt
l果Q?
Transaction ManagementQ事务管理)
----------------------
用户日志cacheQ每个用户对应一个)降低了写入事务日志的ơ数Q如果是多处理器pȝq减了事务日志当前늚争夺Q因而提高了性能。可配置环境参数“user log cache size”Q缺省最?048字节Q,太小D用户日志常满qJ写入事务日志,太大则每个连接用户都扩大Q又造成内存费。原则是配置不超q事务完成写入事务日志的长度?
ULC Flushes to Xact Log per sec per xact count % of total
各种cdD写入事务日志的次?
------------------------- ------------ ------------ ---------- ----------
by Full ULC 0.0 0.0 0 0.0 %
如果% of total的Dq?0%Q考虑增加环境参数“user log cache size”的倹{?
by End Transaction 11.8 1.0 7095 95.5 %
以显式或隐式的rollback或commit标志事务l束。值大表示有很多短事务?
by Change of Database 0.0 0.0 12 0.2 %
如果值大Q考虑减低ULC中大?K的缓冲池Q降低或去除大块I/O池?
by System Log Record 0.5 0.0 321 4.3 %
? of total值大?0%q且ULC长度大于2048Q考虑降低ULC的长度?
by Other 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ----------
Total ULC Flushes 12.4 1.1 7428
单元六:索引理
命o行:sp_sysmon “00:10:00”,indexmgmt
l果Q?
Index ManagementQ烦引管理)
索引可以加速数据检索,但同时又降低了更新的性能?
----------------
Nonclustered Maintenance per sec per xact count % of total
非聚烦引维护情况:报告因ؓ插入、删除、修攏V页分裂{造成的烦引维护次数?
------------------------- ------------ ------------ ---------- ----------
Ins/Upd Requiring Maint 0.0 0.0 0 n/a
影响索引的插入和修改的操作数Q需要维护非聚簇索引。对于插入,有多非聚簇索引Q就需要增加多烦引维护的开销Q对于修改,则只对相关的索引q行l护?
# of NC Ndx Maint 0.0 0.0 0 n/a
因ؓ插入和修攚w要对多少非聚烦引进行维护?
Deletes Requiring Maint 0.0 0.0 0 n/a
# of NC Ndx Maint 0.0 0.0 0 n/a
影响索引的删除操作次敎ͼ以及需要维护的非聚烦引数?
RID Upd from Clust Split 0.0 0.0 0 n/a
在APLQ全锁Q的聚簇索引表发生页分裂ơ数Q相应需要进行烦引维护?
# of NC Ndx Maint 0.0 0.0 0 n/a
分裂后对应的烦引维护次数?
Upd/Del DOL Req Maint0.0 0.0 0 n/a
DOL表发生媄响烦引的修改删除操作ơ数?
# of DOL Ndx Maint 0.0 0.0 0 n/a
对应索引l护ơ数?
Page Splits 0.0 0.0 0 n/a
包括数据c聚烦引页和非聚簇索引因为插入新行没有够空间单元导致页分裂。页分裂造成修改索引c修攚w指针、增加锁资源争夺{从而降低性能?
如果分裂度高(ơ数多)Q而又是对全页加锁表进行插入操作,q且表有l合键的聚簇索引Q这时可通过改变那些索引的页分裂Ҏ减少分裂,x说组合键的第一个键表中在用Q第二个键列值按升序排列Q也可考虑用fillfactor的合适配|来降低在聚烦引的APL表的数据以及非聚簇索引的叶子数据页上的分裂?
对表插入行按照升序插入方式,q样发生分裂点也是在插入行点而不是在中_q样能够提高性能。通过dbcc tune (ascinserts, 1, "表名")讄插入方式Q?反之?
如果索引l护量大Q会因ؓl护需要额外的q程、额外的I/O、额外的索引锁从而媄响性能。可以通过Ҏ不同操作ơ数与导致的l护ơ数Q如果维护次数很多,q发生页分裂、retries{现象,严重时可考虑不用索引?
单元七:锁管?
命o行:sp_sysmon “00:10:00”,locks
l果Q?
Lock ManagementQ锁理Q?br /> 报告锁、死锁、锁提升和锁争夺的情?
---------------
Lock SummaryQ锁概述Q?per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Lock Requests 26.1 2.2 15676 n/a
d的锁h
Avg Lock Contention 0.0 0.0 0 0.0 %
q_锁争?
Deadlock Percentage 0.0 0.0 0 0.0 %
死锁出现的比?
Lock Hashtable Lookups 26.1 2.2 15677 n/a
对hash表的表、页、行锁的查询ơ数?
Avg Hash Chain Length n/a n/a 0.00038 n/a
Hash铑^均长度:采样期间每个hash桶的q_加锁数目。如果每个hash链超q?个锁Q可用参?#8220;lock hashtable size”调整扩大加锁hash表的大小Q尤其是大型bcp可配|更大?
Lock Detail per sec per xactcount % of total
------------------------- ------------ ------------ ---------- ----------
对于各种cd的锁l节Q重Ҏ看其立即授予和等待情c?
Last Page Locks on Heaps 堆表最后页?
Granted 13.6 1.2 8189 100.0 %
Waited 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ---------- ----------
Total Last Pg Locks 13.6 1.2 8189 100.0 %
如果堆表最后一锁的争夺激烈(其是热对象的等待时间过长)Q考虑建立聚簇索引Q或者表分区来解决锁资源争夺问题?
Deadlocks by Lock Type per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Deadlocks 0.0 0.00 n/a
死锁出现ơ数。当很多事务同时讉K同一个数据库Ӟ会加剧锁资源争夺Q严重时事务之间会发生死锁。可用sp_object_stats查明死锁位置。该q程报告资源争夺最Ȁ烈的10张表、一个数据库中资源争夺的表和单个表的争夺情况。语法ؓsp_object_stats interval [, top_n
[, dbname [, objname [, rpt_option ]]]]Q查看锁争夺情况只需讄interval?#8220;hh:mm:ss”。如果显C每U锁的争夺程度超q?5%Q应该改变加锁方式,比如表的全页锁改成数据页锁,数据锁Ҏ数据行锁{?
Deadlock Detection 死锁?
Deadlock Searches 0.0 0.0 0 n/a
死锁次数。死锁检将特花Ҏ_如果次数过多,用参?#8220;deadlock checking period”Q缺?00msQ调节死锁检周期?
Lock Promotions 锁提?
Total Lock Promotions 0.0 0.0 0 n/a
锁提升指排它锁到排它表锁、共享页锁到׃n表锁、排它行锁到排它表锁、共享行锁到׃n表锁、共享next_key锁到׃n表锁。查看锁提升是否加剧了锁争夺或死锁发生,如果锁争夺激烈ƈ且锁提升频繁Q考虑调整锁的隔离U别Q对全页锁表Q需?U也可强制ؓ3U?
Lock Timeouts by Lock Type per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Total Timeouts 0.0 0.0 0 n/a
单元八:数据cache理
命o行:sp_sysmon “00:10:00”,dcache
l果Q?
Data Cache ManagementQ数据cache理Q?/p>
---------------------
报告数据cache的自旋锁争夺、cache应用、cacheM错失、配|缓冲池的翻转、清z缓存(包括脏页Q、预取的h与拒l、读脏页h{情c?
Cache Statistics Summary (All Caches)
-------------------------------------
per sec per xactcount % of total
------------ ------------ ---------- ----------
Cache Search Summary cache的击中和错失ơ数
Total Cache Hits 18.6 1.6 11171 89.9 %
Total Cache Misses2.1 0.2 1251 10.1 %
------------------------- ------------ ------------ ----------
Total Cache Searches 20.7 1.8 12422
Cache Turnover
Buffers Grabbed 0.2 0.0 102 n/a
~存掠夺。Count表示cache~存块链中从LRU末端取走的缓存块ơ数?
Buffers Grabbed Dirty 0.0 0.0 0 0.0 %
脏页掠夺。在从LRU末端取走脏页时必ȝ待将脏页写回盘。如果其值非Ӟ可找出是什么cache受到影响Q这事关cache的击中性能问题?
Cache Strategy Summary cache{略Q对所有的cacheQ?
Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
报告有多cache中的~存块放|到MRU/LRU铄头部?
Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
报告多少~存块采用了获取-丢弃{略Q缓存块用过以后被放到缓存块铄h标记处?
Large I/O Usage
0.0 0.0 0 n/a
大块I/Oh使用ơ数Q这里没有设|大块I/OQ故均ؓ0|也没有其授权或拒l用情c?
Large I/O Effectiveness
大块I/O的用效果,癑ֈ比g表示很少的页被带入cache供查询用,可进一步查看单个cache的用情c?
Pages by Lrg I/O Cached 0.0 0.0 0 n/a
通过涉及的页数衡量性能是否有益。低的百分比值意味着表的存贮l构很碎Q或是不恰当的cache配置{略?
Asynchronous Prefetch Activity
0.0 0.0 0 n/a
异步预取情况可结合磁盘I/O理查看。可看参?#8220;global async prefetch limit”?
Other Asynchronous Prefetch Statistics
APFs Used 0.0 0.0 0 n/a
异步预取合格的页数?
APF Waits for I/O 0.0 0.0 0 n/a
q程{待异步预取完成的次数。表C查询需要的|有尽早地完成异步预取Q这栯E处于等待状态。出C定的癑ֈ比是合理的:查询的首ơ异步预取请求通常需要等待;每次的顺序扫描移动到新的分配单元时发出预取请求,查询必须{待W一ơ的I/Ol束Q每ơ非聚簇索引扫描扑ֈ合适的行集Q也会发出对늚预取hQ也要等待第一ơ的返回?
APF Discards 0.0 0.0 0 n/a
报告已经被异步预取读入但在用之前就被放弃的|。如果其值高Q徏议增加缓冲池的尺寸单位(比如?K增加4K?K?6K的缓冲池Q以改善性能Q或者表C预取进入cache的很多页q不为查询所需要?
Dirty Read Behavior
Page Requests 0.0 0.0 0 n/a
隔离Uؓ0的脏读请求的|?
-------------------------------------------------------------------------------
Cache: default data cache ~省数据cache的情况:
per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Spinlock Contentionn/a n/a n/a 0.0 %
自旋锁只对SMP环境有用。当一个用户Q务对cache的修改完成之前,其它d不能访问该cache而只有等待。虽然自旋锁ȝ旉短,但对于高事务率的多处理器pȝ的性能依然有不好媄响,如果自旋锁比例超q?0%Q应考虑建立命名cache或者是增加cache分片?
Utilization n/a n/a n/a 100.0 %
下面是cache查的具体情况Q?
Cache Searches
Cache Hits 18.6 1.6 11171 89.9 %
Found in Wash 1.1 0.1 677 6.1 %
Cache Misses 2.1 0.2 1251 10.1 %
------------------------- ------------ ------------ ----------
Total Cache Searches 20.7 1.8 12422
Pool Turnover
2 Kb Pool
LRU Buffer Grab 0.2 0.0 102 100.0 %
Grabbed Dirty 0.0 0.0 0 0.0 %
------------------------- ------------ ------------ ----------
Total Cache Turnover 0.2 0.0 102
Buffer Wash Behavior
Statistics Not Available - No Buffers Entered Wash Section Yet
Cache Strategy
Cached (LRU) Buffers 19.8 1.7 11880 100.0 %
Discarded (MRU) Buffers 0.0 0.0 0 0.0 %
Large I/O Usage
Total Large I/O Requests 0.0 0.0 0 n/a
Large I/O Detail
No Large Pool(s) In This Cache
Dirty Read Behavior
Page Requests 0.0 0.0 0 n/a
单元九:内存理
命o行:sp_sysmon “00:10:00”,memory
l果Q?
Memory ManagementQ内存管理)
per secper xactcount % of total
--------------------------- ------------ ------------ ---------- ----------
Pages Allocated 0.0 0.0 13 n/a
Pages Released 0.0 0.0 13 n/a
内存中分配一个新늚ơ数Q相当于分配新页敎ͼQ以及释攑ֆ存的|?
单元十:盘I/O理
命o行:sp_sysmon “00:10:00”,diskio
l果Q?
Disk I/O ManagementQ磁盘I/O理Q?/p>
-------------------报告serverM盘I/O行ؓQ包括读、写和逻辑讑֤上的semaphore争夺?
Max Outstanding I/Os per sec per xact count % of total
最大显著I/O敎ͼserverM开销的最大I/O敎ͼ分别通过server和引擎表C?
------------------------- ------------ ------------ ---------- ----------
Server n/a n/a 10 n/a
Engine 0 n/a n/a 10 n/a
I/Os Delayed by
pȝ遇到I/O延迟问题Q类gI/O被server或操作系l限刉塞一栗多数操作系l都有一个参数限制异步I/O数。可用sp_configure查看参数“allow sql server async i/o”?
Disk I/O Structures n/a n/a 0 n/a
辑ֈ盘I/Ol构极限从而被延迟的I/O数。当server过了可用磁盘I/O的控制块敎ͼI/O׃被gq,因ؓserver在开始一个I/Oh旉要通过d来得C个磁盘I/O控制块。如果其值非Ӟ通过讄增加参数?#8220;disk i/o structures”Q缺?56Q来增加盘I/O控制块数Q如果操作系l允许尽可能讄大一些,以用光盘I/Ol构的机会降到最?
Server Config Limit n/a n/a 0 n/a
用参?#8220;max async i/os per server”Q缺?147483647Q进行调整server一ơ所用异步磁盘I/Oh数?
Engine Config Limit n/a n/a 0 n/a
引擎配置最大异步磁盘I/Oh数限Ӟ用参?#8220;max async i/os per engine”查看和调整?
Operating System Limit n/a n/a 0 n/a
操作pȝ的限制数查看操作pȝ文?
Device Activity Detail
----------------------
Device:
master.dat
master per sec per xact count % of total
------------------------- ------------ ------------ ---------- ----------
Reads
APF 0.0 0.0 0 0.0 %
Non-APF 0.2 0.0 102 78.5 %
Writes 0.0 0.0 28 21.5 %
------------------------- ------------ ------------ ---------- ----------
Total I/Os 0.2 0.0 130 1.5 %
Device Semaphore Granted 0.2 0.0 130 100.0 %
Device Semaphore Waited 0.0 0.0 0 0.0 %
-----------------------------------------------------------------------------
象Oraclepȝ那样Q在Sybase中优化器提示可以更改优化器。它们应当更慎重C用。当数据建模正确实行Q必要的索引存在Q及时地更新l计Q仔l编写代码后QASE优化器可以完成出色的优化工作?/p>
ASE允许你说明优化器改动如下Q?br /> [ SET FORCEPLAN ON ]
SELECT columns
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
DELETE table
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
[ SET FORCEPLAN OFF ]
指定索引
通过用关键字INDEX及说明indid或烦引名UC可以强制使用特定的烦引,如果你必dq用一个烦引,你应当一直用索引名称而不是indid。这是因为indid是根据生成的ơ序分派l许多烦引,例行的数据库l护会改变indid?/p>
你也可以? INDEX 0 )来定义一个图表扫描。这意味着ASE要进行一ơ全图表扫描?/p>
强制索引
SELECT columns
FROM table ( INDEX index_name )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( INDEX index_name )
WHERE columns = something
DELETE table
FROM table ( INDEX index_name )
WHERE columns = something
To force a Full Table Scan:
SELECT columns
FROM table ( INDEX 0 )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( INDEX 0 )
WHERE columns = something
DELETE table
FROM table ( INDEX 0 )
WHERE columns = something
象我们前面提到的Q用提CZ引v应用l护和最甲优化策略的应用问题Q如果你要强制实施烦引或图表扫描Q不要在应用代码内执行。用索引或图表扫描生成一个viewQ用view作ؓ图表。这你的l护方便很多Qƈ且指明了强制索引或图表扫描的对象?/p>
例如
CREATE
VIEW vw_[index_name | scan]_test_table
AS
SELECT columns
FROM table ( INDEX index_name | 0 )
go
q段语句讉K了图表,强制实施了一U方法,q可以用作view
例如
SELECT columns
FROM vw_[index_name | scan]_table
WHERE columns = something
UPDATE table
SET columns = something
FROM vw_[index_name | scan]_table
WHERE columns = something
DELETE table
FROM vw_[index_name | scan]_table
WHERE columns = something
q接ơ序
用SET FORCEPLAN [ ON | OFF ]实施q接ơ序
警告Q!Q实施连接次序会增加应用的维护工作。另外系l的发展也会产生一条更有效的途径?/p>
Ҏ选项讑֮的SET FORCEPLAN ON all查寻用它们在查MFROM子句的次序来q接?/p>
例如
SET FORCEPLAN ON
SELECT t1.columns
FROM table1 t1,
table2 t2
WHERE t1.column01 = t2.column01
SET FORCEPLAN OFF
go
在前面的例子中,我们强制ASE在作为Outer图表的test_table1上进行扫描,Ҏl计情况q可能是一件很坏的事,只要非常熟练的DBA才能用这L逻辑来实施?br />
1、内?br />
内存是对性能影响最大,也是最需要也是最难调优的地方。内存调优一定要Q常用的需要调整的参数有:
sp_configure “max memory”,0,”2600M” (讄为共享内存的75%,重启生效)
sp_configure “allocate max shared mem”,1 (启动的时候自动分配max memory指定的最大内?
sp_cacheconfig “default data cache”,”1300m”(讄数据~存为max memory的一?
sp_cacheconfig “default data cache”,”cache_partition=2″
sp_configure “procedure cache size”,102400 (q程高速缓?通常是max mem20%-30%,q里?00M,在大量的执行sql的时候这个参C定要调大)
sp_cacheconfig ‘tempdb_cache’,'100m’,'mixed’ (创徏一?00M命名高速缓存tempdb_cacheltemdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (tempdb_cachel定到tempdb)
实际中遇C个很头痛的问题, 32位Windows版本的Sybase 最大内存只能到搞到3G左右Q?default data cache"的Dq?1500M Sybase实例pv不来了,D服务器的16G内存形同虚设Q所以如果大家的目和我q个cMQ服务器和操作系l由客户提供Q还换不了的Q内存不妨要求个4G够了,多了也浪贏V?/p>
2、CPU
当服务器的CPU个数多于一个时Q可以考虑多CPU。实际上对于OS会自动调度,设一下只不过是控制的更精一炏V实际需要根据CPU数来修改Q若CPU=NQ一般设|ؓN-1。设|这个参敎ͼ比如我的服务?个CPU, 像下面q样讄Q?/p>
sp_configure “max online engines”,7
sp_configure “number of engines at startup”,7
sp_configure “max parallel degree”,1 (q行的度Q大于或{于1)
sp_configure “number of worker processes”,7 (q行度*q发q接敎ͼ1.5?
3、连接数(q个没什么说的,数量够可以,默认Cؓ25Q可Ҏ应用需要来修改?
sp_configure “number of user connections”,600
查询数据库死q程
select * from master..syslogshold
4、锁
数据库的锁机制其实是一个比较复杂的话题Q这里只能简单说一下。Sybase数据库系l两个别的锁机Ӟ所有页锁、数据页锁。所有页锁在当数据库加锁Ӟ既锁数据,也锁索引;数据锁当数据库加锁Ӟ只锁数据,不锁索引c?br />
Sybase支持三种cd的锁: 数据表锁、数据页锁、数据行锁?一些常用的调优命o和策略如?
sp_configure "number of locks",50000 Q设|锁的数量)
pȝ讄时要把锁的数量设大一点,单说是要管够;如果需要节省空_减少l护量,使用所有页锁机Ӟ而如果需要加快速度Q空间够,使用数据锁机制?/p>
sp_sysmon “00:10:00”,locks Q检表的用情况)
当通过监测发现锁竞争超q?5%Ӟ首先修改加锁最重的表的锁机Ӟ然后再把数据锁讄为数据行锁。如果发现螺旋锁多,则ؓ该表建立单独的命名缓存ƈ对命名缓存进行分区?/p>
5、I/O
数据库调优ȝ思\是尽量减和分散物理I/OQ尽量减网lI/O?/p>
减少物理I/O的办法有Q?在命名缓存中增加大块的I/O~冲池,把数据分散到多个盘?采用RAID技?建立D,使一个表跨越多个盘{等Q基本和其他的数据库软g调优一栗?br />
减少|络I/O的办法是采用大数据包?br />
sp_configure "default network packet size",2048 讄|络传送包的大?需要重启动)
sp_configure "max network packet size",2048
6、设备调?br />
主要调整两块Q?一个是业务数据库的数据讑֤与日志设备必d开Q添加时数据库讑֤Q另一个是调整TempdbQ这一条很重要却很Ҏ被大家忽视?br />
Tempdb是sybase数据库当中的临时库,用于存放中间l果和时表。由于用很频繁而默认大又很小Q我们需要加大其讑֤I间和库的大,可能把tempdb攄到最快的盘上,q徏立单独的命名~存?br />
sp_cacheconfig ‘tempdb_cache’,'200m’,'mixed’ (创徏一?00M命名高速缓存tempdb_cacheltemdpb使用)
sp_bindcache ‘tempdb_cache’,tempdb (tempdb_cachel定到tempdb)
1. 查看数据库的版本
select @@version
2. 查看数据库所在机器操作系l参?
exec master..xp_msver
3. 查看数据库启动的参数
sp_configure
4. 查看数据库启动时?
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看数据库服务器名和实例?
print 'Server Name...............Q? + convert(varchar(30),@@SERVERNAME)
print 'Instance..................Q? + convert(varchar(30),@@SERVICENAME)
5. 查看所有数据库名称及大?
sp_helpdb
重命名数据库用的SQL
sp_renamedb 'old_dbname', 'new_dbname'
6. 查看所有数据库用户d信息
sp_helplogins
查看所有数据库用户所属的角色信息
sp_helpsrvrolemember
修复q移服务器时孤立用户?可以用的fix_orphan_user脚本或者LoneUserq程
更改某个数据对象的用户属?
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
注意Q更改对象名的Q一部分都可能破坏脚本和存储q程?
把一台服务器上的数据库用L录信息备份出来可以用add_login_to_aserver脚本
查看某数据库?对象U用h?
sp_helprotect
7. 查看链接服务?
sp_helplinkedsrvlogin
查看q端数据库用L录信?
sp_helpremotelogin
8.查看某数据库下某个数据对象的大小
sp_spaceused @objname
q可以用sp_toptablesq程看最大的N(默认?0)个表
查看某数据库下某个数据对象的索引信息
sp_helpindex @objname
q可以用SP_NChelpindexq程查看更详l的索引情况
SP_NChelpindex @objname
clustered索引是把记录按物理顺序排列的Q烦引占的空间比较少?
寚w值DML操作十分频繁的表我徏议用非clustered索引和约束,fillfactor参数都用默认倹{?
查看某数据库下某个数据对象的的约束信?
sp_helpconstraint @objname
9.查看数据库里所有的存储q程和函?
use @database_name
sp_stored_procedures
查看存储q程和函数的源代?
sp_helptext '@procedure_name'
查看包含某个字符串@str的数据对象名U?
select distinct object_name(id) from syscomments where text like '%@str%'
创徏加密的存储过E或函数在AS前面加WITH ENCRYPTION参数
解密加密q的存储q程和函数可以用sp_decryptq程
10.查看数据库里用户和进E的信息
sp_who
查看SQL Server数据库里的活动用户和q程的信?
sp_who 'active'
查看SQL Server数据库里的锁的情?
sp_lock
q程?--50是SQL Serverpȝ内部用的,q程号大?0的才是用Lq接q程.
spid是进E编?dbid是数据库~号,objid是数据对象编?
查看q程正在执行的SQL语句
dbcc inputbuffer ()
推荐大家用经q改q后的sp_who3q程可以直接看到q程q行的SQL语句
sp_who3
查死锁用sp_who_lockq程
sp_who_lock
11.查看和收~数据库日志文g的方?
查看所有数据库日志文g大小
dbcc sqlperf(logspace)
如果某些日志文g较大Q收~简单恢复模式数据库日志Q收~后@database_name_log的大单位ؓM
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 语句的方法:
set statistics time {on | off}
set statistics io {on | off}
囑Ş方式昄查询执行计划
在查询分析器->查询->昄估计的评估计?D)-Ctrl-L 或者点dh里的囑Ş
文本方式昄查询执行计划
set showplan_all {on | off}
set showplan_text { on | off }
set statistics profile { on | off }
13.出现不一致错误时QNT事g查看器里?624号错误,修复数据库的Ҏ
先注释掉应用E序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操?
alter database [@error_database_name] set single_user
修复出现不一致错误的?
dbcc checktable('@error_table_name',repair_allow_data_loss)
或者可惜选择修复出现不一致错误的型数据库名
dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB ?个参敎ͼ
repair_allow_data_loss 包括对行和页q行分配和取消分配以Ҏ分配错误、结构行或页的错误,以及删除已损坏的文本对象Q这些修复可能会D一些数据丢失?
修复操作可以在用户事务下完成以允许用户回滚所做的更改?
如果回滚修复Q则数据库仍会含有错误,应该从备份进行恢复?
如果׃所提供修复{的缘故遗漏某个错误的修复Q则遗漏Q何取决于该修复的修复?
修复完成后,请备份数据库?
repai*_**st q行的、不耗时的修复操作,如修复非聚集索引中的附加键?
q些修复可以很快完成Qƈ且不会有丢失数据的危险?
repair_rebuild 执行?repai*_**st 完成的所有修复,包括需要较长时间的修复Q如重徏索引Q?
执行q些修复时不会有丢失数据的危险?
d、删除、修改用db.Execute(Sql)命o执行操作
?-------------------?
?数据记录{??
?-------------------?
注意Q单双引L用法可能有误(没有式)
Sql = "Select Distinct 字段?From 数据?
Distinct函数Q查询数据库存表内不重复的记?
Sql = "Select Count(*) From 数据?where 字段?>#18:0:0# and 字段?< #19:00# "
count函数,查询数库表内有多条记录Q?#8220;字段?”是指同一字段
例:
set rs=conn.execute("select count(id) as idnum from news")
response.write rs("idnum")
sql="select * from 数据?where 字段?between ? and ?"
Sql="select * from 数据?where 字段?between #2003-8-10# and #2003-8-12#"
在日期类数gؓ2003-8-10 19:55:08 的字D里查找2003-8-10?003-8-12的所有记录,而不是几点几分?
select * from tb_name where datetime between #2003-8-10# and #2003-8-12#
字段里面的数据格式ؓQ?003-8-10 19:55:08Q通过sql查出2003-8-10?003-8-12的所有纪录,而不是几点几分?
Sql="select * from 数据?where 字段?字段?order by 字段?[desc]"
Sql="select * from 数据?where 字段?like '%字段?' order by 字段?[desc]"
模糊查询
Sql="select top 10 * from 数据?where 字段?order by 字段?[desc]"
查找数据库中?0记录
Sql="select top n * form 数据?order by newid()"
随机取出数据库中的若q条记录的方?
top nQn是要取出的记录?
Sql="select * from 数据?where 字段?in ('?','?','?')"
?-------------------?
?d数据记录 ?
?-------------------?
sql="insert into 数据?(字段1,字段2,字段3 …) valuess (?,?,? …)"
sql="insert into 数据?valuess (?,?,? …)"
不指定具体字D名表示按照数据表中字D늚序Q依ơ添?
sql="insert into 目标数据?select * from 源数据表"
把源数据表的记录d到目标数据表
?-------------------?
?更新数据记录 ?
?-------------------?
Sql="update 数据?set 字段?字段?where 条g表达?
Sql="update 数据?set 字段1=?,字段2=? …… 字段n=值n where 条g表达?
Sql="update 数据?set 字段1=?,字段2=? …… 字段n=值n "
没有条g则更新整个数据表中的指定字段?
?-------------------?
?删除数据记录 ?
?-------------------?
Sql="delete from 数据?where 条g表达?
Sql="delete from 数据?
没有条g删除数据表中所有记?
?-------------------------?
?数据记录l计函数 ?
?-------------------------?
AVG(字段? 得出一个表格栏q_?
COUNT(*|字段? Ҏ据行数的l计或对某一栏有值的数据行数l计
MAX(字段? 取得一个表格栏最大的?
MIN(字段? 取得一个表格栏最的?
SUM(字段? 把数据栏的值相?
引用以上函数的方法:
sql="select sum(字段? as 别名 from 数据?where 条g表达?
set rs=conn.excute(sql)
?rs("别名") 获取l的计|其它函数q用同上?
?----------------------------?
?数据表的建立和删??
?----------------------------?
CREATE TABLE 数据表名U?字段1 cd1(长度),字段2 cd2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名U?(怹性删除一个数据表)
?-------------------------?
?记录集对象的Ҏ ?
?-------------------------?
rs.movenext 记录指针从当前的位|向下移一?
rs.moveprevious 记录指针从当前的位|向上移一?
rs.movefirst 记录指针移到数据表W一?
rs.movelast 记录指针移到数据表最后一?
rs.absoluteposition=N 记录指针移到数据表WN?
rs.absolutepage=N 记录指针移到第N늚W一?
rs.pagesize=N 讄每页为N条记?
rs.pagecount Ҏ pagesize 的设|返回总页?
rs.recordcount q回记录L
rs.bof q回记录指针是否出数据表首端,true表示是,false为否
rs.eof q回记录指针是否出数据表末端,true表示是,false为否
rs.delete 删除当前记录Q但记录指针不会向下Ud
rs.addnew d记录到数据表末端
rs.update 更新数据表记?br />
14.查询数据库死q程
select * from master..syslogshold
插入一些数据后Q我们可以测试如下:
1> set showplan on
2> go
1> declare @var_int int
2> select @var_int=2
3> select * from Test where c1=@var_int
4> go
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is DECLARE.
QUERY PLAN FOR STATEMENT 2 (at line 2).
STEP 1
The type of query is SELECT.
QUERY PLAN FOR STATEMENT 3 (at line 3).
STEP 1
The type of query is SELECT.
FROM TABLE
Test
Nested iteration.
Using Clustered Index.
Index : PK_Test
Forward scan.
Positioning by key.
Keys are:
c1 ASC
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
(1 row affected)
c1 c2 c3
----------- ------------------------ --------------------
2 129.14 Hellen
(1 row affected)
我们看到Qsybase的执行计划会使用clustered index来读取数据?br />
下面Q采用moneycd来进行测?br />
1> declare @var_money money
2> select @var_money=2
3> select * from Test where c1=@var_money
4> go
QUERY PLAN FOR STATEMENT 1 (at line 1).
STEP 1
The type of query is DECLARE.
QUERY PLAN FOR STATEMENT 2 (at line 2).
STEP 1
The type of query is SELECT.
QUERY PLAN FOR STATEMENT 3 (at line 3).
STEP 1
The type of query is SELECT.
FROM TABLE
Test
Nested iteration.
Table Scan.
Forward scan.
Positioning at start of table.
Using I/O Size 2 Kbytes for data pages.
With LRU Buffer Replacement Strategy for data pages.
(1 row affected)
c1 c2 c3
----------- ------------------------ --------------------
2 129.14 Hellen
(1 row affected)
我们可以看到Qsybase没有采用索引Q而是采用了全表扫描?br />
实际上,Sybaseq不是类型不一致就一定不会用烦引,而是有一个匹配原则,原则上是只要索引列的cd优先U高于搜索条件的数据cdQ就会用烦引?br />
q个优先U,可以通过查询pȝ表master.dbo.systypes.
1> select hierarchy,name from master.dbo.systypes
2> order by 1
3> go
hierarchy name
--------- ------------------------------
1 floatn
2 float
3 datetimn
4 datetime
5 real
6 numericn
7 numeric
8 decimaln
9 decimal
10 moneyn
11 money
12 smallmoney
13 smalldatetime
14 intn
15 int
16 smallint
17 tinyint
18 bit
19 univarchar
20 unichar
22 sysname
22 varchar
22 nvarchar
23 char
23 nchar
24 timestamp
24 varbinary
25 binary
26 text
27 image
99 extended type
![]() 补充一点: --创徏非聚集烦?br /> 1.满查询条g的数据不过20% 2.能实?index covering 3.用于集函数、连接、group by和order by的列 4.要权衡烦引对查询速度的加快与降低修改速度之间的利?br /> --删除影响性能的烦?br /> 如果一个应用在白天执行数据修改Q在夜间生成报表Q?br /> 需要在早晨删除索引Q在晚上再把索引重徏h?br /> 另外许多pȝ设计者创多优化器很少使用的烦引, 可以ҎshowplanQ把没有用的索引删除?/td> |
首先Q有一句话要认?Q?80%的性能问题由SQL语句引v?br />
l过?SYBASE 的书Q结合从 MSSQL q移q来的系l过E?Q发C下几个问题比较重要:
l验一、where 条g左边最好不要用函敎ͼ比如 ★★★★?br />
select ... where datediff(day,date1,getdate())>;0
q样即?date1 列上建立了烦引,也可能不会用烦引,而用表扫描?br />
q样的语句要重新规划设计Q保证不使用函数也能够实现。通过修改Q一个系l过E的q行效率提高大约100倍!此外不要使用诸如like '%ab',不能充分利用索引Q而要?前加字符
l验二、两个比较字D|好用相同数据类型,而不是兼Ҏ据类型。比?int ?numericQ感觉一般不是太明显Q★?br />
l验三、复合烦引的非前导列做条件时Q基本没有v到烦引的作用。★★★★★
比如 create index idx_tablename_ab on tablename(a,b)
update tablename set c = XX where b>;= XXX and ...
在这个语句中Q基本上索引没有发挥作用?D表扫描引起blocking 甚至q行十几分钟后报告失败?br />
一定要认真?Ҏ措施Q?在接口中附加条g
update tablename set c = XX where a = XXX and b>;= XXX
或者徏立烦引类g
create index idx_tablename_ba on tablename(b,a)
l验四?多个大表的关联查询,如果性能不好Qƈ且其中一个大表中取的数据比较,可以考虑查询分两步执行。★★★?br />
先将一个大表中的少部分数据 select * into #1 from largetable1 where ...
然后再用 #1 d兌Q效果可能会好不。(前提Q生?#1表应该用比较好的烦引,速度比较快)
l验五?tempdb 的用。★★★★★
最好多?select into Q这样不记日?Q尤其是有大量数据的报表时。虽然写hȝQ但值得?br />
create table #tmp1 (......)q样写性能不好。尤其是大量使用ӞҎ发生tempdb 争用?br />
l验六?pȝU别的参数设|?nbsp; ★★★★
一定要估计一下,不要使用太多Q占用资?nbsp; Q太,发生性能问题?br />
q接敎ͼ索引打开个数、锁个数 {?当然 Q内存配|不要有明显的问题,比如Qprocedure cache
不够 Q一般缺?0%Q如果觉得太多,可以减少一些)。如果做报表l常使用大数据量读,可以考虑使用
16Kdata cache
l验七、烦引的建立。很重要。★★★★★
clustered index /nonclustered index 的差异,自己要搞清楚。各适用场合Q另外如?br />
clustered index 不允?重复敎ͼ也一定要说明?br />
索引设计是以为数据访问快速ؓ原则的,不能 完全Q!Q) 参照数据逻辑设计的,逻辑设计时的一些东西,
可能对物理访问不起作?br />
l验八、统计数据的更新Q大U?0天进?update statistics ,sp_recompile table_nameQ★★★Q?br />
l验九、强制烦引?Q★★★★)
如果怀疑有表访问时不是使用索引Q而且q些条g字段上徏立了合适的索引,可以强制使用
select * from tableA (index idx_name) where ...
q个对一些报表程序可能比较有用?br />
l验十、找一个好的监视工?★★?br />
工欲善其事,比先利其器,一炚w不错呀?br />
我用 DBartisian 5.4 ,监视哪些表被锁定旉长, blocking {?br />
q有 sp_object_status 20:00:00 Q?sp_sysmon 20:00:00 {?br />
以上是我的一点经验,在不C个月的时间内Q我修改?0个左右的语句和系l过E?nbsp; Q?br />
pȝ性能明显改善Qcpu利用 高峰时大U?0% qx 不到30%IO 明显改善。所有月报表能顺利完?5min 以内?/p>
l验十一Q?l合以上对IN/EXISTS的讨论,我们可以得出一个基本通用的结论:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情c?br />
另外Q系l中认不用的中间数据Q可以进行{UR这些要看系l的情况?br />
最后祝你好q气?br />
以上Z人经验,Ƣ迎批评指正Q?nbsp;
呵呵 写完后忘C?nbsp; 一定要注意热点?Q这是媄响ƈ发问题的一个潜在因素。!解决ҎQ?行锁模式 如果表的行比较小Q可以故意增加一些不用的字段
比如 char(200) 让一中存放的行不要太多?/p>
l护目的Q?br />
监测数据库的当前q行状况Q保证数据库E_q行?br />
做好数据库的日常的备份工作,减轻问题发生时的风险和责?br />
数据库的整体运行状况,Ҏ据库的性能q行调整Q保证数据库高效的运行?br />
可以减少紧急故障发生频率,减少对系l的影响?br />
早发现pȝ存在的潜在问题,使可能的故障消除在萌芽状态?/p>
数据库日常维护的主要内容
监测数据库运行情?br />
监控CPU和I/O的用情?br />
监控I间的用情?br />
监控数据库的错误日志errorlog
制定一个合理的备䆾计划
查数据库的一致?br />
数据库的排错
数据库性能调整
数据库日常维护的Ҏ
数据库服务和备䆾服务的启动和关闭Ҏ
数据库和备䆾服务的启?br />
$cd $SYBASE/ASE-12_*/install
$startserver –f RUN_Servername(ServernameZ的数据库服务?
$startserver –f RUN_Servername_back
数据库和备䆾服务的关?br />
isql –Usa –Pxxx –Sservername
>shutdown SYB_BACKUP (关闭备䆾服务)
>go
>use dbname (用户?
>go
>checkpoint
>go
>shutdown
>go
查看sybase用户的运行环境是否正?br />
$env
查看SYBASE,SYBASE_ASE,SYBASE_OCS{环境是否正?br />
查看数据库服务和备䆾服务q程是否q行正常
$ps –ef | grep dataserver
$ps –ef | grep backupserver
查看数据库的版本和补丁信?br />
$dataserver –v
或是
isql –Usa –Pxxx –Sservername
>select @@version
查数据库的配|是否合?
查数据库内存分配、锁个数、存储过E缓册Ӏ多CPU配置、用戯接配|、网l包寸{重要参数的讄?br />
命oQ?br />
sp_configure ‘allocate max shared memory’
sp_configure ‘max memory‘
sp_configure ‘procedure cache size‘
sp_configure ‘user log cache size’
sp_configure ‘default network packet size’
sp_cacheconfig
sp_configure ‘number of user connections‘
sp_configure ‘number of locks‘
sp_configure ‘number of engines at startup’
sp_configure ‘max online engines’
sp_configure “number of open index”
sp_configure “number of open objects”
sp_configure “number of open partitions”
查看数据库的用户Q数据库的锁状况
sp_who(用户)
sp_lock(?
select spid,blocked from sysprocesses where blocked>0(查阻塞进E?
查看最早进E,发现不完整事?br />
select * from master..syslogshold
其中对应的spid为最早的q程Q如果最早的q程开始时间距d前时间已l非帔R(???Q则可能该进E有问题Q确认后Q应该将其killQ下面有一个存储过E来不完整的事务,可以该存储q程攑֜操作pȝ的crontab中?/p>
create proc proc_kill
@last_min int=720
AS
/*
** kill the processes that didn’t commit for a impossible time
** the parameter's time unit is minute,default is 12 hours
** the procedure is just for user transactions ,not for xa transaction
** you can add this procedure to your opration system crontab
*/
declare @spid int
declare @cspid char(20)
select spid into #killtab from master..syslogshold where datediff(mi,starttime,getdate()) >@last_min and spid>0
declare t1_cur cursor for select * from #killtab
open t1_cur
fetch t1_cur into @spid
while @@sqlstatus!=2
begin
select @cspid=convert(char(20),@spid)
select "kill "+@cspid
exec("kill "+@cspid)
fetch t1_cur into @spid
end
查看CPU和I/O的?br />
#sar #iostat
#vmstat
查看Sybase的资源?br />
sp_sysmon “00:10:00”
如果CPU或是I/O的用率长期高于80%Q则要看pȝ使用是否正常q是pȝ资源配置不够Q具体细节可参考下面数据库的优化部分?br />
定期查数据库日志使用的情况,定期清除数据库的日志
如果数据库日志满Q则业务无法q行?br />
sp_helpdb dbname(用户库名)
发现数据库的日志I间不Q应立刻清除已经完成的事务,或是Ҏ需要扩大日志空间?br />
定期清除日志Q?br />
dump tran dbname with truncate_only
可以上q的命o攑֜crontab中?br />
定期查磁盘空间的使用?如果发现操作pȝ有磁盘分Z用达?00%Q应快处理?br />
#df -k
定期查数据库的错误日?errorlog)Q如果错误日志中发现有数据库的严重错误,应立卛_理?br />
有计划的截断数据库的错误日志?br />
数据库运行一定时间后Q可以在数据库没有业务时Q(下班或周末)Q将数据库stop后,错误日志更名,然后重新启动数据库,产生一个新的数据库错误日志?/p>
在错误日志中,以下的错误别ؓ不严重错?通常是用户错?如语?d权限I间不{?br />
10 Status information
11 Specified database object not found
12 Wrong datatype encountered
13 User transaction syntax error
14 Insufficient permissions to execute commands
15 Syntax error in SQL statement
16 Miscellaneous user error
Hardware/software errors
17 Insufficient resources
18 Non-fatal internal error
在错误?7?要注意错误号1105,1105表示I间不(数据库数据或是日??br />
在错误?8?最多的?608,1608表示一个客戯接不是正常方式退出的Q?br />
q类错误不用x?/p>
以下错误U别Z重错?通常是系l?数据库、磁盘损坏、操作系l?错误
19 Fatal error in resource
20 Fatal error in current process
21 Fatal error in database process
22 Fatal error: table integrity suspect
23 Fatal error: database integrity suspect
24 Hardware error or system table corruption
在错误日志中Q可以按?Sybase Technical Support"来搜索,
扑ֈ的错误通常是严重错误?/p>
查数据库的一致?br />
系l数据库、用h据库的数据分配页物理可用性,查数据库pȝ表和用户表的数据完整性,查看是否有表损坏Q可能是逻辑也可能是物理的损坏,如磁盘错误可能导致数据库的表损坏Q?br />
做数据库的一致性通常需要单用户状态,q且都是一些耗时操作Q如果数据库大的话)Q因此,q些查可以考虑在系l检修时q行?br />
dbcc checkalloc(dbname)查数据库的空间分配,必须在单用户下执?br />
checkcatalog(dbname) 查系l表的一致?br />
dbcc checkdb(dbname) 查用h据库的数据库一致?包括pȝ表和用户?
dbcc checktable(tablename) 查一张表的数据一致性?/p>
数据库的备䆾
数据库的备䆾对于日常的维护来说十分重要,pȝ理员一定要注意数据库每天都有成功备份。需要检查备份的介质(盘或是带)是否正常?br />
备䆾命o:
dump database to ‘/xx/xxx’ Q设备名或是盘上的文g名)
用户可以规划一个备份的计划Q然后将备䆾的命令放在crontab 中,让系l自动定时做数据库的备䆾?/p>
数据库的排错
数据库通常的错误主要是以下几种
数据库服务无法启?br />
解决Q查看数据库的错误日志,Ҏ错误日志扑ֈ无法启动的原因,原因通常是ip地址Q端口不Ҏ是被占用Q内存配|过大,或是数据库设备的属性不对,sybase用户没有讉K权限?br />
数据库不能恢?recovery)
解决Q查看数据库的错误日志,扑ֈ数据库不能恢复的原因Q然后做相应的处理。通常是由于系l突然断甉|是系l非正常x?br />
用户表不能访?br />
解决Q查看数据库的错误日志,扑ֈ不能讉K的原因。通常是由于访问权限或是表损坏Q?
最常见的数据库重大故障分析
Ҏ我们的经验,除去g故障外,造成重大数据库故障都是因为日志满Q重启动时异常删除日志导_
而日志满主要是一下几个原因造成Q?br />
1Q数据库配置不合?br />
主要是内存、锁的配|不合理?br />
2Q存在不完整的事务或是进E?br />
出现q种情况是由于不完整的事务引L。引起不完整的事务主要有两个斚w的原因:W一是网l质量不佻I如果在客L向ASE服务端进行事务时Q如果网l突然中断,会导致事务的不完整。第二是应用E序存在问题Q而在q种情况下,重新启动数据库服务后Q数据库的恢复可能是非常~慢的,主要是看日志的大和事务的类型,Q有时用户ؓ了快速启动,通常会异常清除数据库的日志,有可能会造成数据库表损坏Q所以,在这U情况下千万不要急于重新启动数据库服务?br />
如果存在不完整的事务Q在该事务之后的所有事务都不能被清除,D数据库日志满?br />
不完整的事务可以从master..syslogshold表中发现Q如果其中starttimeQ最早的事务开始时_距离当前旉很长Q比如一天,一月,则该事务应该是一个不完整的事务,可以该事务对应的数据库q程kill?/p>
3Q出现过大的事务
q类问题完全是应用或是h为造成的问题。例如一ơ删除一?000万条记录的表Q导致日志满。这U情况下重启动服务,数据库的恢复也将是十分缓慢的Q防止出现这c问题,是将大事务{换成许多事务来执行。在事务之间来删除数据库的日志。例如手工删除日志或是将数据库设|成自动清日志?/p>
数据库的性能优化
查看数据库的配置Q看能否有不合理的数据库配置?br />
查看Ҏ参考上一节查看数据库的配|?br />
更新数据库的l计信息(锁)
update statistics tablename
对行锁表回收I间(表锁)
reorg rebuild tablename
做空间回收时需要在pȝl护时做
监测数据库的q行Q查看是否阻塞羃
sp_lock
sp_who
select spid,bloced from master..sysprocesses where blocked>0
Ҏ据库pȝq行q行监测Q发现可能引h能差的因素
在系l运行忙或是性能不佳时运?br />
sp_sysmon “00:10:00”
分析的一些常用工P
在应用开发或是执行之前,对可能引起问题的语句查命令:
set showplan on
set noexec on
q样Q可以看到该语句的执行过E,而该语句q不执行?/p>
set showplan off
set noexec off
off 以上的选项
set statistics io on /off
set statistics time on/off
在语句执行时可以看到I/O的实际情况(包括物理I/O,逻辑I/O)
以上语句Zsession
在运行过E中查找可能有问题的语句的命令:
q行几次 sp_lock
查找其中对表意向?(sh_intent,ex_intent)较长旉的进E,记录下spid
( 比如Qupdate 一?00万条记录中的一条,如果表不使用索引Q最l会有一个Ex_row锁,但在表扫描期_一直会有一?br />
Ex_intent意向锁)
通过spid,可以看到执行命o和执行过E:
dbcc traceon(3604)
go
dbcc sqltext(spid)
go
sp_showplan spid,null,null,null
go
查找dq程Q?br />
select spid,blocked from master..sysprocesses where blocked>0
其中blocked 对应d别h的进行,spid对应被阻塞经常,
查看blocked对应q程执行的命令和执行q程
Ҏ同上
查找最耗资源的q程Q下面有两个存储q程Q可以分析在数据库繁忙时最消耗cpu和i/o资源的数据库q程Qƈ昄该进E所执行的语句以及执行的q程Q根据执行过E来判断问题的原因?/p>
if exists( select name from sysobjects where type='P' and name='proc_who_do_io')
drop proc proc_who_do_io
go
/* print top n (of physical_io usages) applications 's execute plan and sql */
/* example useage : proc_who_do_io */
create proc proc_who_do_io
@inter_time char(8)='00:00:05',
@topn int=3
as
declare @spid int
select @spid=11
dbcc traceon(3604)
select spid,cmd,physical_io,hostname,program_name into #t1 from master..sysprocesses order
by spid
waitfor delay @inter_time
select spid,cmd,physical_io ,hostname,program_name into #t2 from master..sysprocesses order
by spid
select #t1.spid,#t1.cmd,#t1.program_name,#t1.physical_io as phy_io,#t1.hostname,#t2.physical_io - #t1.physical_io as
phy_io_add into #t3 from #t1,#t2
where #t1.spid=#t2.spid and abs(#t2.physical_io - #t1.physical_io) >2 order by #t2.physical_io - #t1.physical_io desc
select * from #t3
select * into #t4 from #t3 where 1=2
set rowcount 1
while @topn >0
begin
insert #t4 select * from #t3
delete #t3
select @spid=spid from #t4
select "execute plan :"+ str(@spid)
exec sp_showplan @spid,null,null,null
dbcc sqltext(@spid)
delete #t4
select @topn = @topn-1
end
set rowcount 0
go
if exists( select name from sysobjects where type='P' and name='proc_who_use_cpu')
drop proc proc_who_use_cpu
go
/* print top n (of cpu usages) applications 's execute plan and sql */
/* example useage : proc_who_use_cpu */
create proc proc_who_use_cpu
@inter_time char(8)='00:00:05',
@topn int=3
as
declare @spid int
select @spid=11
dbcc traceon(3604)
select spid,cmd,cpu,hostname,program_name into #t1 from master..sysprocesses order
by spid
waitfor delay @inter_time
select spid,cmd,cpu ,hostname,program_name into #t2 from master..sysprocesses order
by spid
select #t1.spid,#t1.cmd,#t1.program_name,#t1.cpu ,#t1.hostname,#t2.cpu - #t1.cpu as
cpu_add into #t3 from #t1,#t2
where #t1.spid=#t2.spid and abs(#t2.cpu - #t1.cpu) >2 order by #t2.cpu - #t1.cpu desc
select * from #t3
select * into #t4 from #t3 where 1=2
set rowcount 1
while @topn >0
begin
insert #t4 select * from #t3
delete #t3
select @spid=spid from #t4
select "execute plan :"+ str(@spid)
exec sp_showplan @spid,null,null,null
dbcc sqltext(@spid)
delete #t4
select @topn = @topn-1
end
set rowcount 0
go
数据库版本在 ASE12.5.0.3以上Q?L索引使用情况
select s.SPID,s.CpuTime,t.LineNumber,t.SQLText
from monProcessStatement s,monProcessSQLText t
where s.SPID=t.SPID
order by s.CpuTime,s.SPID,t.LineNumber desc
Sybase锁原理
数据׃n与数据一致性是一对不可调和的矛盾Qؓ了达到数据共享与数据一_必须q行q发控制。ƈ发控制的d是Z避免׃n冲突而引L数据不一致。Sybase SQL Serverq发控制的方法是加锁机制QLOCKINGQ?
锁的cd
可申L?br /> 已有的锁 | S | U | X |
S | ?/td> | ?/td> | × |
U | ?/td> | × | × |
X | × | × | × |
Sybase SQL Server有三U封锁类型:排它锁(exclusive lock,UX锁)Q共享锁Qshare lock,US锁)Q更新锁Qupdate lock,UU锁)。这三种锁的相容矩阵表如下:
×:表示不兼宏V∨Q表C兼宏V?/p>
Sybase SQL Server是自动决定加锁类型的。一般来_读(SELECTQ操作用S锁,写(UPDATE,INSERT和deleteQ操作用X锁。U锁是建立在页U上的,它在一个更新操作开始时获得Q当要修改这些页ӞU锁会升为X锁?/p>
锁的力度
SQL Server有两U锁Q页锁和表锁。通常锁比表锁的限制更少Q或更小Q。页锁对本页的所有行q行锁定Q而表锁则锁定整个表。ؓ了减用户间的数据争用和改进q发性,SQL Server试图可能地使用锁?/p>
当SQL Server军_一个语句将讉K整个表或表的大多数页Ӟ它用表锁来提供更有效的锁定。锁定策略直接受查询ҎU束Q如果update或delete语句没有可用的烦引,它就执行表扫描或h一个表锁定。如果update或delete语句使用了烦引,它就通过h锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的锁过锁提升阈|SQL Serverp法给该对象分配一个表锁。如果成功了Q页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁?/p>
锁的状?/strong>
SQL SERVER加锁有三U状态:
1Q意向锁QintendQ—是一U表U锁Q它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据늚表上获得排它锁?/p>
2Q阻塞(blocking,记blkQ—它表明目前加锁q程的状态,带有blk后缀的锁说明该进E目前正d另一个需要获得锁的进E,只有q一q程完成Q其他进E才可以q行?/p>
3Q需求锁QdemandQ—表C此时该q程企图得到一个排它锁。它可以防止在这一表或上加过多的S锁,她表C某一事务是下一个去锁定该表和该늚事务?/p>
需求锁是一个内部过E,因此用sp_lock是无法看见的?/p>
死锁DEADLOCK
单地_有两个用戯E,每个q程都在一个单独的|表上有一个锁Q而且每个q程都想在对方进E的|表上h不相定w时就会发?#8220;死锁”。在q种情况下,W一个进E在{待另一q程释放锁,但另一q程要等到第一个进E的对象释放时才会释放自q锁?/p>
SQL Server查是否死锁,q终止事务中CPU旉U篏最的用户Q即最后进入的用户Q。SQL Server回滚该用L事务Qƈ用消息号1205通知有此死锁行ؓ的应用程序,然后允许其他用户q程l箋q行?/p>
在多用户情Ş下,每个用户的应用程序都应检查每个修Ҏ据的事务是否?205h息,以此定是否有可能死锁。消息号1025表示该用L事务因死锁而终止ƈ被回滚。应用程序必重新开始这个事务处理?/p>
查找死锁原因
既然理信息pȝ长时间死锁的原因是由于我们提交或者是提交不当Q那么我们就可以通过修改E序防止出现死锁。定位死锁出错处主要l过以下三步Q?/p>
1Q在死锁出现Ӟ用SP_WHO,SP_LOCK获得q程与锁的活动情c?br /> 2Q结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别h的操作员?br /> 3Q根据锁定的库表与操作员的岗位,可以估计出程序大U出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查扄序ƈ修改之?/p>
用sp_who获取关于被阻进E的信息
pȝq程sp_whol出pȝq程的报告。如果用L命o正被另一q程保持的锁ȝQ则Q?br />
◆status列显C?#8220;lock sleep”?br />
◆blk列显CZ持该锁或q些锁的q程标识Q即被谁锁定了?br />
◆loginame列显C登录操作员。结合相应的操作员信息表Q便可知道操作员是谁?br />
Fid spid status loginame origname blk dbname cmd
0 1 lock sleep lm lm 18 QJYD SELECT
0 2 sleeping NULL NULL 0 master NETWORK HANDLER
0 3 sleeping NULL NULL 0 master NETWORK HANDLER
……
用sp_lock览?/strong>
要得到关于当前SQL Server上保持的锁的报告Q可用系l过Esp_lock [spid1[,spid2]]Qspid1,spid2是表master.dbo.sysprocesses中的sql serverq程idP用sp_who可以得到锁定与被锁定的spidP
◆locktype列显C加锁的cd和封锁的_度Q有些锁的后~q带有blk表明锁的状态。前~表明锁的cdQSh—共享锁QEx—排它锁或更新锁Q中间表明锁d表上Q?#8221;table”?#8217;intent’Q还是在上QpageQ? 后缀“blk”表明该进E正在障另一个需要请求锁的进E。一旦正在障的q程一l束Q其他进E就向前Ud?#8220;demand”后缀表明当前׃n锁一释放Q?该进E就甌互斥锁?/p>
◆table_id列显C的idPl合sysobjects卛_查出被封锁的表名?/p>
执行该进E后屏幕昄
Fid Spid locktype table_id page row dbname Class context
0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur
0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock
0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur
……
定位出错?/strong>
Ҏsp_who与sp_lock命o的结果,l合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大U可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以q一步认证。最后查扄序ƈ修正之?br />
?
锁的问题一般来讲是q样?
首先判断是否存在锁竞?
1、基于系l管理员的经验找出热点表
2、通过以下Ҏ判断Q?
sp_who
察看pȝ中是否有status为lock sleep的用戗如果存在,再运行命?
sp_lock
察看pȝ中被锁住的表的table_id
l箋q行命o
select * from sysobjects where id = table_id
扑ֈ被锁住的表名?
如果发现sp_who中有多个用户被锁Q那么,可认ؓ是锁造成了数据库pȝ的性能底下?
调优Ҏ1Q修改对应表的加锁模式由allpagesU锁Q如Q?
alter table XXXX lock datarows
调优Ҏ2Q改大环境参数number of locksQ如Q?
sp_configure “number of locks”, 50000
注意Q在q种情况下需要保持total memory与number of locks的匹配性?
调优Ҏ3Q配|锁提升阈|可修改的配置包括两项内容Q?
Page(HWM)、Row(HWM)Q命令如下:
Sp_configure ‘page lock promotion HWM’, 500
Sp_configure ‘row lock promotion HWM’, 500
状?nbsp; 表示 kill命o的效?/p>
recv sleep {待|络d 立即
send sleep {待|络发?nbsp; 立即
alarm sleep {待警报 立即
lock sleep {待获取?nbsp; 立即
sync sleep {待同系列另一q程的同步消?nbsp; 立即.pd中的其它q程也必d为可注销的状?br />
sleeping {待盘I/O或某U其它资?或许表示正在q行的进E?但正在执行大量的盘I/O 数休眠q程不能苏醒,因而需要服务器重启以将其清?
runnable 在可q行q程队列?nbsp; 立即
running z跃地运行在一个服务器引擎?nbsp; 立即
infected 服务器已到严重的错误情?极其见 不要使用kill命o.可能需要重启服务器以清除进E?
background 由Adaptive Server而不是用戯E运行的q程例如阈DE?nbsp; 立即;使用kill时必L其小?在注销背景q程之前,仔细查sysprocesses
log suspend 到达日志的最后机会阈值时挂v的进E?nbsp; 立即
参?lt;sybase数据库系l管理指?gt;
---?本文转摘自『onlyhot blog ?blog.onlyhot.cn』http://www.onlyhot.cn/blog/?action=show&id=1178
sp_getapplock 锁定应用E序资源
sp_releaseapplock 为应用程序资源解?
SET LOCK_TIMEOUT 1800 锁超时期限设|?
sp_configure 'deadlock checking period',5000 讄锁检周?
sp_configure 'lock wait period',5000 讄锁的{待旉
sp_setrowlockpromote 讄基本个表的最大行锁升U数(锁数)
sp_setrowlockpromote 'TABLE',TREECODE,500,500,100
sp_setrowlockpromote 'TABLE',LCD05,500,500,100
[Lock Manager]
number of locks = 50000 #锁数
deadlock checking period = DEFAULT
freelock transfer block size = DEFAULT
max engine freelocks = DEFAULT
lock spinlock ratio = DEFAULT
lock hashtable size = DEFAULT
lock scheme = DEFAULT
lock wait period = DEFAULT
read committed with lock = DEFAULT
当很多事务同时访问同一个数据库Ӟ会加剧锁资源争夺Q严重时事务之间会发生死锁。可用sp_object_stats查明死锁位置。该q程报告资源争夺最Ȁ烈的10张表、一个数据库中资源争夺的表和单个表的争夺情况。语法ؓsp_object_stats interval [, top_n [, dbname [, objname [, rpt_option ]]]]Q查看锁争夺情况只需讄interval?#8220;hh:mm:ss”。如果显C每U锁的争夺程度超q?5%Q应该改变加锁方式,比如表的全页锁改成数据页锁,数据锁Ҏ数据行锁{?
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
allow remote access 1 0 1 1
print recovery information 0 0 0 0
recovery interval in minutes 5 0 5 5
tape retention in days 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
global async prefetch limit 10 0 10 10
global cache partition number 1 0 1 1
memory alignment boundary 2048 0 2048 2048
number of index trips 0 0 0 0
number of oam trips 0 0 0 0
procedure cache percent 20 22426 20 20
total data cache size 0 89698 0 89698
total memory 47104 196608 98304 98304
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
cis bulk insert batch size 0 0 0 0
cis connect timeout 0 0 0 0
cis cursor rows 50 0 50 50
cis packet size 512 0 512 512
cis rpc handling 0 0 0 0
enable cis 1 0 1 1
max cis remote connections 0 0 0 0
max cis remote servers 25 19 25 25
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
dtm detach timeout period 0 0 0 0
dtm lock timeout period 300 0 300 300
enable xact coordination 1 0 1 1
number of dtx participants 500 149 500 500
strict dtm enforcement 0 0 0 0
txn to pss ratio 16 3692 16 16
xact coordination interval 60 0 60 60
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
average cap size 200 0 200 200
caps per ccb 50 0 50 50
dump on conditions 0 0 0 0
maximum dump conditions 10 0 10 10
number of ccbs 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
allow sql server async i/o 1 0 1 1
disable disk mirroring 0 0 0 0
disk i/o structures 256 31 256 256
number of devices 10 #5 10 10
page utilization percent 95 0 95 95
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
event log computer name LocalSystem 0 LocalSystem LocalSystem
event logging 1 0 1 1
log audit logon failure 0 0 0 0
log audit logon success 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
esp execution priority 8 0 8 8
esp execution stacksize 77824 0 77824 77824
esp unload dll 0 0 0 0
start mail session 0 0 0 0
xp_cmdshell context 1 0 1 1
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
configuration file 0 0 0 /sybase/hgd
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
enable java 0 0 0 0
size of global fixed heap 300 0 300 300
size of process object heap 300 0 300 300
size of shared class heap 3072 0 3072 3072
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
default character set id 1 0 1 1
default language id 0 0 0 0
default sortorder id 50 0 50 50
disable character set conversi 0 0 0 0
enable unicode conversions 0 0 1 1
number of languages in cache 3 4 3 3
size of unilib cache 0 140 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
deadlock checking period 500 0 500 500
freelock transfer block size 30 0 30 30
lock address spinlock ratio 100 0 100 100
lock hashtable size 2048 48 2048 2048
lock scheme allpages 0 allpages allpages
lock spinlock ratio 85 0 85 85
lock table spinlock ratio 20 0 20 20
lock wait period 2147483647 0 2147483647 2147483647
max engine freelocks 10 0 10 10
number of locks 5000 2344 10000 10000
print deadlock information 0 0 1 1
read committed with lock 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
additional network memory 0 0 0 0
allow resource limits 0 0 0 0
audit queue size 100 42 100 100
average cap size 200 0 200 200
caps per ccb 50 0 50 50
deadlock pipe max messages 0 0 0 0
default network packet size 512 #505 512 512
disk i/o structures 256 31 256 256
enable rep agent threads 0 0 0 0
errorlog pipe max messages 0 0 0 0
event buffers per engine 100 #11 100 100
executable codesize + overhead 0 20261 0 20261
lock hashtable size 2048 48 2048 2048
lock spinlock ratio 85 0 85 85
max cis remote servers 25 19 25 25
max number network listeners 5 868 5 5
max online engines 1 216 1 1
max roles enabled per user 20 #22 20 20
memory per worker process 1024 0 1024 1024
number of alarms 40 3 40 40
number of aux scan descriptors 200 #258 200 200
number of ccbs 0 0 0 0
number of devices 10 #5 10 10
number of languages in cache 3 4 3 3
number of large i/o buffers 6 97 6 6
number of locks 5000 2344 10000 10000
number of mailboxes 30 1 30 30
number of messages 64 3 64 64
number of open databases 12 1239 12 12
number of open indexes 500 512 500 500
number of open objects 500 561 500 500
number of remote connections 20 86 50 50
number of remote logins 20 23 20 20
number of remote sites 10 1729 10 10
number of user connections 25 43141 250 250
number of worker processes 0 0 0 0
partition groups 1024 904 1024 1024
permission cache entries 15 #227 15 15
plan text pipe max messages 0 0 0 0
procedure cache percent 20 22426 20 20
process wait events 0 0 0 0
remote server pre-read packets 3 #83 3 3
size of global fixed heap 300 0 300 300
size of process object heap 300 0 300 300
size of shared class heap 3072 0 3072 3072
size of unilib cache 0 140 0 0
sql text pipe max messages 0 0 0 0
stack guard size 4096 #1108 4096 4096
stack size 86016 #23269 86016 86016
statement pipe max messages 0 0 0 0
total data cache size 0 89698 0 89698
total memory 47104 196608 98304 98304
txn to pss ratio 16 3692 16 16
wait event timing 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
number of open databases 12 1239 12 12
number of open indexes 500 512 500 500
number of open objects 500 561 500 500
open index hash spinlock ratio 100 0 100 100
open index spinlock ratio 100 0 100 100
open object spinlock ratio 100 0 100 100
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
Q diagnostics active 0 0 0 0
SQL batch capture 0 0 0 0
deadlock pipe active 0 0 0 0
deadlock pipe max messages 0 0 0 0
errorlog pipe active 0 0 0 0
errorlog pipe max messages 0 0 0 0
object lockwait timing 0 0 0 0
per object statistics active 0 0 0 0
plan text pipe active 0 0 0 0
plan text pipe max messages 0 0 0 0
process wait events 0 0 0 0
sql text pipe active 0 0 0 0
sql text pipe max messages 0 0 0 0
statement pipe active 0 0 0 0
statement pipe max messages 0 0 0 0
statement statistics active 0 0 0 0
wait event timing 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
additional network memory 0 0 0 0
allow remote access 1 0 1 1
allow sendmsg 0 0 0 0
default network packet size 512 #505 512 512
max network packet size 512 0 512 512
max number network listeners 5 868 5 5
number of remote connections 20 86 50 50
number of remote logins 20 23 20 20
number of remote sites 10 1729 10 10
remote server pre-read packets 3 #83 3 3
syb_sendmsg port number 0 0 0 0
tcp no delay 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
max async i/os per engine 2147483647 0 2147483647 2147483647
max async i/os per server 2147483647 0 2147483647 2147483647
o/s file descriptors 0 0 0 1024
tcp no delay 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
max parallel degree 1 0 1 1
max scan parallel degree 1 0 1 1
memory per worker process 1024 0 1024 1024
number of worker processes 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
additional network memory 0 0 0 0
lock shared memory 0 0 0 0
max SQL text monitored 0 7 0 0
shared memory starting address 0 0 0 0
total memory 47104 196608 98304 98304
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
max online engines 1 216 1 1
min online engines 1 0 1 1
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
enable rep agent threads 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
SQL Perfmon Integration 1 0 1 1
abstract plan cache 0 0 0 0
abstract plan dump 0 0 0 0
abstract plan load 0 0 0 0
abstract plan replace 0 0 0 0
allow backward scans 1 0 1 1
allow nested triggers 1 0 1 1
allow resource limits 0 0 0 0
allow updates to system tables 0 0 1 1
audit queue size 100 42 100 100
cpu accounting flush interval 200 0 200 200
cpu grace time 500 0 500 500
deadlock retries 5 0 5 5
default database size 2 0 2 2
default exp_row_size percent 5 0 5 5
default fill factor percent 0 0 0 0
enable DTM 0 0 0 0
enable HA 0 0 0 0
enable housekeeper GC 1 0 1 1
enable sort-merge join and JTC 0 0 0 0
event buffers per engine 100 #11 100 100
housekeeper free write percent 1 0 1 1
i/o accounting flush interval 1000 0 1000 1000
i/o polling process count 10 0 10 10
identity burning set factor 5000 0 5000 5000
identity grab size 1 0 1 1
license information 25 0 25 25
number of alarms 40 3 40 40
number of aux scan descriptors 200 #258 200 200
number of large i/o buffers 6 97 6 6
number of mailboxes 30 1 30 30
number of messages 64 3 64 64
number of open databases 12 1239 12 12
number of open indexes 500 512 500 500
number of open objects 500 561 500 500
number of pre-allocated extent 2 0 2 2
number of sort buffers 500 0 500 500
page lock promotion HWM 200 0 200 200
page lock promotion LWM 200 0 200 200
page lock promotion PCT 100 0 100 100
partition groups 1024 904 1024 1024
partition spinlock ratio 10 0 10 10
print deadlock information 0 0 1 1
row lock promotion HWM 200 0 200 200
row lock promotion LWM 200 0 200 200
row lock promotion PCT 100 0 100 100
runnable process search count 2000 0 2000 2000
size of auto identity column 10 0 10 10
sql server clock tick length 100000 0 100000 100000
text prefetch size 16 0 16 16
time slice 100 0 100 100
upgrade version 1100 0 12000 12000
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
allow procedure grouping 1 0 1 1
auditing 0 0 0 0
check password for digit 0 0 0 0
curread change w/ open cursors 1 0 1 1
current audit table 1 0 1 1
max roles enabled per user 20 #22 20 20
maximum failed logins 0 0 0 0
minimum password length 6 0 6 6
msg confidentiality reqd 0 0 0 0
msg integrity reqd 0 0 0 0
secure default login guest 0 guest guest
select on syscomments.text 1 0 1 1
suspend audit when device full 1 0 1 1
unified login required 0 0 0 0
use security services 0 0 0 0
Parameter Name Default Memory Used Config Value Run Value
-------------- ------- ----------- ------------ ---------
default network packet size 512 #505 512 512
number of pre-allocated extent 2 0 2 2
number of user connections 25 43141 250 250
permission cache entries 15 #227 15 15
stack guard size 4096 #1108 4096 4096
stack size 86016 #23269 86016 86016
systemwide password expiration 0 0 0 0
user log cache size 2048 0 2048 2048
user log cache spinlock ratio 20 0 20 20