728x90
[TABLE_DATA] 테이블은 PK가 "seq" 이고, "CREATION_STDDATETIME" 이라는 날짜 필드가 존재한다.
다음은 [TABLE_DATA] 테이블에서 14일 이전 데이터만 삭제하는 SP 이다. [TABLE_DATA] 테이블은 전체 100 만건 정도 가지고 있다.
CREATE PROCEDURE "dbo"."usp_deleteBatch"
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRAN
DELETE FROM TABLE_DATA
WHERE CREATION_STDDATETIME < DATEADD(DAY, -14, GETDATE()) ;
COMMIT TRAN
SELECT 1
END TRY
BEGIN CATCH
ROLLBACK TRAN;
SELECT 0
END CATCH
END
그런데, 해당 테이블의 데이터 건수가 많은 경우 처음 SP 가 실행될때 "CREATION_STDDATETIME" 가 인덱스가 안잡혀있기 때문에 수행될때 blocking 이 발생할 수 있다.
다음과 같이 PK 인 "seq" 를 이용한 SP 로 변경한다.
CREATE PROCEDURE "dbo"."usp_deleteBatch"
DECLARE @min_seq int
DECLARE @max_seq int
select @min_seq = MIN(seq) ,@max_seq = MAX(seq) From TABLE_DATA with (nolock) WHERE CREATION_STDDATETIME < DATEADD(DAY, -14, GETDATE()) ;
WHILE(@min_seq < @max_seq)
BEGIN
begin tran
DELETE FROM [TABLE_DATA] WHERE SEQ BETWEEN @min_seq AND @min_seq + 100
SET @min_seq = @min_seq + 100
WAITFOR DELAY '0:0:1'
commit tran
END
'Engineering > DB' 카테고리의 다른 글
update 특정 필드 내 문자열 변경 on MySQL (0) | 2023.12.04 |
---|---|
SQL LEFT JOIN 간단 예제 (0) | 2018.04.20 |
CentOS 7 에서 MySQL 5.6 설치 (0) | 2016.02.22 |
mysql sql 파일을 database 에 insert (0) | 2015.11.11 |
jedis sample source (0) | 2014.10.08 |