2011-02-17 2 views
20

테이블에서 특정 고객을 찾는 쿼리가 있습니다. CustomerID를에 인덱스가EXCOTS에 SELECT COUNT 최적화

SELECT COUNT(*) 
    FROM CUSTOMER 
WHERE amount <> 0 
    AND customerid = 22 

의 DB는 CustomerID를 모든 행을 검사되도록 = 결과가 카운트는 0 또는 0보다를 반환 여부에 의해 처리되기 때문에 22

, I 방법을 최적화 할 쿼리? 나는.

CREATE INDEX customer_idx ON customer(customerid, amount); 

다음 다시 양의 첫 번째 고객 행에 <> 0 쿼리가 모든 행 0 = 경우 0 다른 반환하도록, 다음의 CustomerID와 양에 1

+0

관련 항목 : http://stackoverflow.com/questions/2759756/is-it-possible-to-select-exists-directly-as-a-bit – RQDQ

+0

날짜를 기반으로 한 첫 번째 고객 행은 무엇입니까? –

답변

27
select case 
     when exists (select * 
         from customer 
         where amount <> 0 
          and customerid = 22) then 1 
     else 0 
     end as non_zero_exists 
+3

IF 대신에 문의 양식 사용 – RichardTheKiwi

+3

'select *'를 'select customerid'또는 'select 1'로 바꾸는 것이 더 효율적입니까? –

+3

@Carlo - 아니요. – RichardTheKiwi

6

최초의 인덱스를 돌려줍니다 쿼리 이름 :

IF EXISTS (SELECT customerid 
    FROM customer 
    WHERE amount > 0 -- I am assuming here that amount cannot be a negative number. 
    AND customerid = 22) 
    SELECT 1 
ELSE 
    SELECT 0 

이렇게하면 customer_idx에서 인덱스가 검색됩니다. 그렇지 않으면 해당 고객의 모든 행을 검색해야합니다 (질문이 많은 것으로 드러날 수 있음).

+1

+1 * 모든 * SQL 성능 질문에 대한 해결책이 무엇보다 먼저 적절한 색인을 작성하는 것입니다. –

+2

@Chris 인덱스 비트가 좋지만 '키워드 근처에 잘못된 구문이 있습니다.' –

+0

죄송합니다. SO 윈도우에서 코딩했는데 항상 잘못된 결정이었습니다. 쿼리와 비슷한 것을 사용하도록 업데이트되었습니다. 당신의 대답에 +1하십시오. –

3

똑바로 앞으로 충분히

IF EXISTS (SELECT customerid 
      FROM customer 
      WHERE amount <> 0 
        and customerid = 22)) 
    SELECT 1 
ELSE 
    SELECT 0 
2

또 다른 것 같습니다에 난 이미 당신이 (CustomerID를) 이상 (CustomerID를, 양)에 인덱스를 가질 것으로 가정

select ISNULL((select TOP 1 1 
       from customer 
       where amount <> 0 
       and customerid = 22),0) 

존재한다.