안녕하세요.
현재 Azure SQL Server를 사용중입니다. (SQL Server 2012)
단순 테이블에서 데이타를 삭제 하려 하는데요 전체 데이타 4만여건 중 100건 정도 지우는 쿼리가 굉장히 느립니다.
좋은 방법이 없는지 문의 드립니다.
삭제 하려는 테이블은 idx가 identity로 PK (asc) 이고 컬럼에 data nvarchar(MAX)가 포함되어 있습니다.
실행 : Delete T_Log Where Idx < 4210
=> 너무 느려 Select 통계를 보니
Select * From T_Table where idx < 4210
Select [idx] From T_Table where idx < 4210
(9개 행이 영향을 받음)
Table 'T_Log'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 1720, lob physical reads 0, lob read-ahead reads 0.
(9개 행이 영향을 받음)
Table 'T_Log'. Scan count 1, logical reads 8, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Comment 3
-
minsouk
2015.08.31 22:15
-
초보자여요
2015.09.01 09:10
그럼 테이블 설계시에 주의해야겠네요. 감사합니다.
-
minsouk
2015.09.01 10:10
저게 처음에는 물리적으로 읽어야 해 느립니다.
이 경우 SSD 로 바꾸면 SSD 성능만큼 빨라지겠죠
지금은 아마 캐시 웜업이 되어 있어 logical reads 로 잡히지만 처음에는 physical reads 였을겁니다.
파일그룹도 왠만하면 나누어 설계하는게 좋구요 이 경우 while 문을 이용해 후처리 하는게 여러모로 좋습니다.
분리 한다고 빨라지는건 아니기 때문에, 부모 테이블에 삭제 되었다 플래그를 남기고
플래그를 기준으로 lob 테이블의 row 를 차근 차근 지우는게 가장 효율적 입니다.
이 작업은 Async 하게 처리 되도록 하는게 좋겠죠? ^^;
어쩔수 없습니다. 보통 lob 컬럼은 idx + lobColumn 으로 따로 테이블을 구성하는게 좋습니다. 같이 테이블에 넣으면 여러모로 느리게 됩니다.