같은 테이블에서 생성 된 값으로 테이블을 업데이트하고 싶습니다.업데이트/삭제 쿼리의 성능
내 목표는 _NS 및 _WP과 같은 AO와 같은 proftxt 모든 행을 검색을 요약,
나누기에게 값을 _H, _G, 그 AO의 _L - 요소의 수를 통해이 값을 추가하는 것입니다 해당 AO의 _H, _G 및 _L 개체에 추가합니다.
ao에는 _NS 및 _WP 행만있을 수 있습니다. 루틴이이 AO를 뛰어 넘어야합니다. testdata로 소량에 대한
an, ao, proftxt, value, year
102 , 1, 'e_Ha', 10 2006
103 , 2, 'x_H05r', 7, 2006
103 , 2, 'w_Gr', 5, 2006
108 , 3, 'a_WPr', 4, 2006
내 일상적인 작품 :
an, ao, proftxt, value, year
101 , 1, 'e_NSe', 5, 2006
102 , 1, 'e_Ha', 1, 2006
103 , 1, 'w_NSr', 4, 2006
104 , 2, 'w_NSr', 2, 2006
105 , 2, 'x_H05r', 4, 2006
106 , 2, 'w_Gr', 2, 2006
107 , 2, 'a_WPr', 4, 2006
108 , 3, 'a_WPr', 4, 2006
내 데이터가 같아야합니다
예 : 같은
내 데이터 보인다.
업데이트 기능은 13 시간이 지난 후에 실제 데이터베이스에서 작업하는 동안 종료됩니다.
그러나 210000 개의 행 중에서 5000 개만 편집했습니다.
DECLARE @ENDYEAR INT
DECLARE @AO BIGINT
DECLARE @YEAR INT
DECLARE @ELEMENTS INT
--Parameter festlegen
SET @YEAR = 2006
SET @ENDYEAR = 2013 --Endyear+1
SET @AO = 2
WHILE(@YEAR<@ENDYEAR)
BEGIN
WHILE (@AO >1) --Do as long as Cursor is inside table
BEGIN
SET @AO = (SELECT TOP 1 ao FROM tbl_slp -- Search ao with _WP _NS
WHERE (proftxt LIKE '%[_]WP%'
OR proftxt LIKE '%[_]NS%')
AND year = @YEAR
AND ao > @AO);
SET @ELEMENTS = (SELECT COUNT(proftxt) --Count Number of _H, _G, _L elements
FROM tbl_SLP
WHERE ao = @AO AND year = @YEAR AND
(proftxt LIKE '%[_]H%' OR proftxt = NULL
OR proftxt LIKE '%[_]G%'
OR proftxt LIKE '%[_]L%'))
IF (@ELEMENTS != 0)
BEGIN
UPDATE tbl_SLP --Update _H, _G, _L rows
SET value = value + (SELECT SUM(CONVERT(float, value))
FROM tbl_SLP
WHERE (proftxt LIKE '%[_]WP%'
OR proftxt LIKE '%[_]NS%')
AND year = @YEAR
AND ao = @AO)
/@ELEMENTS
WHERE ao = @AO AND year = @YEAR
DELETE FROM tbl_SLP --delete_WP _NS rows
WHERE ao= @AO
AND year = @YEAR
AND (proftxt LIKE '%[_]WP%' OR proftxt LIKE '%[_]NS%')
END
SET @AO = @AO +1
END
SET @YEAR = @YEAR +1
END
나는 루틴이 매우 느리다는 것을 알고 있지만 어떻게해야합니까?
테이블에 색인이 있습니까? – SkyDrive
아니요, 연도가 내 기본 키입니다. 나는 그것을 검사 할 것이다 ... – soeren