最大程度降低 SQL Server 中的阻塞
http://technet.microsoft.com/zh-cn/magazine/2008.04.blocking.aspx
SQL Server
最大程度降低 SQL Server 中的阻塞
Cherié Warren
概览:
发生锁升级的原因
避免不必要的阻塞
优化查询
监视锁定对性能的影响
锁定对支持数据库的并发读写活动而言是必需的,但阻塞却会对系统性能产生负面影响,有时让人难以觉察。在本文中,我将介绍如何优化 SQL Server 2005 或 SQL Server 2008 数据库以最大程度降低
阻塞,以及如何监视系统以更好地了解锁定如何对性能产生影响。
锁定和升级
SQL Server® 根据受影响的记录数和系统中存在的并发活动来选择最合适的锁粒度。默认情况下,SQL Server 会选择尽可能小的锁粒度,如果它可以更高效地使用系统内存,则仅选择粗粒度锁。只有当锁升级会对总体系统性能带来好处时,SQL Server 才会升级锁。如图 1 所示,当特定扫描中锁的数量超过 5,000 或者系统用于锁的内存数超过可用容量时,将会开始升级:
Figure 1 促使锁升级的条件 (单击该图像获得较大视图)
当锁设置为 0 时,数据库引擎使用 24 % 的非地址窗口化扩展(非 AWE)内存
当锁设置非 0 时,数据库引擎使用 40 % 的非 AWE 内存
如果确实发生了升级,则始终会升级到表级锁。
避免不必要的阻塞
阻塞在任何锁粒度情况下都可能发生,但阻塞的显现程度却在升级后增加。锁升级可能是一个信号,说明您的应用程序在设计、编码或配置方面的效率不高。
遵循数据库设计基本原理(例如,使用采用窄键的标准化架构以及避免在事务性系统中执行大量数据操作)是避免发生阻塞的重要手段。如果未遵循这些原理(例如,将报告系统从事务性系统中分离出来,或在非工作时间处理数据馈送),则系统优化将会很困难。
索引编制可能是决定访问数据所需锁数量的关键因素。索引可以通过减少数据库引擎必须执行的内部查找次数来减少查询访问的记录数。例如,如果您从一个表的非索引列选择一行,则表中的每一行都需要被临时锁定,直到确定了所需的记录为止。但是,如果对该列编制了索引,则仅需要单个锁。
SQL Server 2005 和 SQL Server 2008 都包含动态管理视图(sys.dm_db_missing_index_group_stats、 sys.dm_db_missing_index_groups、sys.dm_db_missing_index_details),这些视图根据累计使用情况统计来显示那些将会得益于索引的表和列。
碎片也可能是一个隐含的性能问题,如果碎片过多,数据库引擎可能需要访问比采用其他
相关文档:
系统环境:Windows 7
软件环境:Visual C++ 2008 SP1 +SQL Server 2005
本次目的:编写一个航空管理系统
这是数据库课程设计的成果,虽然成绩不佳,但是作为我用VC++ 以来编写的最大程序还是传到网上,以供参考。用VC++ 做数据库设计并不容易,但也不是不可能。以下是我的程序界面,后面 ......
Create PROCEDURE [dbo].[PR_addRoles]
@RolesID INT,
@Roles varchar (100),
@ID INT OUT
AS
BEGIN TRY
BEGIN TRAN
INSERT FS_Roles (RolesID,Roles) VALUES (@RolesID,@Roles)
COMMIT TRAN
SET @ID=1
END TRY
BEGIN CATCH
ROLLBACK TRAN
SET @ID=0
END CATCH
......
varchar和nvarchar如何选择:
varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unico来存储数据的。中文字符存储到SQL Server中会保存为两个字节(一般采用Unico编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段的类型为nvarchar,则会占用两个字节。虽然使用nva ......
转载 SQL中的datetime用法详解
转载地址:http://blog.sina.com.cn/s/blog_495491770100fq4n.html
2009-07-27 09:45 sql server2000中使用convert来取得datetime数据类型样式
日期数据格式的处理,两个示例:
CONVERT(varchar(16), 时间一, 20) 结果:2007-02-01 08:02
时间一般为
getdate()
函数或数据表里的 ......
分区的发展历史
分区的概念对 SQL Server 来说并不陌生。实际上,此产品的每个版本中都可以实现不同形式的分区。但是,由于没有为了帮助用户创建和维护分区架构而专门设计一些功能,因此分区一直是一个很繁琐的过程,没有得到充分的利用。而且,用户和开发人员对此架构存在误解(由于其数据库设计比较复杂),低估了它的优 ......