У меня довольно сложный запрос, основанный на объединении нескольких таблиц. На данный момент мы используем представление для выполнения операций со всеми нужными нам строками, поэтому представление и запрос выглядят так:
CREATE VIEW
V_VIEW
(
COL1, COL2, COL3, COL4
) AS
SELECT
"COL1", "COL2", "COL3", "COL4"
FROM
TABLE1
UNION ALL
SELECT
"COL1", "COL2", "COL3", "COL4"
FROM
TABLE2;
SELECT
COL1, COL2
FROM
( SELECT
COL1, COL2
FROM
V_VIEW
WHERE
COL1 like 'val%'
AND COL2 =
(
SELECT
MAX(COL3)
FROM
V_VIEW
WHERE
COL4 = 'Y' ) part1
UNION ALL
SELECT
COL1, COL2
FROM
( SELECT
COL1, COL2
FROM
V_VIEW
WHERE
COL1 like 'sth%'
AND COL2 =
(
SELECT
MIN(COL3)
FROM
V_VIEW
WHERE
COL4 = 'N' ) part2;
Я ищу способ повысить производительность этого запроса, и, к сожалению, создание новой таблицы, состоящей из всех строк таблиц Table1 и Table2, пока недоступно (нам не разрешается вмешиваться в то, как туда вставляются строки). ). Я попытался использовать предложение WITH вместо представления, чтобы оно выглядело примерно так:
WITH TEMP_TABLE AS (
SELECT
COL1, COL2, COL3, COL4
FROM
TABLE1
UNION ALL
SELECT
COL1, COL2, COL3, COL4
FROM
TABLE2 )
SELECT
COL1, COL2
FROM
( SELECT
COL1, COL2
FROM
TEMP_TABLE
WHERE
COL1 like 'val%'
AND COL2 =
(
SELECT
MAX(COL3)
FROM
TEMP_TABLE
WHERE
COL4 = 'Y' ) part1
UNION ALL
SELECT
COL1, COL2
FROM
( SELECT
COL1, COL2
FROM
TEMP_TABLE
WHERE
COL1 like 'sth%'
AND COL2 =
(
SELECT
MIN(COL3)
FROM
TEMP_TABLE
WHERE
COL4 = 'N' ) part2
На небольшом объеме данных (в таблицах Table1 и Table2 около 20 тыс. Строк) это очень хорошо повышает производительность. Однако эти таблицы в конечном итоге будут заполнены миллионами строк. Я не совсем понимаю, как обрабатывается предложение WITH, поэтому мне интересно: есть ли шанс, что запрос, использующий замыкание WITH, для большого набора данных, завершится неудачей (из-за недостатка памяти?), Где запрос без него будет работать медленно, но закончится просто отлично?