2015-01-08 3 views
0
SELECT a.id, a.stock_num, a.stock_rfrnc_num, 
     a.date, a.center, a.owner, 
     a.owner_id, a.product_typ, a.transaction_dt, 
     a.location, a.status 
    FROM a 
WHERE a.status = 'Ready' 
    AND a.owner_id != 'stockholder' 
    AND a.owner_id='stockseller' 
     AND (a.product_typ = '03' OR a.product_typ = '04'); 

типа продукта составляет от 1 до 5, owner_id имеет шесть типов, статуса имеет 5 типов, это может быть оптимизировано дальше?Как оптимизировать ниже запроса для указанного кода

+1

С помощью добавления индексов –

+0

'EXPLAIN PLAN' пожалуйста? –

ответ

0

Вы можете использовать в операторе вместо или.

AND a.product_typ in ('03','04'); 

Ниже строки не требуется.

AND a.owner_id != 'stockholder' 
0
SELECT a.id, a.stock_num, a.stock_rfrnc_num, 
     a.date, a.center, a.owner, 
     a.owner_id, a.product_typ, a.transaction_dt, 
     a.location, a.status 
    FROM a 
WHERE a.status = 'Ready' 
    AND a.owner_id='stockseller' 
     AND a.product_typ in ('03','04'); 
0

Создание составного B-Tree index с leading column как status.

create index index_name on table_name(status, owner_id, product_typ)

Примечание ведущий столбец в индексе. Вы можете создать индекс unique, если вы уверены в уникальности данных. Вышеуказанное значение создало бы индекс NORMAL, который определяется defualt NON-UNIQUE.

Ваш предикат кажется излишне сложным. Ниже не имеет смысла -

AND a.owner_id != 'stockholder' 
    AND a.owner_id='stockseller' 

Снимите не равный фильтр из сказуемого, строки будут отфильтрованы AND a.owner_id != 'stockholder'.

И проверьте explain plan запроса, если индексы используются или нет.

0

Если у вас есть указатель, Lalit Kumar предложил вам, вероятно, лучше всего использовать UNION ALL вместо OR в вашем предложении where. Если это единственный запрос, используемый в этой таблице, вы можете сделать этот индекс кластеризованным индексом. В противном случае вы можете включить все необходимые столбцы в индекс.

SELECT a.id, a.stock_num, a.stock_rfrnc_num, 
     a.date, a.center, a.owner, 
     a.owner_id, a.product_typ, a.transaction_dt, 
     a.location, a.status 
    FROM a 
WHERE a.status = 'Ready' 
    AND a.owner_id = 'stockseller' 
    AND a.product_typ = '03' 

UNION ALL 

SELECT a.id, a.stock_num, a.stock_rfrnc_num, 
     a.date, a.center, a.owner, 
     a.owner_id, a.product_typ, a.transaction_dt, 
     a.location, a.status 
    FROM a 
WHERE a.status = 'Ready' 
    AND a.owner_id = 'stockseller' 
    AND a.product_typ = '04';