数据库SQLServer经验小记
Author:FreeKnight
Date: 2011-3-8
Version: 1.0.0
1> 测试方面
MSSQL是关系型数据库,该类数据库在随着数量级或者容量级的数据急剧膨胀下,数据库的性能将会有飞速下降。所以重点测试以下情况。
@ 当数据库在大容量状态下的执行情况。
@ 当数据库在大记录量状态下的执行情况。
2> 测试环境
@ OS: Windows 2000 Server
@ DB: MS SQL Server 2000
@ DBS: ADV2000
@ 连接方式:ADO
3> 测试步骤。
@ 创建数据库 test ,设置其大小为10GB。(免除了动态内存分配引起的性能代价)
@ 在 test 数据库里创建一个 tab 表,包含以下字段
字段名 数据类型 字段情况 可否为空
ID int, 4 主键,自叠加 不可
Name char,10 -- 不可
Age int,4 -- 不可
Photo Image,16 -- 可
@ 使用ADO接口,链接数据库服务器,测试程序完成以下功能
1) 插入2000条数据 insert
2) 选择1000条数据 select
3) 更新1000条数据 update
4) 删除1000条数据 delete
5) 插入100000条带图片的数据 (大容量测试)
6) 插入1000000条不带图片的数据(大记录量测试)
4> 结果分析和推论
@ 大容量数据测试中,我们选择的是一张 41958 字节的图片,插入的是100000条记录,我们大约可以估算当时数据表内的容量为 ( 41958 * 100000 ) / ( 1024 * 1024 ) = 4001.43 MB.
@ 测试结果1为
对一个空表进行操作,其中每个记录内的Photo字段是一张字节为41958的图片。
对空表内Insert 2000 记录 132.781秒
对2000记录的表进行选择1000个记录 41.94秒
对2000记录的表进行1000个记录的Update 0.841秒
对2000记录的表delete其中1000条记录 1.552秒
结论:
插入新记录代价远比更新删除记录代价大。
即使数据量不大,选择记录的代价也比较大。
@ 测试结果2为
对一个已经插入了100000条带图片记录的数据库表进行处理,该数据库表约4001.43MB大小。
对该表内Insert2000记录 139.05秒
对102000条数据进行选择1000条记录 42.36秒
对102000条数据进行1000条数据的update 0.971秒
对102000条数据delete其中1000条记录 2.264秒
结论:
在大数据量(百万条数据,表大小为4001MB左右时)对SQL2000影响并不大,整体性能基本不会有太大变动。
但是在大容量数据环境下,时间增加的百分比则不同了。如下
两次Insert2000数据的时间增加比: 4.72%
两次Select1000数据的时间增加比: 1.001%
两次Update1000数据的时间增加比: 15.46%
两次Delete1000数据的时间增加比: 45.88%
表中可看出,Delete操作时,大容量环境下降性能损失较为严重。原因是删除记录时,数据库会重建索引,所以当数据量太大的情况下,会导致重建索引消耗更多的时间。
@测试结果3为
对一个空表进行操作,但是与测试1不同的是,Photo字段为空,不再插入任何数据。
对空表内Insert 2000 记录 16.274秒
对2000记录的表进行选择1000个记录 0.07秒
对2000记录的表进行1000个记录的Update 0.04秒
对2000记录的表delete其中1000条记录 0.04秒
结论:
当字段数据量小的时候,数据库操作将有大幅度的效率提高。
@测试结果4为
对一个表内增加1000000条数据。(注意,比测试2多了10倍),这些数据内photo字段为空。
对该表内Insert2000记录 16.574秒
对1002000条数据进行选择1000条记录 0.05秒
对1002000条数据进行1000条数据的update 0.05秒
对1002000条数据delete其中1000条记录 0.051秒
结论:
在大数据量下,MSSQL性能损失不大。
5> 总体结论
1:MSSQL 在常规的大容量和大记录量环境下,效能可以保持较高水平。
2:避免单表字段容量过大,会较大影响性能。
3:大容量和大记录量对MSSQL影响并不致命。
4:插入新数据代价较大。
1:where条件中不使用非索引列。若未建立索引,则该列就不存在index seek,只能用传统的index scan或table scan,性能消耗极大。
附加说明:Index seek是一个B树,查询时是从B数根节点开始,一级一级查找到目标。而Index scan则是全部遍历一遍。
2:尽量避免使用 不等号(!=)或NOT 逻辑运算符。这两个运算符相当于强制要求数据库进行全员遍历index scan。
3:查询条件中不要包含运算,这样将导致无法进行index seek只能进行index scan或table scan了。例如下列都是错误的做法。
select * from Users where UserName + “Knight “ = “FreeKnight”; // 字符串连接运算。
Select * from tabel1 where Col1 like ‘