LINUX.ORG.RU

Ускорить простой запрос

 


0

1

Ускорить простой запрос нужно проверить входят ли ид. записей из массива в таблицу

SELECT ARRAY(
 SELECT  DISTINCT "Event"
        FROM "Documents"
        WHERE "Event" = ANY(ARRAY[1005657, 1005664, 7122])
        LIMIT 3
)

Для этого запроса такой план.

"Result  (cost=0.93..0.94 rows=1 width=32) (actual time=2.110..2.111 rows=1 loops=1)"
"  Buffers: shared hit=213"
"  InitPlan 1 (returns $0)"
"    ->  Limit  (cost=0.43..0.93 rows=3 width=4) (actual time=0.042..2.100 rows=3 loops=1)"
"          Buffers: shared hit=213"
"          ->  Unique  (cost=0.43..768.10 rows=4542 width=4) (actual time=0.040..2.096 rows=3 loops=1)"
"                Buffers: shared hit=213"
"                ->  Index Only Scan using "iEvent" on "Documents"  (cost=0.43..748.72 rows=7751 width=4) (actual time=0.039..1.532 rows=7709 loops=1)"
"                      Index Cond: ("Event" = ANY ('{1005657,1005664,7122}'::integer[]))"
"                      Heap Fetches: 72"
"                      Buffers: shared hit=213"
"Planning time: 0.510 ms"
"Execution time: 2.149 ms"

Проблема такая, что для ид. 7122 в таблице «Documents» существует записей 7709, достаем эти все записи. Хотелось бы переписать запрос, чтобы не все записи вытаскивали, а только до первой существующей.

psql# \d Documents

Неясно зачем все эти массивы, а DISTINCT - full scan, так что

SELECT DISTINCT Documents.Event from Documents 
WHERE
Event in (1005657,1005664,7122);

или

SELECT DISTINCT ON (Documents.Event) Documents.id,... from Documents 
WHERE
Event in (1005657,1005664,7122);


kindof
()
Последнее исправление: kindof (всего исправлений: 1)
select count(*) from  Documents
WHERE "Event" = ANY(ARRAY[1005657, 1005664, 7122])
LIMIT 1
Psilocybe ★★★★
()
Последнее исправление: Psilocybe (всего исправлений: 1)

А так:

SELECT
	ARRAY(
		SELECT
			t
		FROM
			UNNEST(ARRAY[1005657, 1005664, 7122]) t 
			JOIN (VALUES(TRUE)) a
				ON EXISTS(
					SELECT FROM "Documents" d WHERE (d."Event" = t)
				)
	)
?

Toxo2 ★★★★
()

Во-первых,

SELECT
(SELECT Event FROM Documents WHERE Event = 1005657 LIMIT 1)
UNION ALL
(SELECT Event FROM Documents WHERE Event = 1005664 LIMIT 1)
UNION ALL
(SELECT Event FROM Documents WHERE Event = 7122 LIMIT 1)

Во-вторых, он у тебя и так 2ms выполняется, это быстро, зачем его ускорять? Значит ты выполняешь его кучу раз и оптимизировать нужно это.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

ставлю на то, что

SELECT (1005657,1005664,7122);

будет минимум на порядок быстрее чем:

SELECT DISTINCT Documents.Event from Documents 
WHERE
Event in (1005657,1005664,7122);

и даже

SELECT
(SELECT Event FROM Documents WHERE Event = 1005657 LIMIT 1)
UNION ALL
(SELECT Event FROM Documents WHERE Event = 1005664 LIMIT 1)
UNION ALL
(SELECT Event FROM Documents WHERE Event = 7122 LIMIT 1)

при том же результате ) шутка.

А если серьезно посмотреть на прикладную ценность такого запроса, и его возможные причины, может проще триггер на INSERT event-a повесить?

kindof
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.