2011-02-17 70 views
20

我有一个查询从表中查找某些客户。将SELECT COUNT优化为EXTERNTS

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

有CustomerID上的索引,所以DB扫描与客户ID的所有行= 22

由于结果是通过检查计数是否返回零或大于零进行处理,如何优化查询?即使得在第一客户行与量<> 0的查询返回0,否则,如果所有的行是= 0,则返回上CustomerID和量1.

+0

相关:http://stackoverflow.com/questions/2759756/is-it-possible-to-select-exists-directly-as-a-bit – RQDQ 2011-02-17 16:16:00

+0

第一个客户行基于什么 - 日期? – 2011-02-17 16:30:02

回答

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使用+1 – RichardTheKiwi 2011-02-17 18:15:28

6

首先索引

CREATE INDEX customer_idx ON customer(customerid, amount); 

然后重写您的查询为

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上进行索引查找。否则,您需要扫描该客户的所有行(您的问题似乎暗示可能会很多)。

3

似乎直线前进足够

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

的替代EXISTS

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

我已经假定你将有(客户ID)或更高(客户ID,数量)的指数。