database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 2530 게시물 읽기
No. 2530
[조언요청]Indexed View 도입에 관한...
작성자
병록아범
작성일
2005-12-05 18:38ⓒ
2005-12-07 11:30ⓜ
조회수
3,660

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 로 사용하면 어떨지에
대한 고민을 하게 되었고 ,이를 위하여 사전테스트를 진행하였으며, 본 결과에데 도출된 내용으로 문의를 하고자 합니다.


먼저 하나의 그래프를 먼져 보여 드르며 문의를 시작하겠습니다.

img1.gif

본 그래프는 대조군과 실험군으로 나뉘어져 있으며 실험군은 "인덱스된 뷰를
활용하여 검색한 결과로 보시면 되겠습니다.

실험에 사용된 테이블은 매분 300건의 insert 가 발생하며, update 는 발생하지
않으며, 아무런 index 도 걸려 있지 않습니다.

또한 속도를 측정한 Query 는 매분 쌓여진 값들을 ID 별로 10분 평균을 구하여
두고 ID 와 DT(시간) 별로 조회하는 쿼리 엿습니다.

이때 대조군인 보통의 테이블은 테이블의 크기가 증가할 수록 커리의 반응 속도가
증가하고 있으나 심험군은 반응속도가 1ms 로 테이블의 증가와 상관 없어 보이고
있습니다.

이때 각각 대조군에서 사용한 테이블과 쿼리는 아래와 같습니다.

img3.gif

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 를 유도하기 위하여 본인선택한
방법입니다.

img4.gif

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 시의 부담으리 최소화 할 수 있는 방법은 없을지 ...

^^ 두서없이 정리된 글이라 읽어 보시는데도 많은 어려움이
있으셨을 것입니다.

잘 부탁 드리겠습니다.

 

여러분의 고견을 부탁드립니다.

이 글에 대한 댓글이 총 2건 있습니다.

고견은 전혀 아니지만..

 

현재 정보로서는 판단하기가 좀 그렇네요..

 

select query의 performance가 더 중요한지, insert query의 performance가 더 중요한지에 따라서 조금 달라질 수 있겠네요..

그리고, 하나의 테이블이라는게 매년 data 전부가 저장되는 것인가요..

 

indexed view를 만든다면, 적어도 yyyymmdd, hh, mm의 index가 필요해 지겠네요.. 10,000,000건이라면, 분당 2,300건일테고, 300M면, 건당 30bytes 정도네요.. indexed view 생성에 따라서 적어도 12bytes의 index 관리가 필요해지겠죠..

 

하나의 테이블에 전 data가 들어간다면, 그리고, select query가 table scan에 가깝지 않다면, date 칼럼을 clustered pk로 잡으시고 가셔도 좋을 듯 하네요..

 

insert 작업이 24시간 풀 가동이 아니라면, 석이님의 방법이 좋을 듯 하네요..

 

그럼..

길가는 나그네..님이 2005-12-06 14:38에 작성한 댓글입니다. Edit

기본개념..

1. 인덱스는 하나의 물리적 테이블이다.

 

병록아범님의 테스트 중에서..

1. 대조군에서 pk 및 index는 정의 되어있지 않은가?

2. 실험군에서 칼럼을 추가하였다면, 굳이 indexed view를 만들 필요가 있는가? 단순히 index만을 걸어주어도 좋을듯..

 

기본가정..

1. 일정 데이터가 축적되어 있는 상태를 가정한다.

   (몇 개월 혹은 몇 년 분의 데이터)

 

목표..

1. select 시 그룹 단위는 10분/1시간/1일/1주일을 상정한다.

2. insert 와 select의 performance를 고려한다.

 

이상은 현 상황을 가정한다고 합시다.

 

잘 아시듯, 목표 2는 상반된 것으로 select performance를 위한 index의 생성은 insert performance를 떨어뜨립니다..

 

다만, 다행인것은 현재의 data가 시계열 data로서 단조 증가 insert만이 이루어진다는 것입니다.. 이점을 십분 활용해야겠죠..

 

테스트 조건을 변경해서 테스트 해 보시길 바랍니다..

1. 데이터 건수를 일정정도 만든다.

2. id의 정확한 용도가 무엇인지 모르겠지만, id를 제외시킨다.

  즉, id별로 테이블을 별도 구성한다. (가능할지 모르겠네요.. ^^;;)

  id 값이 10000246 인 것을 보면 불가능할 듯.. ^^*

  불가능하면, 그냥 그대로 가야겠죠..

 

변경 테스트 안..

1. 대조군의 설정

   - dt(id, dt)를 clustered pk로 설정한다.. pk 설정이 불가능하다면, 이 테스트안의 대조군은 제외시키세요..

2. 실험군 A의 설정

   - ymdh, tsts에 index를 설정한다.

3. 실험군 B의 설정

   - 최초 실험군과 동일 설정한다. (indexed view)

 

대조군의 설정은 dt만을 pk(index)로 가져감으로써 index의 수를 최소한으로 유지하는 것입니다.. id를 제외시킴으로써 index의 활용을 극대화 시킵니다.. id가 있으면, 재배열이 일어나게 되겠죠..

where 조건에서 index seek를 통하여, 일정 수의 data를 걸러낼 수 있다면, 대조군의 목표를 달성하는 것이겠죠.. 일정 수의 data 내에서의 조작에 따른 성능비용은 감당해야 합니다..

다만, insert에 대한 성능은 현재와 동일하게 유지될 것으로 예상됩니다..

 

실험군 A의 설정..

index를 유지하기 위한 cost가 발생합니다만, 단조증가 시계열 data로서 index 재배열을 위한 처리는 없겠죠..

 

 

위 내용은 단순히 제 생각만을 나타낸 것으로 테스트 결과가 어떻게 나올지는 저도 모르겠네여..

 

병록아범님의 건투를 빕니다..

그럼..

길가는 나그네..님이 2005-12-07 15:35에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
2533access질문 입니다. select [2]
이재기
2005-12-06
3080
2532파라미터가 있는 Stored Procecdure
김정이
2005-12-06
2051
2531multiple table delete [4]
진석
2005-12-06
2273
2530[조언요청]Indexed View 도입에 관한... [2]
병록아범
2005-12-05
3660
2529일반 네트워크 오류
김지은
2005-12-05
2423
2528출력결과 합치는 방법좀... [3]
강근식
2005-12-05
2197
2527이런 문제는 어떻게 해결해야하나요? [1]
고영훈
2005-12-02
1781
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.021초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다