Запарил сверхинтеллект

From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Запарил сверхинтеллект
Date: 2017-12-01 10:38:46
Message-ID: 20171201103846.522bmhrmpcxn3wig@vdsl.uvw.ru
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general


разгребали очередной факап с нагрузкой на БД

Простой зарос

EXPLAIN ANALYZE SELECT
*
FROM
"orders" "o"
WHERE
"o"."gid" = '65'
AND "o"."sid" = '1210'
AND status = ANY (ARRAY[
'confirm'::text,
'accept'::text,
'driving'::text,
'waiting'::text,
'transporting'::text]);

выдает вот такой EXPLAIN:

----------------------------------------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on orders o (cost=43482.22..54652.36 rows=2806 width=2494) (actual time=2544.520..2602.755 rows=337 loops=1)
Recheck Cond: ((gid = 65) AND (sid = 1210) AND (status = ANY ('{confirm,accept,driving,waiting,transporting}'::text[])))
Heap Blocks: exact=86917
-> BitmapAnd (cost=43482.22..43482.22 rows=2806 width=0) (actual time=2516.333..2516.333 rows=0 loops=1)
-> Bitmap Index Scan on dispatcher_history_sign_idx (cost=0.00..7643.88 rows=150331 width=0) (actual time=1791.934..1791.934 rows=3982643 loops=1)
Index Cond: ((gid = 65) AND (sid = 1210))
-> Bitmap Index Scan on orders_status_phones_ostatus_key (cost=0.00..35836.69 rows=1258378 width=0) (actual time=91.829..91.829 rows=377222 loops=1)
Index Cond: (status = ANY ('{confirm,accept,driving,waiting,transporting}'::text[]))
Planning time: 2.706 ms
Execution time: 2612.418 ms
(10 строк)

При том что индекс конечно есть:

"edispatcher_orders_service_idx" btree (gid, sid)
WHERE status = ANY (ARRAY['confirm'::text, 'accept'::text, 'driving'::text, 'waiting'::text, 'transporting'::text])

Короче в итоге сделано следующее:

Запилена функция:

CREATE FUNCTION "selindex" ("name" TEXT)
RETURNS BOOLEAN
AS $$
BEGIN
RETURN TRUE;
END;
$$
LANGUAGE plpgsql
IMMUTABLE
;

И индекс перестроен с допусловием WHERE "selindex"('имя индекса');

Так же добавляем AND "selindex"('имя индекса'); в запрос

в итоге теперь:

EXPLAIN ANALYZE SELECT
*
FROM
"orders" "o"
WHERE
"o"."status" IN ('confirm', 'accept', 'driving', 'waiting', 'transporting')

AND "o"."gid" = '65'
AND "o"."sid" = '1210'

AND "selindex"('edispatcher_orders_service_true_idx');

----------------------------------------------------------------------------------------------------------------------------------------------------------
Index Scan using edispatcher_orders_service_true_idx on orders o (cost=0.28..10831.72 rows=2805 width=2494) (actual time=0.090..4.643 rows=341 loops=1)
Index Cond: ((gid = 65) AND (sid = 1210))
Planning time: 2.764 ms
Execution time: 4.759 ms
(4 строки)

выбирает из нужного индекса и сразу сколько надо записей а не
перемножает выборку из четырех миллионов на выборку из 0.3 млн.

но остаются вопросы:

когда запросов таких станет много разных: сверхинтеллект планировщика
будет меня снова побеждать или нет?

--

. ''`. Dmitry E. Oboukhov <unera(at)debian(dot)org>
: :’ :
`. `~’ GPG key: 4096R/08EEA756 2014-08-30
`- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Владимир 2017-12-01 12:44:47 select + insert
Previous Message Dmitry E. Oboukhov 2017-10-26 07:58:35 Re: INSERT ON CONFLICT RETURNING