2011-02-17 78 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,數量)的指數。