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 3733 게시물 읽기
No. 3733
select 문에서 function 사용시 속도가 너무 느립니다.
작성자
궁금이
작성일
2007-09-05 11:37
조회수
4,455

안녕하세요. select 문에서 function 사용시 속도가 너무 느립니다.

일반적으로 code 명 가져 오는 함수를 만들어서 사용하는데

아래 query 를 보시면 function 사용시에는 17초 정도 걸리고

function 을 subquery 로 바꾸면 1초만에 나옵니다.

mssql2000 을 사용하고 있으며 고수님들의 도움 부탁드립니다.


아래 query 실행시 17 초 소요. getcodetext2(), getaddrattr() 함수가 있음.

select

 isnull(u.DEL_FLAG,'N') AS del_flag,

 u.COMPANY_CODE AS COMPANY_CODE,

 (case when (u.USER_TYPE = 'S') then a.SELLER_NAME_LOC else c.COMPANY_NAME_LOC end) AS COMPANY_NAME,

 u.USER_TYPE AS USER_TYPE,

 (case when (u.USER_TYPE = 'S') then getcodetext2('M103',u.USER_TYPE) else c.COMPANY_NAME_LOC end) AS TEXT_USER_TYPE,

 u.WORK_TYPE AS WORK_TYPE,

 getcodetext2('M104',u.WORK_TYPE) AS TEXT_WORK_TYPE,

 u.USER_NAME_LOC AS USER_NAME_LOC,

 u.USER_ID AS USER_ID,

 (case when (CNV_NULL(u.USER_TYPE,'NULL') = 'S') then getcodetext2('M106',u.POSITION) else getcodetext2('M106',u.POSITION) end) AS POSITION,

 (case when (u.USER_TYPE = 'S') then getcodetext2('M107',u.MANAGER_POSITION) else getcodetext2('M107',u.MANAGER_POSITION) end) AS MANAGER_POSITION,

 u.DEPT AS DEPT,

 (case when (u.USER_TYPE in ('S','P')) then getcodetext2('M105',u.DEPT) else d.DEPT_NAME_LOC end) AS DEPT_NAME,

 getaddrattr(u.USER_ID,'3','PHONE_NO1') AS PHONE_NO,

 u.MENU_PROFILE_CODE AS MENU_PROFILE_CODE,

 u.SIGN_STATUS AS SIGN_STATUS,

 (select max(smupd.MENU_NAME) AS max(smupd.MENU_NAME) from smupd where (smupd.MENU_PROFILE_CODE = u.MENU_PROFILE_CODE)) AS MENU_NAME

 from (((susmt u left join ssugl a on((u.COMPANY_CODE = a.SELLER_CODE)))

 left join scmgl c on((u.COMPANY_CODE = c.COMPANY_CODE)))

 left join sdept d on(((u.COMPANY_CODE = d.COMPANY_CODE) and (u.DEPT = d.DEPT)))) where (isnull(u.DEL_FLAG,'N') = 'N')


이것을 아래와 같이 subquery 로 수정했을 경우 1초 걸림.

select

 isnull(u.DEL_FLAG,'N') AS del_flag,

 u.COMPANY_CODE AS COMPANY_CODE,

 (case when (u.USER_TYPE = 'S') then a.SELLER_NAME_LOC else c.COMPANY_NAME_LOC end) AS COMPANY_NAME,

 u.USER_TYPE AS USER_TYPE,

 (case when (u.USER_TYPE = 'S') then

            (SELECT text2

             FROM scode

             WHERE type = 'M103'

            and code = u.user_type

            AND ISNULL(del_flag, 'N') = 'N')

          else c.COMPANY_NAME_LOC end) AS TEXT_USER_TYPE,

 u.WORK_TYPE AS WORK_TYPE,

    (SELECT text2

     FROM scode

     WHERE type = 'M104'

    and code = u.WORK_TYPE

       AND ISNULL(del_flag, 'N') = 'N') AS TEXT_WORK_TYPE,

 u.USER_NAME_LOC AS USER_NAME_LOC,

 u.USER_ID AS USER_ID,

 (case when (dbo.CNV_NULL(u.USER_TYPE,'NULL') = 'S') then

            (SELECT text2

             FROM scode

             WHERE type = 'M106'

            and code = u.POSITION

            AND ISNULL(del_flag, 'N') = 'N')

     else

            (SELECT text2

             FROM scode

             WHERE type = 'M106'

            and code = u.POSITION

            AND ISNULL(del_flag, 'N') = 'N')

     end) AS POSITION,

 (case when (u.USER_TYPE = 'S') then

             (SELECT text2

             FROM scode

             WHERE type = 'M107'

            and code = u.MANAGER_POSITION

            AND ISNULL(del_flag, 'N') = 'N')

     else

             (SELECT text2

             FROM scode

             WHERE type = 'M107'

            and code = u.MANAGER_POSITION

            AND ISNULL(del_flag, 'N') = 'N')

        end) AS MANAGER_POSITION,

 u.DEPT AS DEPT,

 (case when (u.USER_TYPE in ('S','P')) then

             (SELECT text2

             FROM scode

             WHERE type = 'M105'

            and code = u.DEPT

            AND ISNULL(del_flag, 'N') = 'N')

     else d.DEPT_NAME_LOC end) AS DEPT_NAME,

    (select phone_no1 from saddr where code_type = '3' and code_no = u.user_id) AS PHONE_NO,

 u.MENU_PROFILE_CODE AS MENU_PROFILE_CODE,

 u.SIGN_STATUS AS SIGN_STATUS

 from susmt u left join ssugl a on u.COMPANY_CODE = a.SELLER_CODE

 left join scmgl c on u.COMPANY_CODE = c.COMPANY_CODE

 left join sdept d on u.COMPANY_CODE = d.COMPANY_CODE and u.DEPT = d.DEPT

    where (isnull(u.DEL_FLAG,'N') = 'N')

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

원래함수 사용하면 늦어요..

튜닝해도 안되요..

원래 함수사용하면 늦어용~~~

박통통님이 2007-09-05 11:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
3736db connecting 이 실행 중 끊어집니다. ㅠ;;
이덕희
2007-09-07
2196
3735쿼리좀 질문좀 드리겠습니다.요~~~ [4]
박통통
2007-09-06
3645
3734쿼리 분석기(2000)에서 T-SQL 디버거 사용할 때 트레이스 기능이 먹히질 않아요.
임정택
2007-09-05
2621
3733select 문에서 function 사용시 속도가 너무 느립니다. [1]
궁금이
2007-09-05
4455
3732MS-SQL 외부에서 접속이... [1]
윤종민
2007-09-04
2658
3731『 국내최초 MySQL User Conference Korea - 2007에 귀하를 초대합니다.』
정영도
2007-09-04
2065
3729조인쿼리 후 쿼리 결과 바로 수정할 수 없나요?
you
2007-09-03
2936
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다