SQL Server中事务日志自动增长对性能的影响(上)

2009-7-3   
   | |

导读:在本文中,作者将对事务运行过程中事务日志增长对性能的影响做测试。

关键词:事务日志 SQL Server 测试

正在加载数据... 【TechTarget中国原创】在本文中,我将对事务运行过程中事务日志增长对性能的影响做测试。我这次的测试环境和配置同前两次的相同。

【TechTarget中国原创】在本文中,我将对事务运行过程中事务日志增长对性能的影响做测试。我这次的测试环境和配置同前两次的相同。

  数据库

  本次测试中使用的ShrinkDB数据库要预先配置好,保证数据库足够大并在事务运行中不会增长。事务日志文件大小只有2MB。测试的目的就是让它随着事务进行而增长,从而衡量它的影响:

  ShrinkDB数据库的还原模型设置为FULL。

  使用以下查询语句(fileid = 2 → the T-Log file):

  select size from sysfiles where fileid = 2

  这是事务日志文件的大小(每页8KB)。256*8=2MB。

  原先测试用过的ExpandDB表在本次测试用依然使用。

  create table ExpandDB (a varchar(8000))

  测试

  测试的目标就是检验让数据库事务日志自动增长的INSERT, UPDATE和DELETE命令如何影响性能。

  由于升级,插入和删除可能会相互影响,所以这个测试包含三个部分,每次一个操作:

  UPDATES

  INSERTS

  DELETE

  注意:在原先的文章中,我证明了只有大量的事务才能使事务日志自动增长。

  插入命令

  在本次测试中,一次事务我都向表中插入了10,000行。每一步都执行相同的代码,但事务日志的autogrowth设定不同:

  在第一步中, autogrowth设置为1MB;

  在第二步中, autogrowth设置为10MB。

  这两个步骤总共执行三次,SQL Profiler来捕获执行统计。以下为代码:

 

   -- Truncate the table
  truncate table ExpandDB
  go
  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go
  -- Shrink T-Log back to 2MB (initial size):
  DBCCSHRINKFILE (N'ShrinkDB_Log', 0, TRUNCATEONLY
  Go
  -- Insert 10000 rows
  -- Big transaction
  begin tran
  declare @i int
  set @i = 1
  while @i <= 10000
  begin insert into ExpandDB select replicate ('a',8000)
  set @i = @i + 1
  end
  commit
  Go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace
  go
  select count(*) from ExpandDB
  go
  在第一步中,事务日志达到110MB。在第二步中达到了102MB。

  以下是结果比较(只有插入):

    我又进行了第三次测试,事务日志文件设定为130MB并在事务运行期间不增长。这次我没有缩减事务日志,代码如下:

  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go
  -- Insert 10000 rows
  -- Big transaction
  begin tran
  declare @i int
  set @i = 1
  while @i <= 10000
  begin
  insert into ExpandDB select replicate ('a',8000)
  set @i = @i + 1
  end
  commit
  Go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go
  select count(*)
  from ExpandDB
  go
  现在我们有了上一次执行和第一次执行的比较,只有插入命令:

  插入总结:

  平均改进数据显示性能的增强和事务运行中事务日志增长数目有关。自动增长越少性能越佳,特别是对于整段时间而言(无增长比1MB增长性能改进了80%)。

  升级命令

  在上一篇文章中显示,当每次都有很多行改变时,升级会令事务日志增长。为此,我执行了以下代码:

  

-- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go
  -- Shrink T-Log back to 2MB:
  DBCC SHRINKFILE (N'ShrinkDB_Log' , 0, TRUNCATEONLY)
  Go
  -- Update 10000 rows at a time
  update ExpandDB set a = 'aaaaaaaaaaaaaaaaaaaaaaaa'
  go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go
  我运行了两次以确保事务日志按相同比例增长,令人困惑的是第一次运行中时事务日志增长了,而第二次一点没有增长(停留在2MB)!

  这可能意味着行值不变的话,事务日志也就不增长。为证明,我加了一个Select语句来输出被升级影响的行数:

  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go
  -- Shrink T-Log back to 2MB:
  DBCC SHRINKFILE (N'ShrinkDB_Log' , 0, TRUNCATEONLY)
  Go
  -- Update 10000 rows at a time
  update ExpandDB set a = 'aaaaaaaaaaaaaaaaaaaaaaaa'
  select @@rowcount go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go

  返回的行值一直是10000.

  当我修改了升级值(update ExpandDB set a = 'abcde'),

  

    -- #1 ITERATION:
  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go -- Shrink T-Log back to 2MB:
  DBCC SHRINKFILE (N'ShrinkDB_Log' , 0, TRUNCATEONLY)
  Go
  -- Update 10000 rows at a time
  update ExpandDB set a = 'aaaaaaaaaaaaaaaaaaabc'
  go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go
  -- #2 ITERATION:
  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go -- Shrink T-Log back to 2MB:
  DBCC SHRINKFILE (N'ShrinkDB_Log' , 0, TRUNCATEONLY)
  Go
  -- Update 10000 rows at a time
  update ExpandDB set a = 'AAA'
  go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go
  -- #3 ITERATION:
  -- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go -- Shrink T-Log back to 2MB:
  DBCC SHRINKFILE (N'ShrinkDB_Log' , 0, TRUNCATEONLY)
  Go
  -- Update 10000 rows at a time
  update ExpandDB set a = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
  go
  -- Check size and % free space in T-Log
  dbcc sqlperf(logspace)
  go
  不出所料,当事务日志设置为每次增长1MB时,它最后的大小是不同的。

  以下是结果的对比:


 
查看全文
 
 
 
 
 

SQL Server性能与调优

 
关于EXCHANGE SERVER的数据库文件,大家可能都有这样的体会,就是一旦容量增加了,就很难将它变小。本文将介绍一个实用的整理文件方法。
 
整合多个SQL Server数据库到一个实例上,并把这个实例放入一个SQL Server上,这样可以让数据库更好的工作。
 
做DBA的应该都知道,SQL Server的诸多元素当中,对于性能影响最大的就莫过于索引了,这一点几乎毫无争议。
 
您要基于成本和您希望调整的选择数量来选择您的索引优化工具。目前没有一个万能的解决方案,只有适合您企业的解决方案。
 
在一个数据库上创建索引会给数据库带来负面影响。当对表执行插入、更新和删除操作时,您就会看到这个性能的负面影响。
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录