안녕하세요 대용량 로그저장용 테이블 수정을하려합니다
현재는 한 테이블에 약 23억 row가 저장되어있고 구조는
CREATE TABLE [dbo].[LOGTABLE](
[idx] [bigint] IDENTITY(1,1) NOT NULL,
[protocol] [smallint] NOT NULL,
[processtick] [int] NOT NULL,
[ItemIDX] [bigint] NOT NULL,
[PlayerIdx] [bigint] NOT NULL,
[Slot] [tinyint] NOT NULL,
[Pos] [tinyint] NOT NULL,
[Type] [int] NOT NULL,
[Count] [smallint] NOT NULL,
[Money] [bigint] NOT NULL,
[OPTION] [tinyint] NOT NULL,
[limited] [tinyint] NOT NULL,
[map] [smallint] NOT NULL,
[x] [int] NOT NULL,
[y] [int] NOT NULL,
[npc] [int] NOT NULL,
[maker] [int] NOT NULL,
[time] [datetime] NOT NULL,
[optOrder] [tinyint] NOT NULL,
[optItemType] [int] NOT NULL,
[optRate] [smallint] NOT NULL,
[ip] [int] NOT NULL,
[mac] [bigint] NOT NULL
) ON [PRIMARY]
인덱스는 idx, time(클러스터) , protocol , ItemIDX , PlayerIdx ,Type, maker에 걸려있습니다
select는 주로 time , PlayerIdx , Type을 조건으로걸고 검색을합니다
현재는 약 1년어치의 로그가 저장되어있고
이것을 현재시간기점으로 3~4개월어치만 저장되며 해당 기간이 넘어가면 삭제하는 방식으로 수정하려합니다
해당테이블은 INSERT만 하는 A와 SELECT만 하는 B 2가지 프로그램만있는상태이고 INSERT,SELECT 둘다 속도가 나오게하려합니다
INSERT,SELECT,DELETE(3~4개월 유지) 를 하고싶은데 좋은 테이블 설계나 기능들이 있는지 알고싶습니다
가능하면 DELETE는 자동화(SQL Agent 등등)를 하려합니다
로그테이블이 2가지있는데
하나는 현재 작업이안되있고 (작업하려는 테이블)
하나는 매일매일 SQL Agent로
DECLARE @DATE BIGINT = GETDATE() - 90
DELETE FROM LOGTABLE WHERE TIME < @DATE
방식으로 삭제중인데 해당작업도 오래걸리고(매일 약 1시간반) 인덱스나 파일 파편화?? 등이 생기는거같습니다
혹은
LOG1910
LOG1911
LOG1912
LOG2001 이렇게 월별로 자동으로 테이블생성하고 해당 월에 해당하는 테이블에만 INSERT하고
SELECT는 VIEW?로 하고서 DELETE를 테이블자체 DROP하는방식도 생각해봤는데 이게 가능한지 잘 모르겠네요
너무 복잡해지고 테이블이 많아지는 문제도있는거같고
뭐 좋은방법이 있을까요
Comment 3
-
이리
2020.01.20 16:26
-
freighter
2020.01.20 16:36
파티션이 엔터프라이즈에서 사용가능하다고 알고있는데 스탠다드라 힘들거같습니다
-
모가모가
2020.02.19 14:21
일단 index부분에 자주 사용하지 않는 컬럼은 include를 사용하여 index부하를 좀 줄여 주시구요.
CREATE CLUSTERED INDEX [time_inc] ON [dbo].[LOGTABLE]
(
[time] ASC
)
INCLUDE (
protocol , ItemIDX , maker
) ON [PRIMARY]
GO
제가 관리 하는 곳에서도 한달에 1억건정도 쌓입니다. 데이터가 훨씬 많으시네요.
월별로 분리해서 검색하는걸 추천드립니다.
view를 쓰셔도 되지만 union 을 사용하셔도 됩니다.(검색 할때 여러곳에서 검색을 한다면 with(nolock) 사용)
혹시나 해서 디스크 셋팅시 레이드5로 설정했는지 확인 해보시는것도 중요합니다.
도움이 되셨으면 좋겠네요.
파티션은 사용할 수 없는 상황인가요?