使用READ UNCOMMITTED与UNION ALL

时间:2014-12-31 16:08:59

标签: sql tsql sql-server-2008-r2

我有一个正在开发的存储过程,包含多个UNION ALL语句。这是历史数据,我已被指示使用SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED。抛开关于这是否是正确方法的讨论,我想知道是否需要在存储过程的顶部仅指定一次ISOLATION LEVEL,或者如果我需要在每个UNION ALL之后指定它,因为它们是不同的疑问?

示例:

Alter procedure dbo.ExampleProcedure as
declare @StartDate datetime
declare @EndDate datetime
insert into myDB.DBO.InboundCalls

select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System1CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
Group by I.Date, I.System

Union ALL

select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System2CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
group by I.Date, I.System

Union ALL

select I.Date, I.System, Count(*) as calls
from
(select Date, System, CallID from System3CallData C
Left Join someothertables as S on C.CallID = S.CallID
where (C.date >= @StartDate and C.date < @EndDate)) as I
Group by I.Date, I.System
Order by I.Date asc, I.System asc, calls asc

那么我应该在SET TRANSACTION ISOLATION LEVEL之后,或在第一个Alter Procedure dbo.ExampleProcedure as之前,还是在每个嵌套SELECT之前放置SELECT?提前感谢任何指导!

1 个答案:

答案 0 :(得分:2)

  

我想知道是否需要在存储过程的顶部指定一次ISOLATION LEVEL。 。

在程序的顶部只有一次,除非您在程序中切换隔离级别。 SP退出时isolation level reverts到上一级别。

  

如果您在存储过程中发出SET TRANSACTION ISOLATION LEVEL或   触发器,当对象返回控制时,隔离级别被重置   到调用对象时生效的级别。例如,如果   你批量设置REPEATABLE READ,然后批处理调用存储   将隔离级别设置为SERIALIZABLE,隔离的过程   级别设置在存储过程时恢复为REPEATABLE READ   将控制权交还给批次。

使用&#34;读取未提交的&#34;隔离级别可能对历史数据没有风险。我假设指示你使用隔离级别的人知道风险并确定它是安全的。

历史数据通常要么根本不变,要么以已知的间隔变化。 (比如,每季度。或者每天凌晨1点。)我预计相对较少的人对这些表具有插入权限,几乎没有人拥有更新和删除权限。

您还可以测试在单个事务中运行三个单独的insert语句,而不是插入三个select语句的并集。 ORDER BY子句在生产中可能是一个坏主意。