主な質問:
SQL Serverでテーブルを切り捨てて更新したいのですが、現在テーブルにアクセスしているクエリが終了するまで待ちたいです。これはSQLServerの単純な設定ですか、それともそれを実現するためにロジックを作成する必要がありますか?
詳細な説明:
私は約300の端末にあるVBアプリケーションを持っています。アプリケーションは、2分ごとにSqlServer(2008 R2)ストアドプロシージャ([spGetScreenData])を呼び出して、最新の販売データを取得します。
[spGetScreenData]は一連の一時テーブルを作成し、約200行100列の選択クエリを返します。実行には約8秒かかります。
私の目標は、2分ごとに実行される新しいストアドプロシージャ([spRefreshScreenData])を作成して、テーブル([SCREEN_DATA])のデータを更新することです。次に、[spGetScreenData]を変更して、[SCREEN_DATA]を単純に照会します。
[SCREEN_DATA]を更新するジョブは、実行中に最初にステータステーブルのフラグを「RUNNING」に設定します。完了すると、そのステータスが「COMPLETED」に設定されます。
[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は、要求が完了するまで待機してから切り捨てますか?これらのクエリを台無しにしないように設定する必要がある設定はありますか?
または、切り捨てを開始する前に、すべての要求が完了するまで待機するメカニズムを構築する必要がありますか?