powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / При update таблицы идет seq scan
3 сообщений из 3, страница 1 из 1
При update таблицы идет seq scan
    #40104130
polin11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запрос в котором нужно обновить таблицу новыми значениями, а тех записей которых нет,
вернуть.
Приблизительно запрос выглядит так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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" 
)
...
Рейтинг: 0 / 0
При update таблицы идет seq scan
    #40104144
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polin11,

Предлагаю хак попробовать в виде

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
   UPDATE "ActualDocument"
   SET "ActualDocument"."EndDate" = documents."EndDate"
   FROM documents
   WHERE "ActualDocument"."DocId"= documents."DocId" 
  AND EXISTS (
SELECT FROM documents d1
WHERE "ActualDocument"."DocId"= d1."DocId" 
)



Напишите если поможет.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
При update таблицы идет seq scan
    #40104159
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так у Вас

Код: sql
1.
2.
LEFT JOIN "ActualDocument" ad
   ON (d."Account"=ad."Account" AND d."Responsible"=ad."Responsible")



как там индекс по DocId должен использоваться?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / При update таблицы идет seq scan
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]