2014-09-08 1 views
0

У меня есть представление, которое возвращает список проектов для клиентов и поставщиков.Ветвление SQL-запроса с объединением all - performance

CREATE OR REPLACE VIEW projects_list AS 
SELECT pr.*, 
     c.customer_name as party_name, 
     null as vendor_id, 
     null as vendor_data 
    FROM projects pr 
    JOIN customers c on (pr.customer_id = c.customer_id) 
UNION ALL 
SELECT pr.*, 
     v.vendor_name as party_name, 
     v.vendor_id, 
     v.some_column as vendor_data 
    FROM projects pr 
    JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
    JOIN vendors v on (pov.vendor_id = v.vendor_id) 

В основном, я использую это представление для получения списка проектов для клиента или поставщика, никогда не одновременно. Таким образом, вид запрашивается либо как:

или

SELECT * FROM projects_list 
WHERE vendor_id = 'A_VENDOR'; 

Так основно я хотел бы выполнить либо первую часть союза, если нет VENDOR_ID набор, или вторая часть - если существует набор vendor_id.

Проблема заключается в том, что при доступе к представлению в качестве клиента оракул тратит много времени, чтобы проверить «вендор-венчик», когда он не нужен, и запрос выполняется медленно.

Я теперь могу разделить этот вид на два и выбирать разные виды каждый раз. Но на самом деле у меня много взглядов, основанных на этом, и я не имею прямого доступа к этому. Мне нужно будет дублировать каждое из «дочерних» представлений и внести много изменений в код приложения, чтобы внести это изменение.

Есть ли способ «намекнуть» оракулу пропустить первую или вторую ветвь союза?

+0

Вы можете рассмотреть явно именования выберите столбцы. Как только вы это сделаете, попробуйте добавить дополнительный константный столбец к каждому из ваших союзов, то есть «V» и «C», а затем явно выберите это - это поможет? –

+0

Кажется, это так, спасибо – SWilk

+0

Я вставлю в качестве ответа –

ответ

0

Возможно, вы захотите рассмотреть возможность явного обозначения ваших столбцов выбора. Как только вы это сделаете, попробуйте добавить дополнительный константный столбец к каждому из ваших союзов, то есть «V» и «C», а затем явно выберите это - это поможет?

т.е.

CREATE OR REPLACE VIEW projects_list AS 
SELECT pr.*, 'C' Type 
     c.customer_name as party_name, 
     null as vendor_id, 
     null as vendor_data 
    FROM projects pr 
    JOIN customers c on (pr.customer_id = c.customer_id) 
UNION ALL 
SELECT pr.*, 'V' 
     v.vendor_name as party_name, 
     v.vendor_id, 
     v.some_column as vendor_data 
    FROM projects pr 
    JOIN projects_of_vendors pov on (pr.project_id = pov.project_id) 
    JOIN vendors v on (pov.vendor_id = v.vendor_id) 

Затем используйте

SELECT * FROM projects_list WHERE Type = 'V'...