sql-server – 为什么DELETE会对机能发生影响?
副问题[/!--empirenews.page--]
最后是一个测试剧本,用于较量@table变量和#temp表之间的机能.我想我已经正确配置了 – 机能时刻是在DELETE / TRUNCATE呼吁之外举办的.我获得的功效如下(以毫秒为单元的时刻). @Table Variable #Temp (delete) #Temp (truncate) --------------- -------------- ---------------- 5723 5180 5506 15636 14746 7800 14506 14300 5583 14030 15460 5386 16706 16186 5360 为了确保我的理智,这表白CURRENT_TIMESTAMP(又名GetDate())是在语句时而不是批处理赏罚中举办的,因此TRUNCATE / DELETE与SET @StartTime = CURRENT_TIMESTAMP之间不该该有任何交互.声明. select current_timestamp waitfor delay '00:00:04' select current_timestamp ----------------------- 2012-10-21 11:29:20.290 ----------------------- 2012-10-21 11:29:24.290 当行使DELETE破除表时,第一次运行和后续运行之间的跳转很是同等.我对DELETE的领略中穷乏什么?我一再了这么多次,互换了订单,调解tempdb巨细以不必要增添等. CREATE TABLE #values ( id int identity primary key,-- will be clustered name varchar(100) null,number int null,type char(3) not null,low int null,high int null,status smallint not null ); GO SET NOCOUNT ON; DECLARE @values TABLE ( id int identity primary key clustered,name varchar(100) null,status smallint not null ); DECLARE @ExecutionTime TABLE( Duration bigINT ) DECLARE @StartTime DATETIME,@i INT = 1; WHILE (@i <= 5) BEGIN DELETE @values; DBCC freeproccache With NO_InfoMSGS; DBCC DROPCLEANBUFFERS With NO_InfoMSGS; SET @StartTime = CURRENT_TIMESTAMP -- alternate getdate() /****************** measured process ***********************/ INSERT @values SELECT a.* FROM master..spt_values a join master..spt_values b on b.type='P' and b.number < 1000; /**************** end measured process *********************/ INSERT @ExecutionTime SELECT DurationInMilliseconds = datediff(ms,@StartTime,CURRENT_TIMESTAMP) SET @i += 1 END -- WHILE SELECT DurationInMilliseconds = Duration FROM @ExecutionTime GO -- Temporary table DECLARE @ExecutionTime TABLE( Duration bigINT ) DECLARE @StartTime DATETIME,@i INT = 1; WHILE (@i <= 5) BEGIN delete #values; -- TRUNCATE TABLE #values; DBCC freeproccache With NO_InfoMSGS; DBCC DROPCLEANBUFFERS With NO_InfoMSGS; SET @StartTime = CURRENT_TIMESTAMP -- alternate getdate() /****************** measured process ***********************/ INSERT #values SELECT a.* FROM master..spt_values a join master..spt_values b on b.type='P' and b.number < 1000; /**************** end measured process *********************/ INSERT @ExecutionTime SELECT DurationInMilliseconds = datediff(ms,CURRENT_TIMESTAMP) SET @i += 1 END -- WHILE SELECT DurationInMilliseconds = Duration FROM @ExecutionTime GO DROP TABLE #values SET NOCOUNT OFF; 办理要领当工具是B树时,这种差别好像只合用.删除表变量上的主键,因此它是一个堆,我获得了以下功效2560 2120 2080 2130 2140 可是在PK中,我在测试中发明白相同的模式以及下面的典范功效. +--------+--------+---------+-------------------+ | @table | #table | ##table | [permanent_table] | +--------+--------+---------+-------------------+ | 2670 | 2683 | 9603 | 9703 | | 6823 | 6840 | 9723 | 9790 | | 6813 | 6816 | 9626 | 9703 | | 6883 | 6816 | 9600 | 9716 | | 6840 | 6856 | 9610 | 9673 | +--------+--------+---------+-------------------+ 我的理论是,当对当地姑且B树举办批量插入时,存在一些可用的优化,仅在它尚未分派任何页面时才合用. 我基于以下调查功效. >运行各类版本的测试代码时,我只看到了@table_variables和#temp表的这种模式.不是tempdb中的永世表,也不是##表. 运行 SELECT * FROM sys.dm_db_index_physical_stats(2,OBJECT_ID('tempdb..#values'),1,NULL,'DETAILED') 删除后返回 +-------------+------------+--------------+--------------------+ | index_level | page_count | record_count | ghost_record_count | +-------------+------------+--------------+--------------------+ | 0 | 1 | 0 | 1 | | 1 | 1 | 1 | 0 | | 2 | 1 | 1 | 0 | +-------------+------------+--------------+--------------------+ 我发明有也许在enabling trace flag 610之间镌汰时刻差别. 这样可以大大镌汰后续插入的日记记录量(从350 MB镌汰到103 MB,由于它不再记录单个插入的行值),但这对第二次和后续的@table的时刻只有很小的改造.,#table案例和差距如故存在.跟踪符号显著进步了插入到其他两种表范例的一样平常机能. +--------+--------+---------+-------------------+ | @table | #table | ##table | [permanent_table] | +--------+--------+---------+-------------------+ | 2663 | 2670 | 5403 | 5426 | | 5390 | 5396 | 5410 | 5403 | | 5373 | 5390 | 5410 | 5403 | | 5393 | 5410 | 5406 | 5433 | | 5386 | 5396 | 5390 | 5420 | +--------+--------+---------+-------------------+ 通过查察事宜日记,我留意到针对空当地姑且表的初始插入好像记录得更少(96 MB). (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |