我有一個查詢從表中查找某些客戶。將SELECT COUNT優化爲EXTERNTS
SELECT COUNT(*)
FROM CUSTOMER
WHERE amount <> 0
AND customerid = 22
有CustomerID上的索引,所以DB掃描與客戶ID的所有行= 22
由於結果是通過檢查計數是否返回零或大於零進行處理,如何優化查詢?即使得在第一客戶行與量<> 0的查詢返回0,否則,如果所有的行是= 0,則返回上CustomerID和量1.
我有一個查詢從表中查找某些客戶。將SELECT COUNT優化爲EXTERNTS
SELECT COUNT(*)
FROM CUSTOMER
WHERE amount <> 0
AND customerid = 22
有CustomerID上的索引,所以DB掃描與客戶ID的所有行= 22
由於結果是通過檢查計數是否返回零或大於零進行處理,如何優化查詢?即使得在第一客戶行與量<> 0的查詢返回0,否則,如果所有的行是= 0,則返回上CustomerID和量1.
select case
when exists (select *
from customer
where amount <> 0
and customerid = 22) then 1
else 0
end as non_zero_exists
使用查詢表單而不是IF使用+1 – RichardTheKiwi 2011-02-17 18:15:28
首先索引
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上進行索引查找。否則,您需要掃描該客戶的所有行(您的問題似乎暗示可能會很多)。
似乎直線前進足夠
IF EXISTS (SELECT customerid
FROM customer
WHERE amount <> 0
and customerid = 22))
SELECT 1
ELSE
SELECT 0
的替代EXISTS
select ISNULL((select TOP 1 1
from customer
where amount <> 0
and customerid = 22),0)
我已經假定你將有(客戶ID)或更高(客戶ID,數量)的指數。
相關:http://stackoverflow.com/questions/2759756/is-it-possible-to-select-exists-directly-as-a-bit – RQDQ 2011-02-17 16:16:00
第一個客戶行基於什麼 - 日期? – 2011-02-17 16:30:02