Indexed View 도입에 관하여 조언을 구하고자 문의를 드립니다.
고수님들및 여러 디비를 사랑하는 분들의 고견을 부탁드립니다.
- 문제점및 현황 -
1. 추출하려고 하는 값은 하나의 테이블에 있다.
2. 테이블의 크기는 한달평균 300M 정도이며 로우수는 한달평균
10,000,000(천만)건이다.
3.주로 쿼리는 시간별통계, 10분별 통계 값이며 DATE 컬럼을
가공하여 GROUP BY 하여 SUM,AVG 를 구한다.
4. 테이블은 UPDATE 는 발생하지 않으나 매분 INSERT가
발생한다.
이러한 상황에서 INDEXED VIEW 를 사용하여 SUM, COUNT_BIG(*) 등을
이용하여 처리하려고 합니다.
=== 추가 ===
답변 주신 분들 감사드리고요. 24시간 꾸준히 insert 가
발생하는시스템입니다. 현 시스템에서 통계태이블을 이용하고 있는데
통계를 낼때 부하가 발생하여 문제가 있는 편이거든요.
제가 좀더 상세히 문제를 분석 설명해 보았습니다. 함께 생각할 수
있어서 참 좋네요.
다시 한번 감사드립니다.
분당 300건의 insert 만이 발생하는
하나의 테이블을
대상으로 10분간의 평균값을 조회하는 시스템이 있습니다.
이때 MS-SQL 2005 서버안의 indexed
view 를 사용하고자
합니다.
그간 사용하던 방신은 별도 테이블에 스케쥴러를 이용하여 통계값을
저장 하는 방식이였는데,
이를 indexed view 로 사용하면
어떨지에
대한 고민을 하게 되었고 ,이를 위하여 사전테스트를 진행하였으며, 본
결과에데 도출된 내용으로 문의를 하고자 합니다.
먼저 하나의 그래프를 먼져 보여 드르며 문의를 시작하겠습니다.
본 그래프는 대조군과 실험군으로 나뉘어져 있으며 실험군은
"인덱스된 뷰를
활용하여 검색한 결과로 보시면 되겠습니다.
실험에 사용된 테이블은 매분 300건의 insert 가 발생하며, update
는 발생하지
않으며, 아무런 index 도 걸려 있지 않습니다.
또한 속도를 측정한 Query 는 매분 쌓여진 값들을 ID 별로 10분
평균을 구하여
두고 ID 와 DT(시간) 별로 조회하는 쿼리 엿습니다.
이때 대조군인 보통의 테이블은 테이블의 크기가 증가할 수록 커리의
반응 속도가
증가하고 있으나 심험군은 반응속도가 1ms 로 테이블의 증가와 상관
없어 보이고
있습니다.
이때 각각 대조군에서 사용한 테이블과 쿼리는 아래와 같습니다.
SELECT
dcp_id,
AVG(raw_value)
FROM
dbo.TEST_HDATA
WHERE
dcp_id = 10000246
AND
DT BETWEEN'2005-12-06 16:15' AND '2005-12-06 16:21'
GROUP BY
dcp_id,
CONVERT(CHAR(16),DT,20),
DATENAME(ss,DT)/10
또 실험군에 사용된 테이블과 쿼리, 그리고 indexed view 는 아래와
같으며,
이때 위 대조군과 다르게 ymdh, tsts 컬럼을 추가하였는데 이는
각각
날짜를 시간까지 나타낸(2005-12-06 11) ymdh 와 분을 10분 단위로
다타낸(0~5)
tsts 를 추가한것입니다.
이렇게 테이블에 DT 라는 datatime 컬럼이 있음에서 char 타입의
컬럽을 2개나
추가함으로써 테이블의 크기및 insert 시 datatime 을 이용하여 convert
하여 처리함에
따른 부하가 발생합니다.
하지만 indexed view 를 이용하여 index seek 를 유도하기 위하여
본인선택한
방법입니다.
SELECT
dcp_id,
ymdh,
tsts,
AVG(raw_value)
FROM
dbo.TEST_HDATAPLUS
WHERE
dcp_id = 10000246
AND
ymdh+tsts BETWEEN '2005-12-06 18:090' AND '2005-12-06
18:150'
GROUP BY
dcp_id,
ymdh,
tsts
ORDER BY ymdh+tsts
GO
-- indexed view
CREATE VIEW V_TEST_HDATAPLUS WITH SCHEMABINDING
AS
SELECT
dcp_id,
ymdh,
tsts,
SUM(raw_value) sum_rawValue,
COUNT_BIG(*) CB
FROM
dbo.TEST_HDATAPLUS
GROUP BY
dcp_id,
ymdh,
tsts
GO
CREATE UNIQUE CLUSTERED INDEX ind_v_TEST_HDATAPLUS ON
v_TEST_HDATAPLUS (dcp_id,
ymdh, tsts)
style='font-family:굴림;mso-ascii-font-family:굴림;mso-fareast-font-family:굴림;
mso-hansi-font-family:Arial;font-size:10pt;layout-flow:vertical;mso-fareast-language:
KO;mso-ansi-language:1024'>
위와 같은 상황이며, 전반적으로 indexed view 를 도입하여 모델링
하는것이 타당한지의
문의와 함께 아래의 사항을 붙여 문의를
드립니다.
1. 위와 같은 상황에서 DATETIME 의 10분단위
또는 1시간
1일 1주의 구분을 지어줄 모델링적 방법이 위와 같이 별도의 컬럼을
구성하는것이
최선의 방법일지 ?
2. INSERT 속도에 있어 발생하는 문제점은
실험군이 대조군에
비해여 많이 늦는것으로 (INDEXED VIEW 의 계산과 INDEX 생성관련 7배
정도 느리다는
것으로 판단)보이는데 이때의 부하가 검색 속도를 향 상 하는데
불가피한 것일지
? 또한 insert 시의 부담으리 최소화 할 수 있는 방법은 없을지
...
^^ 두서없이 정리된 글이라 읽어 보시는데도
많은 어려움이
있으셨을 것입니다.
잘 부탁 드리겠습니다.
여러분의 고견을 부탁드립니다.
|