在SQL Server上测试事务日志的自动增长(一)

 
   | |

导读:在本文中,作者对事务日志文件增长造成的影响做了测试,以证明事务日志的增长毫不逊色数据库文件的增长。

关键词:SQL Server 事务日志 数据库

正在加载数据...

【TechTarget中国原创】比起数据库文件,事务日志的增长速度毫不逊色,因此数据库管理员会经常缩减删除事务日志。在本文中,我将对事务日志文件增长造成的影响做一个测试。而在本次测试中,我将使用和上一次测试相同的环境和配置。唯一的不同是,这一次我在SQL Server上安装了SP3。

【TechTarget中国原创】比起数据库文件,事务日志的增长速度毫不逊色,因此数据库管理员会经常缩减删除事务日志。在本文中,我将对事务日志文件增长造成的影响做一个测试。而在本次测试中,我将使用和上一次测试相同的环境和配置。唯一的不同是,这一次我在SQL Server上安装了SP3。

  数据库

  本次测试数据库ShrinkDB设置为在执行事务时,数据库文件不增长,事务日志文件大小只有2MB,而本次测试的目的就是让它在每次事务中都增长以衡量其影响:

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

  select size from sysfiles where fileid = 2

  在以上的查询语句中,fileid代表事务日志文件,返回值256。这表明,事务日志文件大小为2MB。

  同上一篇文章一样,ExpandDB表再次使用。

  create table ExpandDB (a varchar(8000))

  本次测试的目标是了解INSERT, UPDATE和DELETE命令是如何影响事务日志文件的增长的,还有事务日志文件增长反过来如何影响INSERT, UPDATE和DELETE日志的。

  我把测试分成两个阶段:

  在第一阶段,我将监测由于运行修改造成事务文件增长的一般行为。

  在第二阶段,我将用那些在第一阶段造成事务日志增长的命令。在这个阶段,我将测试同第一部分类似的autogrowth情况。

  由于更新,插入和删除都有所不同,在每个阶段都要包含三个部分,每次一个操作:UPDATES, INSERTS和DELETE。

  第一阶段:事务日志增长行为

  UPDATE命令和事务日志增长

  在这个测试中,我的代码将只向表中插入一行,知道事务日志文件增长到8MB后,它将更新此表。

  

-- Insert one row into the table
  insert into ExpandDB select replicate ( 'a',8000)
  --================================================================
  -- Update the table until T-Log reaches 8MB
  while (select size from sysfiles where fileid = 2) <= 1024
  update ExpandDB set a = replicate ( 'a',8000)
  go
  结果令人惊讶!

  我的循环无限地运行,事务日志文件没有增长而且在使用dbcc sqlperf(日志空间)的空闲空间百分比一直保持30%的增长。事务运行期间,事务日志将持续填充直至70%,然后下降到50%。为确保从dbcc sqlperf得到准确的数据,我同时在数据文件中运行查找autogrowth的报告:

  此时报告在任何数据库中都没有autogrowth!

  然后我决定检查有少量更新的大量事务,一次一行,所以我加了一个开始事务:

  -- Big transaction
  begin tran
  while (select size from sysfiles where fileid = 2) <= 1024
  update ExpandDB set a = replicate ('a',8000)
  go
  commit tran

  这一次,结果同样令人困惑。循环无限地运行,事务日志文件没有超过初始的2MB而且空闲空间百分比一直保持60%的增长。我停止了循环并提交了事务。提交之后,事务日志文件的使用空间甚至少了一点。

  在另一个UPDATE命令测试中,我向表中插入了10,000并运行了以下代码:

  

-- Truncate the T-Log
  backup transaction ShrinkDB with truncate_only
  go
  -- Check the size of the T-Log file (RESULT = 2MB)
  select size from sysfiles where fileid = 2
  go
  -- Check % free space in T-Log
  dbcc sqlperf(logspace)
  go
  -- Update 10000 rows at a time
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  update ExpandDB set a = a + 'a'
  go
  -- Check % free space in T-Log
  dbcc sqlperf(logspace)
  go
  结果类似。事务日志文件增长了1MB,直到达到10MB大小,之后就不再增长了。无论我执行几次更新动作,空间填满之后又再次下降:

  我为此寻求解答,但在SQL Server 2005说明书中没找到答案。我还在其它机器上的SQL Server 2005中运行了同样的测试,但结果都一样。

 
查看全文
 
 
 
 
 

SQL Server性能与调优

 
SQL Profiler是一个非常有用的工具,它学习起来不会太难——正确地掌握这一工具,可以帮你成为数据库管理高手。
 
SQL Profiler能捕捉事件,例如查询停止和开始通知、每一个执行的查询的完整文本、查询编译信息、等等。
 
如果你频繁地在索引重建以后执行索引重组,那么重组花费的CPU处理能力和磁盘I/O就浪费了,因为在执行完索引重建命令以后索引会被完全重建。
 
在SQL Server中,存储过程运行速度过慢同硬盘碎片之间是否有直接的关系,专家Denny Cherry对此进行了分析。
 
SQL Server Profiler是一个应用程序,在SQL Server标准版、企业版和工作组版中都有,它为用户提供了一个接口,用来设置与运行跟踪。
 

登录TechTarget中国

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