重複を削除するために 1700 万件のレコードをループするために使用されるクエリは、 現在約16 時間実行されています。削除ステートメントを終了するかどうか、またはこの実行中に削除されているかどうか、クエリが現在停止されているかどうかを知りたいと思いました。クエリ? 実際、停止した場合、削除またはロールバックが終了しますか?
私がするとき、私はそれを発見しました
select count(*) from myTable
(このクエリの実行中に) 返される行数は、最初の行数よりも約 5 行少なくなります。明らかに、サーバー リソースは非常に貧弱です。つまり、このプロセスは 5 つの重複 (実際には数千あるのに) を見つけるのに 16 時間かかり、これは何日も実行される可能性があるということですか?
このクエリは、2000 行のテスト データで 6 秒かかりましたが、そのデータ セットではうまく機能するため、完全なセットを取得するには 15 時間かかると考えました。
何か案は?
以下はクエリです。
--Declare the looping variable
DECLARE @LoopVar char(10)
DECLARE
--Set private variables that will be used throughout
@long DECIMAL,
@lat DECIMAL,
@phoneNumber char(10),
@businessname varchar(64),
@winner char(10)
SET @LoopVar = (SELECT MIN(RecordID) FROM MyTable)
WHILE @LoopVar is not null
BEGIN
--initialize the private variables (essentially this is a .ctor)
SELECT
@long = null,
@lat = null,
@businessname = null,
@phoneNumber = null,
@winner = null
-- load data from the row declared when setting @LoopVar
SELECT
@long = longitude,
@lat = latitude,
@businessname = BusinessName,
@phoneNumber = Phone
FROM MyTable
WHERE RecordID = @LoopVar
--find the winning row with that data. The winning row means
SELECT top 1 @Winner = RecordID
FROM MyTable
WHERE @long = longitude
AND @lat = latitude
AND @businessname = BusinessName
AND @phoneNumber = Phone
ORDER BY
CASE WHEN webAddress is not null THEN 1 ELSE 2 END,
CASE WHEN caption1 is not null THEN 1 ELSE 2 END,
CASE WHEN caption2 is not null THEN 1 ELSE 2 END,
RecordID
--delete any losers.
DELETE FROM MyTable
WHERE @long = longitude
AND @lat = latitude
AND @businessname = BusinessName
AND @phoneNumber = Phone
AND @winner != RecordID
-- prep the next loop value to go ahead and perform the next duplicate query.
SET @LoopVar = (SELECT MIN(RecordID)
FROM MyTable
WHERE @LoopVar < RecordID)
END