2017-05-01 9 views
0

以下の理由でT-SQLがブロックを作成して実行に時間がかかるのはなぜですか?SQL ServerのDELETEによって引き起こされるブロッキングの問題を解決する方法

declare @StartDate date 
declare @EndDate date 

set @StartDate='08/01/2016' 
set @EndDate='12/30/2016' 

WHILE @StartDate<= @EndDate 
BEGIN 
    BEGIN TRANSACTION 
     print ' Clean up date ' + convert(varchar, @StartDate, 101) 

     DELETE FROM [SAMPLEDB].[dbo].[MYTABLE] 
     WHERE CONVERT(DATE, CREATE_DATE, 101) = @StartDate 

     COMMIT TRANSACTION 

     SET @StartDate = DATEADD(DAY, 1, @StartDate); 
END 
+3

ループを使用しているため、これは遅くなります。なぜあなたはここにループが必要ですか?必要なときに150個の削除ステートメントを実行しています。 –

+0

削除を実行するには、他のレコードがレコードを編集してからシステムが待機する必要がある場合は、各レコードをロックする必要があります。ロックされたレコードを毎回チェックする必要があります。大量に削除すると、チェックは1回発生し、セット全体でロックが達成されると削除されます。したがって、毎日待つのではなく、1回待つ。 – xQbert

答えて

1

ループは、SQL Serverではひどく非効率です。いくつかの管理作業や非常に大規模なデータセットを扱う場合を除いては避けるべきです。このようなループベースのアプローチをこのようなものに置き換えてみてください。また、日付文字列リテラルの形式をANSI準拠に変更し、日付形式の設定を使用するようにしました。

declare @StartDate date 
declare @EndDate date 

set @StartDate='2016-08-01' 
set @EndDate='2016-12-30' 

DELETE FROM [SAMPLEDB].[dbo].[MYTABLE] 
WHERE CONVERT(DATE, CREATE_DATE, 101) >= @StartDate 
    AND CONVERT(DATE, CREATE_DATE, 101) <= @EndDate 
関連する問題