0

主要问题:

我想截断并刷新 SQL Server 中的表,但想等到当前访问该表的任何查询完成。这是 SQL Server 中的一个简单设置,还是我需要创建一些逻辑来完成它?

详细说明:

我有一个位于大约 300 个终端上的 VB 应用程序。应用程序每 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 会在截断之前简单地等到请求完成吗?有没有我必须设置的设置才能不弄乱这些查询?

还是我必须建立一些机制来等到所有请求都完成后再开始截断?

4

1 回答 1

2

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

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

不。使用应用程序锁。读者(spGetScreenData)是共享模式下的应用程序锁,作者(刷新作业)请求它 X 模式。见sp_getapplock

但即使这样也没有必要。您可以在线构建新数据,同时查询继续,使用暂存表(与应用程序查询的表不同的表)不会影响它们。重建完成后,只需使用快速 SWITCH 操作(参见使用分区切换有效地传输数据)或使用良好的 'olesp_rename技巧,将原始表与暂存表交换。

于 2012-12-06T15:05:07.870 回答