我有一个查询从表中查找某些客户。将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