초보 질문 드립니다. View 생성 도움 부탁드립니다. View? Materialized View? 0 8 1,469

by 주성우 [2008.05.21 12:27:02]


Oracle 초보 질문 드립니다. 현업은 Application 개발자인데 어떻게 하다보니 Oracle 테이블도 만져야 하는 상황입니다. ㅜㅜ

원본 테이블에서 조회가 점점 느려져서 1년치 정도의 데이터(500만건 정도)를 View로 생성하면 조회 속도를 빠르게 할 수 있지 않을까 해서 View를 만들어 보려 합니다.

CREATE OR REPLACE VIEW MSRDATA_VW
AS
SELECT * FROM MSRDATA_TB
WHERE MSR_DATE BETWEEN (SELECT TO_CHAR(SYSDATE - 365,  'YYYYMMDD') || '000000' FROM DUAL)
AND (SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') FROM DUAL)
ORDER BY MSR_DATE, SITE_ID;

이와 같이 View를 만들었는데 실제로 별로 빨라진 것을 느끼지 못하기에 도움을 요청합니다.

원본 테이블명은 MSRDATA_TB 입니다. 이 테이블에는 50여개 지점에서 수집되는 데이터가 5분에 1회씩 데이터가 저장됩니다. 각 지점이 SITE_ID가 되고 측정시각이 MSR_DATE가 됩니다. 이 시각은 매 5분 정각 시각으로 되어있고 14자리 문자열(YYYYMMDDHH24MISS)로 Varchar2 포멧으로 되어있습니다. 여기에는 아래와 같은 인덱스가 만들어져 있습니다.


CREATE UNIQUE INDEX MSRDATA_PK ON MSRDATA_TB
(SITE_ID, MSR_DATE)
LOGGING
TABLESPACE TMS_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            MINEXTENTS       1
            MAXEXTENTS       2147483645
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
NOPARALLEL;

그런데 View를 생성하고 이 테이블에서 1개월치 데이터를 조회하니 별로 속도가 빨라지는 것을 느끼기 어렵습니다.

제가 View를 잘 못 생성한 것인지요?

또한 자료를 찾아보니 Materialized View라는 것이 속도가 빨라지는 것을 느낄수 있다고 하는데 어떻게 만드는 것인지요?

도움 부탁드립니다. 그리고 View에도 Index를 생성할 수 있는지도 가르쳐 주시면 감사하겠습니다.

점심 맛있게 드시고 좋은 하루 보내십시오.

by 현 [2008.05.21 12:45:15]
직접 작성해 보셔서 아시겠지만,
뷰는 sql을 오브젝트로 만들어 놓은 것입니다. 실제 물리적인 공간을 차지하지 않는단 얘기죠.
따라서, sql을 날리나 뷰를 실행하나 속도에는 차이가 없습니다.
MVIEW 가 속도향상에는 기여할 수 있겠으나 관리해야 할 것들이 많아서 님같은 경우엔 비추이구요...
인덱스는 뷰에다 대고 만드는 것이 아니라 테이블에다 만드는 것이기 때문에 뷰에 인덱스를 햇성할 수 있느냐는 질문은 성립하질 않겠네요...

현단계에서는 그 쿼리를 튜닝하시는 것이 최선의 방법이라 생각됩니다.

by 된장 [2008.05.21 13:03:24]
VIEW을 만들어 놓고..사용하면
응용프로그램 상에 QUERY만 단순해질 것 같은데요..
그리구..실제 db를 숨겨놓는 기능도 될 것 같구요...

by 된장 [2008.05.21 13:11:13]
그런데 저기 왜 듀얼 테이블 넣었나요..
그거라도 빼면 나을까낭..
걍 이렇게만 해도 검색이 될텐데요..
==>TO_CHAR(SYSDATE - 365, 'YYYYMMDD') || '000000'

by 삼치 [2008.05.21 13:11:37]
일반VIEW로는 쿼리속도가 전혀 향상되지 않습니다.
만약 Materialized View로 생성한다면 0.1초안에 결과가 나옵니다.

하지만 Materialized View는 생성당시의 데이타를 계속 보여줍니다. 변경된 데이타는 적용이 안됩니다. 계속 변경된 테이타의 조회를 원하신다면 절대 사용 하시면 안됩니다. 테이블과 업무의 특성에 따라 사용하시면 될것 같습니다.
그리고 Materialized View는 INDEX 생성 가능합니다. MV에서 다시 조회조건을 넣고 조회한다면 좋은 성능을 가져다 줍니다.

그리고 현님의 말씀처럼 쿼리를 튜닝하시는 것이 최선의 방법이라 생각됩니다.

by 주성우 [2008.05.21 13:25:13]
답변 감사드립니다. 그런데, Materialized View는 데이터의 갱신이 되지 않는 것인가요?

by 마농 [2008.05.21 13:28:35]
뷰에 정렬이 들어있네요.
이경우 뷰를 조회할때 site_id 조건을 주더라도 인덱스를 타지 못합니다.
뷰 자체에서도 인덱스 선행컬럼인 site_id가 조건에 없으므로 인덱스를 타지 않습니다.
그냥 차라리 테이블을 조회하시면서 site_id와 msr_date조건만 주시면 인덱스를 타리라 생각되구요.
한달치면 30일*24시간*60분/5분 = 8640건밖에 안되네요.
별로 느릴것 같지 않은데요.

by 된장 [2008.05.21 13:43:44]
CREATE MATERIALIZED VIEW [schema.]materialized_view
[OF [schema.]object_type]
[(scoped_table_ref_constraint)]
ON PREBUILT TABLE [{WITH | WITHOUT} REDUCED PRECISION]
| physical_properties materialized_view_props
[USING INDEX
[physical_attributes_clause | TABLESPACE tablespace]
[physical_attributes_clause | TABLESPACE tablespace]...
]
| USING NO INDEX
[create_mv_refresh]
[FOR UPDATE] [{DISABLE | ENABLE} QUERY REWRITE] AS subquery;

for update 구문이 있는 것으로 봐서 갱신이 안되는 것은 아닐 것 같은데
저장공간이 있다는 말은 기본 테이블이 변경될때 View에 있는 쿼리로
새롭게 저장하기 때문에 DML시 비용이 더 나올 것 같은데욤..

by 주성우 [2008.05.22 09:32:16]
답변 감사드립니다.
도전정신을 가지구 함 더 연구해 봐야겠네요...^^;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입