0

主な質問:

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は、要求が完了するまで待機してから切り捨てますか?これらのクエリを台無しにしないように設定する必要がある設定はありますか?

または、切り捨てを開始する前に、すべての要求が完了するまで待機するメカニズムを構築する必要がありますか?

4

1 に答える 1

2

[SCREEN_DATA]を更新するジョブは、実行中に最初にステータステーブルのフラグを「RUNNING」に設定します。完了すると、そのステータスが「COMPLETED」に設定されます。

[spGetScreenData]は、クエリを実行する前にフラグのステータスをチェックし、準備ができるまで(一定期間)待機します

しないでください。アプリロックを使用します。リーダー(spGetScreenData)は共有モードのアプリロックであり、ライター(更新ジョブ)はXモードを要求します。を参照してくださいsp_getapplock

しかし、これでも必要ありません。クエリを続行しながら、ステージングテーブルを使用して、アプリによってクエリされたテーブルとは異なるテーブルを使用して、新しいデータをオンラインで構築できます。再構築が完了したら、高速SWITCH操作(パーティション切り替えを使用したデータの効率的な転送を参照)または適切なsp_renameトリックを使用して、元のテーブルをステージングテーブルと交換するだけです。

于 2012-12-06T15:05:07.870 に答える