Оптимизация SELECT COUNT для EXISTS - PullRequest
22 голосов
/ 17 февраля 2011

У меня есть запрос, чтобы найти определенных клиентов из таблицы.

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

Существует индекс для customerid, поэтому БД сканирует все строки с customerid = 22.

Посколькурезультат обрабатывается путем проверки, возвращает ли счет ноль или больше нуля, как я могу оптимизировать запрос?Т.е. так, что при первой строке клиента с количеством <> 0 запрос возвращает 0, иначе, если все строки = 0, то возвращается 1.

Ответы [ 4 ]

29 голосов
/ 17 февраля 2011
select case
         when exists (select *
                      from   customer
                      where  amount <> 0
                             and customerid = 22) then 1
         else 0
       end  as non_zero_exists
6 голосов
/ 17 февраля 2011

Первый индекс для customerid и сумма

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 голосов
/ 17 февраля 2011

Кажется, достаточно прямо

IF EXISTS ( SELECT customerid
            FROM   customer
            WHERE  amount <> 0
                  and customerid = 22))
   SELECT 1
ELSE
   SELECT 0
2 голосов
/ 17 февраля 2011

Альтернатива EXISTS

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

Я уже предполагал, что у вас будет индекс (customerid) или лучше (customerid, сумма).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...