??xml version="1.0" encoding="utf-8" standalone="yes"?>
事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如Q返回某范围内的数据一V比如您的某个表有一个时间列Q恰好您把聚合烦引徏
立在了该列,q时您查?004q??日至2004q?0?日之间的全部数据Ӟq个速度将是很快的Q因为您的这本字典正文是按日期进行排序的Q聚
cȝ引只需要找到要索的所有数据中的开头和l尾数据卛_Q而不像非聚集索引Q必d查到目录中查到每一Ҏ据对应的늠Q然后再Ҏ늠查到具体内容?br />
用时Q?28470毫秒Q即Q?28U) 用时Q?3763毫秒Q?4U) 用时Q?423毫秒Q?U) q在select语句后加Q?/p>
2、只要徏立烦引就能显著提高查询速度 查询速度Q?513毫秒 查询速度Q?516毫秒 查询速度Q?0280毫秒 使用旉Q?326毫秒 使用旉Q?470毫秒 用时Q?2936 用时Q?8843 用时Q?343毫秒Q提?00万条Q? 用时Q?170毫秒Q提?0万条Q?/p>
用时Q?326毫秒Q和上句的结果一模一栗如果采集的数量一P那么用大于号和等于号是一LQ?/p>
用时Q?280毫秒 用时Q?390毫秒
1Q数据库服务器端处理
是说在数据库上做查询时只q回需要的数据如:
sqlserver : select TOP num * from table 然后再对l果集进行处?br />
oracleQselect * from ( select rownum row_num,TABLE_L.* from ( select * from table where A order
by B) TABLE_L ) where row_num <=num 需要做3层嵌套是因ؓrownum虚字D늚性质造成?br />
2Q在应用软g端处?/span>
先用select * from table A where B order by C
然后对获得的l果处理
intRowCount = rs.getRow();
if(rs.getRow() >= startIndex && rs.getRow() <= endIndex){
//形成昄html
}
}
两种Ҏ各有优势Q如果在数据量不是很大的情况下,使用W二U,有利于sql的统一
在数据量大以及数据库服务器隔远和网l传输满的情况下使用W一U减传输量
]]>
实际上,您可以把索引理解ZU特D的目录。微软的SQL
SERVER提供了两U烦引:聚集索引Qclustered indexQ也U聚cȝ引、簇集烦引)和非聚集索引Qnonclustered
indexQ也U非聚类索引、非集索引Q。下面,我们举例来说明一下聚集烦引和非聚集烦引的区别Q?br />
其实Q我们的汉语字典的正文本w就是一?
聚集索引。比如,我们要查“?#8221;字,׃很自然地d字典的前几页Q因?#8220;?#8221;的拼x“an”Q而按照拼x序汉字的字典是以英文字母“a”开头ƈ?
“z”l尾的,那么“?#8221;字就自然地排在字典的前部。如果您d了所有以“a”开头的部分仍然找不到这个字Q那么就说明您的字典中没有这个字Q同LQ如
果查“?#8221;字,那您也会您的字典翻到最后部分,因ؓ“?#8221;的拼x“zhang”。也是_字典的正文部分本w就是一个目录,您不需要再L其他目录
来找到您需要找的内宏V我们把q种正文内容本n是一U按照一定规则排列的目录UCؓ“聚集索引”?br />
如果您认识某个字Q您可以快速地从自动中?
到这个字。但您也可能会遇到您不认识的字,不知道它的发韻Iq时候,您就不能按照刚才的方法找到您要查的字Q而需要去Ҏ“偏旁部首”查到您要扄字,?
后根据这个字后的늠直接d某页来找到您要找的字。但您结?#8220;部首目录”?#8220;字表”而查到的字的排序q不是真正的正文的排序方法,比如您查“?#8221;字,
我们可以看到在查部首之后的检字表?#8220;?#8221;的页码是672,字表?#8220;?#8221;的上面是“?#8221;字,但页码却?3,“?#8221;的下面是“?#8221;字,面?90
c很昄Q这些字q不是真正的分别位于“?#8221;字的上下方,现在您看到的q箋?#8220;驰、张、徃”三字实际上就是他们在非聚集烦引中的排序,是字典正文中的字
在非聚集索引中的映射。我们可以通过q种方式来找到您所需要的字,但它需要两个过E,先找到目录中的结果,然后再翻到您所需要的늠。我们把q种目录Ua
是目录,正文Ua是正文的排序方式UCؓ“非聚集烦?#8221;?br />
通过以上例子Q我们可以理解到什么是“聚集索引”?#8220;非聚集烦?#8221;。进一步引申一下,我们可以很容易的理解Q每个表只能有一个聚集烦引,因ؓ目录只能按照一U方法进行排序?br />
二、何时用聚集烦引或非聚集烦?/strong>
下面的表ȝ了何时用聚集烦引或非聚集烦引(很重要)Q?/p>
动作描述
使用聚集索引
使用非聚集烦?/td>
列经常被分组排序
?/td>
?/td>
q回某范围内的数?/td>
?/td>
不应
一个或极少不同?/td>
不应
不应
数目的不同?/td>
?/td>
不应
大数目的不同?/td>
不应
?/td>
频繁更新的列
不应
?/td>
外键?/td>
?/td>
?/td>
主键?/td>
?/td>
?/td>
频繁修改索引?/td>
不应
?/td>
三、结合实际,谈烦引用的误区
理论的目的是应用。虽然我们刚才列Z何时应用聚集烦引或非聚集烦引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将Ҏ在实践中遇到的实际问题来谈一下烦引用的误区Q以便于大家掌握索引建立的方法?br />
1、主键就是聚集烦?br />
q种xW者认为是极端错误的,是对聚集索引的一U浪贏V虽然SQL SERVER默认是在主键上徏立聚集烦引的?br />
通常Q我们会在每个表中都建立一个ID列,以区分每条数据,q且q个ID列是自动增大的,步长一般ؓ1。我们的q个办公自动化的实例中的列Gid是?
此。此Ӟ如果我们这个列设ؓ主键QSQL
SERVER会将此列默认集烦引。这样做有好处,是可以让您的数据在数据库中按照IDq行物理排序Q但W者认样做意义不大?br />
显而易见,聚集索引的优势是很明昄Q而每个表中只能有一个聚集烦引的规则Q这使得聚集索引变得更加珍贵?br />
从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,q速羃查询范_避免全表扫描。在实际应用中,因ؓID
h自动生成的,我们q不知道每条记录的IDP所以我们很隑֜实践中用IDhq行查询。这׃让ID可个主键作集烦引成ZU资源浪贏V其ơ,
让每个ID号都不同的字D作集烦引也不符?#8220;大数目的不同值情况下不应建立聚合索引”规则Q当Ӟq种情况只是针对用户l常修改记录内容Q特别是索引
的时候会负作用,但对于查询速度q没有媄响?br />
在办公自动化pȝ中,无论是系l首|C的需要用L收的文g、会议还是用戯行文件查询等M情况下进行数据查询都M开字段的是“日期”q有用户本n?#8220;用户?#8221;?br />
通常Q办公自动化的首会昄每个用户未{收的文件或会议。虽然我们的where语句可以仅仅限制当前用户未{收的情况,但如果您的系l已建立了很
长时_q且数据量很大,那么Q每ơ每个用h开首页的时候都q行一ơ全表扫描,q样做意义是不大的,l大多数的用?个月前的文g都已l浏览过了,q样
做只能徒增数据库的开销而已。事实上Q我们完全可以让用户打开pȝ首页Ӟ数据库仅仅查询这个用戯3个月来未阅览的文Ӟ通过“日期”q个字段来限制表
扫描Q提高查询速度。如果您的办公自动化pȝ已经建立?q_那么您的首页昄速度理论上将是原来速度8倍,甚至更快?br />
在这里之所以提?#8220;?
Z”三字Q是因ؓ如果您的聚集索引q是盲目地徏在IDq个主键上时Q您的查询速度是没有这么高的,即您在“日期”q个字段上徏立的索引Q非聚合?
引)。下面我们就来看一下在1000万条数据量的情况下各U查询的速度表现Q?个月内的数据?5万条Q:
Q?Q仅在主键上建立聚集索引Qƈ且不划分旉D:Select gid,fariqi,neibuyonghu,title from tgongwen
Q?Q在主键上徏立聚集烦引,在fariq上徏立非聚集索引Q?/p>
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
Q?Q将聚合索引建立在日期列QfariqiQ上Q?/p>
select gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi> dateadd(day,-90,getdate())
虽然每条语句提取出来的都?5万条数据Q各U情늚差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上Q如果您的数据库真的?000?
定w的话Q把主键建立在ID列上Q就像以上的W??U情况,在网上的表现就是超ӞҎ无法显C。这也是我摒弃ID列作集烦引的一个最重要的因
素。得Z上速度的方法是Q在各个select语句前加Q?/p>
declare @d datetime
set @d=getdate()select [语句执行p旉(毫秒)]=datediff(ms,@d,getdate())
事实上,我们可以发现上面的例子中Q第2?条语句完全相同,且徏立烦引的字段也相同;不同的仅是前者在fariqi字段上徏立的是非聚合索引Q后者在此字D上建立的是聚合索引Q但查询速度却有着天壤之别。所以,q是在M字段上简单地建立索引p提高查询速度?br />
从徏表的语句中,我们可以看到q个有着1000万数据的表中fariqi字段?003个不同记录。在此字D上建立聚合索引是再合适不q了。在现实中,
我们每天都会发几个文Ӟq几个文件的发文日期q同,q完全符合徏立聚集烦引要求的Q?#8220;既不能绝大多数都相同Q又不能只有极少数相?#8221;的规则。由此看
来,我们建立“适当”的聚合烦引对于我们提高查询速度是非帔R要的?br />
3、把所有需要提高查询速度的字D都加进聚集索引Q以提高查询速度
上面已经谈到Q在q行数据查询旉M开字段的是“日期”q有用户本n?#8220;用户?#8221;。既然这两个字段都是如此的重要,我们可以把他们合qv来,建立一个复合烦引(compound indexQ?br />
很多为只要把M字段加进聚集索引Q就能提高查询速度Q也有h感到qhQ如果把复合的聚集烦引字D分开查询Q那么查询速度会减慢吗Q带着q个问题Q?
我们来看一下以下的查询速度Q结果集都是25万条数据Q:Q日期列fariqi首先排在复合聚集索引的v始列Q用户名neibuyonghu排在后列Q:Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5''
Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen
where fariqi>''2004-5-5'' and neibuyonghu=''办公?'Q?Qselect gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公?'
从以上试验中Q我们可以看到如果仅用聚集烦引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一LQ甚x用上全部的复合烦引列
q要略快Q在查询l果集数目一L情况下)Q而如果仅用复合聚集烦引的非v始列作ؓ查询条g的话Q这个烦引是不vM作用的。当Ӟ语句1?的查询速度
一h因ؓ查询的条目数一P如果复合索引的所有列都用上,而且查询l果的话,q样׃形成“索引覆盖”Q因而性能可以辑ֈ最优。同Ӟ误住:无论?
是否l常使用聚合索引的其他列Q但其前导列一定要是用最频繁的列?br />
四、其他书上没有的索引使用l验ȝ
1?font color="#ff0000">用聚合烦引比用不是聚合烦引的主键速度?/strong>
下面是实例语句:Q都是提?5万条数据Q?/p>
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000
q里Q用聚合索引比用不是聚合索引的主键速度快了q?/4?br />
2、用聚合索引比用一般的主键作order by旉度快,特别是在数据量情况?/p>
select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi
select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid
q里Q用聚合索引比用一般的主键作order byӞ速度快了3/10。事实上Q如果数据量很小的话Q用聚集索引作ؓ排序列要比用非聚集索引速度快得明显的多Q而数据量如果很大的话Q如10万以上,则二者的速度差别不明显?br />
3、用聚合烦引内的时间段Q搜索时间会按数据占整个数据表的癑ֈ比成比例减少Q而无合烦引用了多少个:select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-1-1''
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi>''2004-6-6''
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=''2004-9-16''
select gid,fariqi,neibuyonghu,reader,title from Tgongwen
where fariqi>''2004-1-1'' and fariqi<''2004-6-6''
4、日期列不会因ؓ有分U的输入而减慢查询速度
下面的例子中Q共?00万条数据Q?004q??日以后的数据?0万条Q但只有两个不同的日期,日期_到日Q之前有数据50万条Q有5000个不同的日期Q日期精到U?/p>
select gid,fariqi,neibuyonghu,reader,title from Tgongwen
where fariqi>''2004-1-1'' order by fariqiselect gid,fariqi,neibuyonghu,reader,title from Tgongwen
用时Q?453毫秒
where fariqi<''2004-1-1'' order by fariqi
五、其他注意事?/strong>
“水可载舟Q亦可覆?#8221;Q烦引也一栗烦引有助于提高索性能Q但q多或不当的索引也会Dpȝ低效。因为用户在表中每加q一个烦引,数据库就要做更多的工作。过多的索引甚至会导致烦引碎片?br />
所以说Q我们要建立一?#8220;适当”的烦引体p,特别是对聚合索引的创建,更应_求精Q以使您的数据库能得到高性能的发挥?br />
当然Q在实践中,作ؓ一个尽职的数据库管理员Q您q要多测试一些方案,扑և哪种Ҏ效率最高、最为有效?
]]>
1.l对?
S:select abs(-1) value
O:select abs(-1) value from dual
2.取整(?
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from dual
3.取整Q小Q?
S:select floor(-1.001) value
O:select floor(-1.001) value from dual
4.取整Q截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from dual
5.四舍五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from dual 1.2346
6.e为底的幂
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from dual 2.71828182
7.取e为底的对?
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from dual; 1
8.?0为底Ҏ
S:select log10(10) value 1
O:select log(10,10) value from dual; 1
9.取^?
S:select SQUARE(4) value 16
O:select power(4,2) value from dual 16
10.取^Ҏ
S:select SQRT(4) value 2
O:select SQRT(4) value from dual 2
11.求Q意数为底的幂
S:select power(3,4) value 81
O:select power(3,4) value from dual 81
12.取随机数
S:select rand() value
O:select sys.dbms_random.value(0,1) value from dual;
13.取符?
S:select sign(-8) value -1
O:select sign(-8) value from dual -1
14.圆周?
S:SELECT PI() value 3.1415926535897931
O:不知?
15.sin,cos,tan 参数都以弧度为单?
例如Qselect sin(PI()/2) value 得到1QSQLServerQ?
16.Asin,Acos,Atan,Atan2 q回弧度
17.弧度角度互换(SQLServerQOracle不知?
DEGREESQ弧?〉角?
RADIANSQ角?〉弧?
数值间比较
18. 求集合最大?
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from dual
19. 求集合最?
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from dual
20.如何处理null?F2中的null?0代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
21.求字W序?
S:select ascii('a') value
O:select ascii('a') value from dual
22.从序h字符
S:select char(97) value
O:select chr(97) value from dual
23.q接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22') 33 value from dual
23.子串位置 --q回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from dual
23.模糊子串的位|?--q回2,参数L中间%则返?
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle没发玎ͼ但是instr可以通过W四个参数控制出现次?
select INSTR('sdsfasdqe','sd',1,2) value from dual q回6
24.求子?
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from dual
25.子串代替 q回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual
26.子串全部替换
S:没发?
O:select Translate('fasdbfasegas','fa','? ) value from dual
27.长度
S:len,datalength
O:length
www.knowsky.com
28.大小写{?lower,upper
29.单词首字母大?
S:没发?
O:select INITCAP('abcd dsaf df') value from dual
30.左补I格QLPAD的第一个参CؓI格则同space函数Q?
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from dual
31.双I格QRPAD的第一个参CؓI格则同space函数Q?
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from dual
32.删除I格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重复字符?
S:select REPLICATE('abcd',2) value
O:没发?
34.发音怼性比?q两个单词返回gP发音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
q回0-4Q?为同韻I1最?
日期函数
35.pȝ旉
S:select getdate() value
O:select sysdate value from dual
36.前后几日
直接与整数相加减
37.求日?
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd') value from dual
38.求时?
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from dual
39.取日期时间的其他部分
S:DATEPART ?DATENAME 函数 Q第一个参数决定)
O:to_char函数 W二个参数决?
参数---------------------------------下表需要补?
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星?
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清?
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
40.当月最后一?
S:不知?
O:select LAST_DAY(sysdate) value from dual
41.本星期的某一天(比如星期日)
S:不知?
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字符串{旉
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求两日期某一部分的差Q比如秒Q?
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3Q?
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.Ҏ差值求新的日期Q比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同时区时?
S:不知?
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt-------
AST ADT 大西z标准时?
BST BDT 白oh准时?
CST CDT 中部标准旉
EST EDT 东部标准旉
GMT 格林治标准旉
HST HDT 阿拉斯加?夏威h准时?
MST MDT 山区标准旉
NST U芬兰标准时?
PST PDT 太^z标准时?
YST YDT YUKON标准旉
需要注意的是select * ..for update 会对所有返回的行加锁。单其他记录是可以只查询q些行的?br /> 所?要想起到真真加锁机制Q做操作时select都要 加上for update
下列Ҏ有助于最大限度地降低死锁Q?/span>
按同一序讉K对象
如果所有ƈ发事务按同一序讉K对象Q则发生死锁的可能性会降低。例如,如果两个q发事务获得 Supplier表上的锁Q然后获?Part表上的锁Q则在其中一个事务完成之前,另一个事务被d?Supplier表上。第一个事务提交或回滚后,W二个事务l进行。不发生死锁。将存储q程用于所有的数据修改可以标准化访问对象的序?/span>
避免事务中的用户交互
? 免编写包含用户交互的事务Q因行没有用户交互的批处理的速度要远q快于用h动响应查询的速度Q例如答复应用程序请求参数的提示。例如,如果事务正在 {待用户输入Q而用户去吃午了或者甚臛_家过周末了,则用户将此事务挂起之不能完成。这样将降低pȝ的吞吐量Q因Z务持有的M锁只有在事务提交? 回滚时才会释放。即使不出现死锁的情况,讉K同一资源的其它事务也会被dQ等待该事务完成?/span>
保持事务短ƈ在一个批处理?/span>
在同一数据库中q发执行多个需要长旉q行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也p长,从而堵塞了其它zdq可能导致死锁?/span>
保持事务在一个批处理中,可以最化事务的网l通信往q量Q减完成事务可能的延迟qN?/span>
使用低隔ȝ?/span>
定事务是否能在更低的隔ȝ别上q行。执行提交读允许事务d另一个事务已dQ未修改Q的数据Q而不必等待第一个事务完成。用较低的隔离U别Q例如提交读Q而不使用较高的隔ȝ别(例如可串行读Q可以羃短持有共享锁的时_从而降低了锁定争夺?/span>
使用l定q接
使用l定q接使同一应用E序所打开的两个或多个q接可以怺合作。次U连接所获得的Q何锁可以象由主连接获得的锁那h有,反之亦然Q因此不会相互阻?/span>
死?/span>
如果发生死锁了,我们怎么L具体发生死锁的是哪条SQL语句或存储过E?
q时我们可以使用以下存储q程来检,可以查出引h锁的q程和SQL语句。SQL Server自带的系l存储过Esp_who和sp_lock也可以用来查N塞和死锁, 但没有这里介l的Ҏ好用?/span>
杀死锁和进E?/span>
如何L动的杀死进E和锁?最单的办法Q重新启动服务。但是这里要介绍一个存储过E,通过昑ּ的调用,可以杀死进E和锁?/span>
6: 存储q程中的语句默认不会是一个事?除非你加?begin transaction commit tran
锁信?/strong>
׃n (S) 用于不更Ҏ不更新数据的操作Q只L作)Q如 SELECT 语句?
更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常 见Ş式的死锁?
排它 (X) 用于数据修改操作Q例? INSERT、UPDATE ? DELETE。确保不会同时对同一资源 q行多重更新?
意向 用于建立锁的层次l构。意向锁的类型ؓQ意向共? (IS)、意向排? (IX) 以及与意向排它共 ? (SIX)?
架构 在执行依赖于表架构的操作时用。架构锁的类型ؓQ架构修? (Sch-M) 和架构稳定? (Sch -S)?
大容量更? (BU) 向表中大定w复制数据q指定了 TABLOCK 提示时用?
׃n?
׃n (S) 锁允许ƈ发事务读? (SELECT) 一个资源。资源上存在׃n (S)
锁时QQ何其它事务都不能修改数据。一旦已l读取数据,便立即释放资源上的共? (S)
锁,除非事务隔ȝ别设|ؓ可重复读或更高别,或者在事务生存周期内用锁定提示保留׃n (S) 锁?
更新?
更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源Q页或行Q的׃n (S)
锁,然后修改行,此操作要求锁转换为排? (X)
锁。如果两个事务获得了资源上的׃n模式锁,然后试图同时更新数据Q则一个事务尝试将锁{换ؓ排它 (X)
锁。共享模式到排它锁的转换必须{待一D|_因ؓ一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X)
锁以q行更新。由于两个事务都要{换ؓ排它 (X) 锁,q且每个事务都等待另一个事务释攑օ享模式锁Q因此发生死锁?
若要避免q种潜在的死锁问题,请用更? (U) 锁。一ơ只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更? (U) 锁{换ؓ排它 (X) 锁。否则,锁{换ؓ׃n锁?
排它?
排它 (X) 锁可以防止ƈ发事务对资源q行讉K。其它事务不能读取或修改排它 (X) 锁锁定的数据?
意向?
意向锁表C? SQL Server 需要在层次l构中的某些底层资源上获取共? (S) 锁或排它 (X)
锁。例如,攄在表U的׃n意向锁表CZ务打在表中的页或行上放|共? (S)
锁。在表讄意向锁可防止另一个事务随后在包含那一늚表上获取排它 (X) 锁。意向锁可以提高性能Q因? SQL Server
仅在表查意向锁来确定事务是否可?/p>
安全地获取该表上的锁。而无L查表中的每行或每上的锁以确定事务是否可以锁定整个表?
意向锁包括意向共? (IS)、意向排? (IX) 以及与意向排它共? (SIX)?
锁模? 描述
意向׃n (IS) 通过在各资源上放|? S 锁,表明事务的意向是d层次l构中的部分Q而不是全部)底层资源?
意向排它 (IX) 通过在各资源上放|? X 锁,表明事务的意向是修改层次l构中的部分Q而不是全部)底层资源。IX ? IS 的超集?
与意向排它共? (SIX) 通过在各资源上放|? IX
锁,表明事务的意向是d层次l构中的全部底层资源q修攚w分(而不是全部)底层资源。允讔R层资源上的ƈ? IS 锁。例如,表的
SIX 锁在表上攄一? SIX 锁(允许q发 IS 锁)Q在当前所修改上攄 IX 锁(在已修改行上攄
X 锁)。虽然每个资源在一D|间内只能有一? SIX 锁,以防止其它事务对资源q行更新Q但是其它事务可以通过获取表? IS
锁来d层次l构中的底层资源?
架构?
执行表的数据定义语言 (DDL) 操作Q例如添加列或除去表Q时使用架构修改 (Sch-M) 锁?
当编译查询时Q用架构稳定? (Sch-S) 锁。架构稳定? (Sch-S) 锁不dM事务锁,包括排它 (X)
锁。因此在~译查询Ӟ其它事务Q包括在表上有排? (X) 锁的事务Q都能l运行。但不能在表上执? DDL 操作?
大容量更新锁
当将数据大容量复制到表,且指定了 TABLOCK 提示?
者? sp_tableoption 讄? table lock on bulk 表选项Ӟ用大定w更新
(BU) 锁。大定w更新 (BU) 锁允许进E将数据q发地大定w复制到同一表,同时防止其它不进行大定w复制数据的进E访问该表?