我需要截断并替换经常被查询的表中的数据

时间:2012-12-06 14:57:26

标签: sql-server jobs

主要问题:

我想截断并刷新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是否会在截断之前等待请求完成?是否有一个设置我必须设置为不要弄乱这些查询?

或者我是否必须构建一些机制来等待所有请求完成才开始截断?

1 个答案:

答案 0 :(得分:2)

  

刷新[SCREEN_DATA]的作业在执行时首先将状态表中的标志设置为“RUNNING”。完成后,它会将该状态设置为“已完成”。

     

[spGetScreenData]在查询之前检查标志的状态并等待(一段时间)直到它准备好

别。使用app锁。读者(spGetScreenData)是共享模式下的应用程序锁定,编写者(刷新作业)请求X模式。请参阅sp_getapplock

但即便如此也没有必要。您可以在查询继续的同时在线构建新数据,而不会使用 staging 表影响它们,您可以使用与应用程序查询的表不同的表。重建完成后,只需使用快速切换操作(请参阅Transferring Data Efficiently by Using Partition Switching)或使用良好的'sp_rename技巧,将原始表格与暂存表格交换。