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 4366 게시물 읽기
No. 4366
음 여쭤볼께 있는데요~ 쿼리 효율이 너무 떨어지는거 같아서요.
작성자
최승위(unf333)
작성일
2008-07-30 08:57ⓒ
2008-07-30 14:56ⓜ
조회수
5,658


예제 테이블)


 담당자  |  고객   |   주민번호         |  email                     | 핸드폰
  김씨    | 홍길동 |  123456-123456   |  abc@naver.com     | 010-9009-XXXX      
  김씨    | 임창정 |  345678-234567   |  def@naver.com      |
  이씨    | 이관우 |  342134-123123   |                              |
  김씨    |홍길동  |  123234-123424   |  abc@naver.com     | 010-9009-XXXX

------------------------------------------------------------------------

이런테이블에서 각 담당자별로 이메일이 있는사람 고객 카운트와
핸드폰 번호 고객 카운트를 다음과 같이 쿼리를 날렸습니다.

SELECT count(distinct email), 담당자 From 예제테이블 
WHERE email <> ''
GROUP BY 담당자 


SELECT count(distinct 핸드폰), 담당자 From 예제테이블 
WHERE 핸드폰 <> ''
GROUP BY 담당자 

이렇게 쿼리를 두번때리는데 이쿼리 효율이 상당히 떨어지는거 같아서 질문드립니다.


------------------------------------------------------------------------------------------------------>>>>

답변감사합니다.

음.. 제가 지금 고민되는것을 알아냈는데.. ditinct를 대체 해야됀다는거죠..

distinct가 장난아니게 시간을 잡아먹어서요.. 그거 빼니까 1~2초 그거 끼면 6~8초 정도 걸리네요..

distinct를 대체 할 수 있는게 있을까요?












이 글에 대한 댓글이 총 4건 있습니다.
select
담당자,
sum(case when email<>'' and email is not null then 1 else 0 end ),
 sum(case when 핸드폰<>'' and 핸드폰 is not null then 1 else 0 end )
from 예제테이블
group by 담당자


음 맞나모르겟네염..
임진표(운가라)님이 2008-07-30 10:35에 작성한 댓글입니다.

2번 한다고 효율이 떨어질거라 생각은 들지 않습니다.


정 뭐하시면

SELECT count(distinct email), 담당자 From 예제테이블 

WHERE email <> ''

GROUP BY 담당자 

UNION ALL

SELECT count(distinct 핸드폰), 담당자 From 예제테이블 

WHERE 핸드폰 <> ''

GROUP BY 담당자 



union all로 묶어주시기 바랍니다.

 

김병석(byung82)님이 2008-07-30 11:10에 작성한 댓글입니다.
질문자 분이 아래 두가지 컨셉 중 성능비교를 하여 결정해야 하겠습니다.

1. 일반적인 상황 
<> '' 조건은 인덱스 scan과는 무관한 조건이므로 table full scan을 하게 됩니다.
두 번으로 나눠서 작업하면 테이블을 두 번이나 full scan하는 것이지요.
보통은 임진표님의 컨셉대로 한번만 access하여 구하는 것이 바람직합니다.
임진표님의 쿼리에서 SUM()으로 쓰신 부분을 
COUNT(DISTINCT CASE WHEN email <> '' THEN email END)
COUNT(DISTINCT CASE WHEN 핸드폰 <> '' THEN 핸드폰 END) 
처럼 바꾸면 될 겁니다.

2. distinct 처리로 줄어드는 row수가 현저히 많을 경우 아래와 같이 나누어 쿼리하는 것이 유리할 수도 있습니다.
컨셉은 어차피 Group By가 있으니 별도의 Distinct로 처리하는 불필요한 sort 과정을 줄이는 것입니다.
SELECT 담당자
     , COUNT(CASE WHEN 구분 = 'email' THEN 1 END) AS email수
     , COUNT(CASE WHEN 구분 = '핸폰' THEN 1 END) AS 핸폰수
FROM(
    SELECT 담당자, 'email' AS 구분, email
    FROM table
    WHERE email <> ''
    GROUP BY 담당자, email
    UNION ALL
    SELECT 담당자, '핸폰' AS 구분, 핸드폰
    FROM table
    WHERE 핸드폰 <> ''
    GROUP BY 담당자, 핸드폰
    ) A
GROUP BY 담당자
성시현(finecomp)님이 2008-07-30 15:53에 작성한 댓글입니다.

답변 정말 감사합니다.

큰도움 됐습니다.^^

최승위님이 2008-07-30 16:49에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4370특정테이블에 조회(select)한 로그를 남기고 싶어요. [1]
Kaien
2008-07-31
4814
4368테이블 최정 업데이트,인서트 시간을 알수있을까요?
우짜라
2008-07-30
5063
4367기본키 때문에 팀장님이랑 의견충돌중. 헬프요.. [6]
김재훈
2008-07-30
6324
4366음 여쭤볼께 있는데요~ 쿼리 효율이 너무 떨어지는거 같아서요. [4]
최승위
2008-07-30
5658
4365데이터베이스 생성시 오류에 대해 문의 드려요.
배우미
2008-07-29
5506
4364문자열을 날짜로 변환후 오늘날짜에서 빼기.... [2]
초보
2008-07-29
5824
4363vista에서.. Mssql2000 연결시.. [2]
송경훈
2008-07-29
4799
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다