我想截断并刷新SQL Server中的表,但是要等到当前访问该表的任何查询完成。这是SQL Server中的一个简单设置,还是我需要创建一些逻辑来完成它?
我有一个VB应用程序,它位于大约300个终端上。应用程序每2分钟调用一次SqlServer(2008 R2)存储过程([spGetScreenData])以获取最新的销售数据。
[spGetScreenData]创建一系列临时表,并返回大约200行和100列的选择查询。执行大约需要8秒钟。
我的目标是创建一个每两分钟执行一次的新存储过程([spRefreshScreenData]),它将刷新表中的数据([SCREEN_DATA])。然后我将[spGetScreenData]更改为简单查询[SCREEN_DATA]。
刷新[SCREEN_DATA]的作业在执行时首先将状态表中的标志设置为“RUNNING”。完成后,它会将该状态设置为“已完成”。
[spGetScreenData]在查询之前检查标志的状态并等待(一段时间)直到它准备好。有点像...
DECLARE @Condition AS BIT=0
, @Count AS INT=0
, @CycleCount AS INT=10 --10 cycles (20 Seconds)
WHILE @Condition = 0 AND @Count < @CycleCount
BEGIN
SET @Count = @Count + 1
IF EXISTS( SELECT Status
FROM tbl_Process_Status
WHERE Process = 'POS_Table_Refresh'
AND Status='Running')
WAITFOR DELAY '000:00:02' --Wait 2 seconds
ELSE
SET @Condition=1
END
SELECT *
FROM SCREEN_DATA
WHERE (Store=@Store OR @Store IS NULL)
我的担心与[spRefreshScreenData]有关。当[spRefeshScreenData]开始截断时,可能会有数十个当前正在运行的数据请求。
SqlServer是否会在截断之前等待请求完成?是否有一个设置我必须设置为不要弄乱这些查询?
或者我是否必须构建一些机制来等待所有请求完成才开始截断?
答案 0 :(得分:2)
刷新[SCREEN_DATA]的作业在执行时首先将状态表中的标志设置为“RUNNING”。完成后,它会将该状态设置为“已完成”。
[spGetScreenData]在查询之前检查标志的状态并等待(一段时间)直到它准备好
别。使用app锁。读者(spGetScreenData
)是共享模式下的应用程序锁定,编写者(刷新作业)请求X模式。请参阅sp_getapplock
。
但即便如此也没有必要。您可以在查询继续的同时在线构建新数据,而不会使用 staging 表影响它们,您可以使用与应用程序查询的表不同的表。重建完成后,只需使用快速切换操作(请参阅Transferring Data Efficiently by Using Partition Switching)或使用良好的'sp_rename
技巧,将原始表格与暂存表格交换。