优化SELECT COUNT到EXISTS

Car*_*ngo 22 sql t-sql sql-server

我有查询从表中查找某些客户.

SELECT COUNT(*)
  FROM CUSTOMER
 WHERE amount <> 0
   AND customerid = 22
Run Code Online (Sandbox Code Playgroud)

customerid上有一个索引,因此DB会扫描customerid = 22的所有行.

由于通过检查计数是返回零还是大于零来处理结果,我该如何优化查询?也就是说,在第一个客户行,金额<> 0,如果所有行都是= 0,则查询返回0,然后返回1.

Mar*_*ith 29

select case
         when exists (select *
                      from   customer
                      where  amount <> 0
                             and customerid = 22) then 1
         else 0
       end  as non_zero_exists
Run Code Online (Sandbox Code Playgroud)

  • @Carlo - 不,不会 (4认同)
  • 将'select*'替换为'select customerid'或者'select 1'会更有效吗? (3认同)

Chr*_*ain 6

关于customerid和金额的第一个索引

CREATE INDEX customer_idx ON customer(customerid, amount); 
Run Code Online (Sandbox Code Playgroud)

然后将您的查询重写为

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
Run Code Online (Sandbox Code Playgroud)

这应该导致在customer_idx上寻找索引.否则,您需要扫描该客户的所有行(您的问题似乎意味着可能很多).

  • 尽管索引位很好,但@Chris会产生"关键字附近的语法不正确" (2认同)