У меня есть представление, которое возвращает список проектов для клиентов и поставщиков.Ветвление 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.
Проблема заключается в том, что при доступе к представлению в качестве клиента оракул тратит много времени, чтобы проверить «вендор-венчик», когда он не нужен, и запрос выполняется медленно.
Я теперь могу разделить этот вид на два и выбирать разные виды каждый раз. Но на самом деле у меня много взглядов, основанных на этом, и я не имею прямого доступа к этому. Мне нужно будет дублировать каждое из «дочерних» представлений и внести много изменений в код приложения, чтобы внести это изменение.
Есть ли способ «намекнуть» оракулу пропустить первую или вторую ветвь союза?
Вы можете рассмотреть явно именования выберите столбцы. Как только вы это сделаете, попробуйте добавить дополнительный константный столбец к каждому из ваших союзов, то есть «V» и «C», а затем явно выберите это - это поможет? –
Кажется, это так, спасибо – SWilk
Я вставлю в качестве ответа –