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
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 |