Использую Postgresql, есть запрос в котором нужно обновить таблицу новыми значениями, а тех записей которых нет, вернуть.
Приблизительно запрос выглядит так:
WITH ...(
.
.
.),
documents AS (
SELECT
ad."DocId"
d."EndDate",
d."Responsible",
d."Account"
FROM documents_raw d
LEFT JOIN "ActualDocument" ad
ON (d."Account"=ad."Account" AND d."Responsible"=ad."Responsible")
)
documents_upd AS(
UPDATE "ActualDocument"
SET "ActualDocument"."EndDate" = documents."EndDate"
FROM documents
WHERE "ActualDocument"."DocId"= documents."DocId"
)
SELECT *
FROM documents_upd
WHERE "DocId" IS NULL
Проблема возникает при обновлении в CTE documents_upd в плане Hash Join идет Seq Scan по таблице «ActualDocument».
Хочется чтобы использовался индекс по первичному ключу «DocId» таблицы «ActualDocument». Например когда использую EXISTS или INNER JOIN в CTE, то используется индекс по первичному ключу «DocId»
WITH (...
.
.
.),
documents AS (
SELECT
ad."DocId"
d."EndDate",
d."Responsible",
d."Account"
FROM documents_raw d
LEFT JOIN "ActualDocument" ad
ON (d."Account"=ad."Account" AND d."Responsible"=ad."Responsible")
)
SELECT *
FROM "ActualDocument"
WHERE EXISTS (
SELECT TRUE
FROM documents
WHERE
"ActualDocument"."DocId"= documents."DocId"
)