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
운영게시판
최근게시물
Sybase Q&A 1803 게시물 읽기
No. 1803
뷰생성시 where절에 년도받아오는 함수를 적용했는데 속도가 너무 느리네요
작성자
장일영
작성일
2007-01-18 09:53
조회수
6,084

뷰가 한 100여개를 생성했습니다. 근데 조건절에 들어가는 년도를 나중에 수정해야 할일이 생긴다고 하더군요
그래서 생각한 방안이 3가지입니다.

평가년도(기준년도입니다.) 반환하는 함수를 생성해 조건절에 삽입하는 겁니다. 그럼 함수 하나만 고치면 모든 뷰에 적용이 되겠죠
두번째는 테이블을 만들어서 서브쿼리 혹은 조인해서 조건절에 삽입하는 겁니다. 물론 프로시져를 하나 만들어서 해당 년도를 집어넣으면
원하는데로 정보가 바뀌게 해놨고. 한 로우만 삽입되어 있습니다.
세번재는 프로그램을 작성해서 스크립트를 자동 생성해서 새로 뷰들을 만드는 거죠 ㅡ.ㅡ;;

세개중에 가장 깔끔한게 첫번째 함수를 이용하는 것이어서 추진했는데
10분정도 걸리던 수행속도가 1시간이 넘어가도록 결과가 나타나지를 않는 겁니다. 수동정지하면 sql어드밴티지나 sql클래식이 죽어버리더군요.
그래서 인덱스 문제인가? 싶은데 제가 실력이부족해서 잘 모르겠더군요.

그래서 결국 두번째 방안으로 하니 제속도가 나오더군요. 

아무래도 함수때문에 속도가 안 나오는 거 같은데 제가 알고 있는 지식안에서나 고참들에게 문의를 해도 그게 말이 되냐? 왜 안 되냐? 이유를 
모르겠더라고요.


일단 함수는 아래와 같습니다.

drop function getBscYear;

create function getBscYear() returns char(4)
 -- 평가년도 지정; 이함수만 고치면 모든 뷰에 적용이 됨; 년도를 변경하실땐 data_out변수에 하드코딩하시면 됩니다.
 BEGIN
 DECLARE data_out char(4);

SET data_out =   substring(convert(varchar,dateadd(mm,-1,getdate()),112),0,4); --기본적으로 전달의 년도를 평가년도로 지정
  --SET data_out =   '2006'; -- 수동 지정할 시 이렇게 변경하시면 됩니다.

RETURN data_out;                                                                       
END;                                                                            


뷰는 아래와 같구요

DROP VIEW BSC_G02_M02_X04
GO


CREATE VIEW BSC_G02_M02_X04 AS

SELECT
  SUBSTRING(B.APPVL_DATE,1,6) AS YM,
  A.MNG_BO_CD AS DEPTCD,
  max(C.DEPTNAME) AS DEPTNAME,
  COUNT(A.RECP_NMBR)  JUNCHE_CNT,
         COUNT(CASE WHEN PROC_DDAY_DATE >= B.APPVL_DATE THEN A.RECP_NMBR END)  GIHANAE_CNT,
  GETDATE() AS INP_DATE
  FROM   DAM_통합민원서류 A,
         DAM_통합결재완료 B,
  KLWC_DW_DEPTCODE C 
  WHERE  A.RECP_NMBR   = B.RECP_NMBR
    AND  SUBSTRING(A.RECP_NMBR,0,4) = C.NO_CD 
    AND  A.RECP_DATE  >= getBscYear() || '0101'                      -->>접수일자
    AND  A.RECP_DATE  <= getBscYear() || substring(convert(varchar,dateadd(dd,-1,getBscYear() ||substring(convert(varchar,getdate(),112),5,2)||'01' ),112),5,8)                                  -->>접수일자
    AND  B.APPVL_STAT  = '3'                                        -->>결재구분
    AND  B.APPVL_DATE <= getBscYear() || substring(convert(varchar,dateadd(dd,-1,getBscYear() ||substring(convert(varchar,getdate(),112),5,2)||'01' ),112),5,8)                                  -->>결재일자
    AND  ISNULL(A.SRC_DEL_YN,'')   <> 'Y'                           -->>DELETE 구분
    AND  A.RECP_NMBR   NOT LIKE '________[5-8]%'                    -->>접수번호(민원처리건만)
    AND  A.RECP_STAT   IN ('3','4')                                 -->>접수상태
    AND  A.CVAP_DOC_CD LIKE '[3,4,6,7]%'                            -->>민원서류(보상코드건만)
    AND  A.TABL_NM    <> 'CAZ100MT'                                 -->>일부기타건이 CAZ100MT로 들어감(제외)
    AND  A.DEL_YN     <> 'Y'
    AND  B.APPVL_LDGR_SEQNO = 0                                     -->> 2007. 1. 5. Lee. H. S (최종결재회차)
GROUP BY A.MNG_BO_CD, SUBSTRING(B.APPVL_DATE,1,6)


도대체 이유가 뭘까요?


그리고 많은 뷰들의 조건절을 한번에 바꾸게 하는 방안이 있을까요? 반드시 뷰여야 합니다. 프로시져나 템프테이블을 이용하는건 안 됩니다.

고수님들의 많은 관심과 답변 부탁드리겠습니다.

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

아 사용하는 디비는 sybase IQ 12 입니다.

장일영님이 2007-01-18 09:55에 작성한 댓글입니다.
이 댓글은 2007-01-18 18:30에 마지막으로 수정되었습니다. Edit

저도얼마전에 저런 황당한 경우를 당했습니다.... 얼마나 속 앓이를 했었는지...쩝.

주민번호 오류 채크 함수를 만들어서 쿼리를 수행하면 ....

깜깜 무소식....

돌겠더군여...

해서 여쭤봤져... 사이베이스 다니시는 분에게......

사이베이스는 IQ와 ASE 영역으로 나눠있다고 합니다.

IQ에서 함수를 사용하면.. 모든 데이터를 IQ영역에서 ASE 영역으로 옮겨서.. ASE영역에서 함수 적용

해서 쿼리를 수행한 후에 다시.. IQ영역으로 데이터를 넘겨준다고 합니다.

함수 왠만하면 만들어서 사용하지 말랍니다...ㅠㅠ

건수가 많은 쿼리를 하면... 환장을 하는 이유가 여기 있었습니다.

lsh님이 2007-01-19 22:48에 작성한 댓글입니다.
이 댓글은 2007-01-19 22:48에 마지막으로 수정되었습니다. Edit

좋은 정보 감사합니다.



--허허 나쁜(?) 디비같으니라고 ㅡ.ㅡ;;; 


   좀 당황스럽네요;

장일영님이 2007-01-22 09:23에 작성한 댓글입니다. Edit

lsh님이 답변하신 내용중에 몇가지 오류가 있어서 정정해 드립니다

SYBASE사에서 제공하는 DBMS는 크게 ASA, ASE, SYBASE IQ입니다

그래서 답변 내용중에 "사이베이스는 IQ와 ASE 영역으로 나눠있다고 합니다" 의 내용을 바로 잡아야 하는데 "사이베이스는 --> SYBASE IQ" 으로, " ASE 영역 --> ASA 영역"으로 바꿔야 합니다. 이하 ASE라는 용어는 ASA로 바꿔야 합니다.

세지아빠(sejiappa)님이 2007-01-30 15:46에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1806ddlgen 사용시 [1]
이은영
2007-01-24
5643
1805ASE에서 텍스트파일 LOAD할 수 있나요? [1]
남궁헌
2007-01-22
4796
1804Sybase Adaptive Server Anywhere 실행시 Error
초보자
2007-01-19
5372
1803뷰생성시 where절에 년도받아오는 함수를 적용했는데 속도가 너무 느리네요 [4]
장일영
2007-01-18
6084
1802소수점 자리수관련 [1]
궁금이
2007-01-16
5606
1801java class 등록 방법 ? [1]
김정수
2007-01-16
4414
1800db실행에러......
초보자
2007-01-16
4511
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다