2013-07-25 5 views
2

Таблицы доставки имеют 1731791+ строк. столбец homedl, имеющий 0,1, значения NULL.NVL() ухудшает характеристики

Я хочу, чтобы принести записи, когда homedl столбец не равен 1.

Какой запрос даст лучшую производительность здесь

select homedl 
    from delivery 
where item_id='1343275' 
    AND NVL(homedl,0) <> 1 
    and item_type=0; 

ИЛИ

select homedl 
    from delivery 
where item_id='1343275' 
    AND (homedl<>1 or homedl is null) 
    and item_type=0; 
+1

Просто проверьте план выполнения, может быть? –

+3

Вы пытались запустить оба и посмотреть на производительность и объяснить планы? Если у вас есть указатель на item_id, это должно быть неуместным. –

+1

Разнообразны ли планы запросов? Я ожидал бы, что эти два запроса будут давать идентичные планы и, таким образом, выполнить тождественно. Если на 'homedl' есть индекс, либо использование функции, либо поиск значений« NULL », вероятно, предотвратят использование индекса. Если вы заявляете, что получаете плохую производительность, я бы предположил, что добавление «NVL» предотвращает использование индекса, который можно устранить, создав индекс на основе функций. –

ответ

1

первым, давайте посмотрим на данных, сколько записей доставки имеют homedl = 1 или homedl = 0 или homedl равно нулю:

select homedl , count(*) 
    from delivery 
group by homedl 

если количество нулей и НУЛИ значительно меньше, чем кол единичек, то вы должны создать индекс на основе функции, которая будет использоваться для этого запроса:

create index user2582602_idx on delivery (NVL(homedl,0)); 

, а затем выбрать, как это:

select homedl 
    from delivery 
where item_id='1343275' 
    AND NVL(homedl,0) = 0 
    and item_type=0; 
+0

Спасибо. выше логики сейчас живут ... Я не вижу существенной разницы во времени после добавления этих условий. – spyga

0

Ответ на ваш вопрос зависит от многих факторов, например Поставщик РСУБД, какой тип индекса, если таковой имеется, присутствует на столбце homedl. Я полагаю, что item_id и item_type уже проиндексированы соответствующим образом.

Вы могли бы лучше использовать следующий запрос:

выберите homedl от поставки, где ITEM_ID = '1343275' И coalesce(homedl, 2)<>1 и item_type = 0;

Если item_id является первичным ключом, то время выполнения запроса будет не имеет значения для различных запросов, вы упомянули, потому что explain [sql query] покажет вам, что ключ используется PRIMARY.

+0

Это зависит от поставщика RDBMS, так как реализация побитового индекса может различаться для разных поставщиков или, что еще хуже, может быть недоступна вообще. – RRM

Смежные вопросы