Можно ли оптимизировать этот запрос? - PullRequest
2 голосов
/ 20 мая 2011
 ColumnA   ColumnB
    1         0
    2         0
    2         1
    2         2
    3         0
    3         0

Можно ли оптимизировать этот запрос ниже?

SELECT DISTINCT ColumnA 
  FROM TABLE 
 WHERE ColumnA NOT IN (SELECT ColumnA 
                         FROM TABLE
                        WHERE ColumnB = 2)
   AND ColumnB = 0

Это должно вернуть 1 и 3.

Я хочу выбрать различные значения из ColumnA, но только если в ColumnB есть значение, равное 0 ... и в ColumnB нет значения, равного 2. Есть ли более оптимальный способ переписать это?

Ответы [ 5 ]

3 голосов
/ 21 мая 2011

Вы можете попробовать это:

SELECT DISTINCT a.ColumnA 
  FROM TABLE a 
 WHERE a.CoulumnB = 0 
   AND NOT EXISTS (SELECT NULL 
                     FROM TABLE b 
                    WHERE b.ColumnA = a.ColumnA 
                      AND b.ColumnB = 2)
1 голос
/ 21 мая 2011

Наличие not in может ухудшить производительность. Вместо этого вы можете попробовать сгруппировать и посчитать количество нулей и двойок в каждой группе:

select
  ColumnA,
  sum(case ColumnB when 0 then 1 else 0 end) as Zeroes,
  sum(case ColumnB when 2 then 1 else 0 end) as Twos
from TABLE
group by ColumnA
having Zeroes > 0 and Twos = 0

Я не уверен, что это более эффективно без проверки планов выполнения, но, поскольку это более просто, вполне может быть.

Кроме того, это синтаксис SQL Server, поэтому может потребоваться некоторая настройка для работы в Oracle.

0 голосов
/ 21 мая 2011

Это пример из реального мира? Будет ли в таблице только это очень небольшое количество строк? Если это так, то вряд ли вы сможете оптимизировать его намного дальше, таблица слишком мала. Сказав, что «не в» не очень хорошо масштабируется, лучше использовать «не существует».

0 голосов
/ 21 мая 2011

Я стараюсь по возможности избегать НЕ IN

может быть, это?

SELECT DISTINCT ColumnA FROM TABLE t
LEFT JOIN TABLE z ON t.ColumnA=z.ColumnA AND z.ColumnB=2 
WHERE t.ColumnB=0 AND z.ColumnA IS NULL
0 голосов
/ 21 мая 2011

Я бы сказал, что это почти так же хорошо, как и получается.Единственный способ ускориться - создать индексированное представление этого запроса и использовать его в качестве источника данных.

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