数据库SQLServer经验小记

    技术2022-05-19  22

    数据库SQLServer经验小记

    Author:FreeKnight

    Date: 2011-3-8

    Version: 1.0.0

     

    1WindowsSQL2000 性能测试结果

    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>     总体结论

    1MSSQL 在常规的大容量和大记录量环境下,效能可以保持较高水平。

    2:避免单表字段容量过大,会较大影响性能。

    3:大容量和大记录量对MSSQL影响并不致命。

    4:插入新数据代价较大。

    2:数据库SQL语句规则和优化方案

             1where条件中不使用非索引列。若未建立索引,则该列就不存在index seek,只能用传统的index scantable scan,性能消耗极大。

             附加说明:Index seek是一个B树,查询时是从B数根节点开始,一级一级查找到目标。而Index scan则是全部遍历一遍。

             2:尽量避免使用 不等号(!=)或NOT 逻辑运算符。这两个运算符相当于强制要求数据库进行全员遍历index scan

             3:查询条件中不要包含运算,这样将导致无法进行index seek只能进行index scantable scan了。例如下列都是错误的做法。

             select * from Users where UserName + “Knight “ = “FreeKnight”; // 字符串连接运算。

             Select * from tabel1 where Col1 like ‘

    转载请注明原文地址: https://ibbs.8miu.com/read-2206353.html

    最新回复(0)