일부 중복 항목이있는 테이블이 있습니다. 나는 하나를 제외한 모든 것을 버리고이 최신 것을 업데이트해야합니다. 나는 이런 식으로, 임시 테이블 잠시 문을 시도했다 :데이터베이스 대량 업데이트를 효율적으로 수행하려면 어떻게해야합니까?
CREATE TABLE #tmp_ImportedData_GenericData
(
Id int identity(1,1),
tmpCode varchar(255) NULL,
tmpAlpha3Code varchar(50) NULL,
tmpRelatedYear int NOT NULL,
tmpPreviousValue varchar(255) NULL,
tmpGrowthRate varchar(255) NULL
)
INSERT INTO #tmp_ImportedData_GenericData
SELECT
MCS_ImportedData_GenericData.Code,
MCS_ImportedData_GenericData.Alpha3Code,
MCS_ImportedData_GenericData.RelatedYear,
MCS_ImportedData_GenericData.PreviousValue,
MCS_ImportedData_GenericData.GrowthRate
FROM MCS_ImportedData_GenericData
INNER JOIN
(
SELECT CODE, ALPHA3CODE, RELATEDYEAR, COUNT(*) AS NUMROWS
FROM MCS_ImportedData_GenericData AS M
GROUP BY M.CODE, M.ALPHA3CODE, M.RELATEDYEAR
HAVING count(*) > 1
) AS M2 ON MCS_ImportedData_GenericData.CODE = M2.CODE
AND MCS_ImportedData_GenericData.ALPHA3CODE = M2.ALPHA3CODE
AND MCS_ImportedData_GenericData.RELATEDYEAR = M2.RELATEDYEAR
WHERE
(MCS_ImportedData_GenericData.PreviousValue <> 'INDEFINITO')
-- SELECT * from #tmp_ImportedData_GenericData
-- DROP TABLE #tmp_ImportedData_GenericData
DECLARE @counter int
DECLARE @rowsCount int
SET @counter = 1
SELECT @rowsCount = count(*) from #tmp_ImportedData_GenericData
-- PRINT @rowsCount
WHILE @counter < @rowsCount
BEGIN
SELECT
@Code = tmpCode,
@Alpha3Code = tmpAlpha3Code,
@RelatedYear = tmpRelatedYear,
@OldValue = tmpPreviousValue,
@GrowthRate = tmpGrowthRate
FROM
#tmp_ImportedData_GenericData
WHERE
Id = @counter
DELETE FROM MCS_ImportedData_GenericData
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND PreviousValue <> 'INDEFINITO' OR PreviousValue IS NULL
UPDATE
MCS_ImportedData_GenericData
SET
PreviousValue = @OldValue, GrowthRate = @GrowthRate
WHERE
Code = @Code
AND Alpha3Code = @Alpha3Code
AND RelatedYear = @RelatedYear
AND MCS_ImportedData_GenericData.PreviousValue ='INDEFINITO'
SET @counter = @counter + 1
END
하지만 그것은 단지 20000이있는 경우에도, 너무 시간이 오래 걸립니다 - 처리 30000 행.
성능 향상을 위해 제안이 있습니까?
미리 감사드립니다.
루프를 사용하지 마십시오! –
TSQL에 루프가 포함되어 있지만 동의어는 최적화되어 있지 않습니다. – MatBailie
Microsoft SQL Server에 특정한 경우 sqlserver로 태그하십시오. 그럼 그 또는 나는 포기하고 그냥 태그 SQL을 무시합니다. – Thomas