F.53. sr_plan
Ðажно
ÐоддеÑжка ÑаÑÑиÑÐµÐ½Ð¸Ñ sr_plan в Postgres Pro пÑекÑаÑена.
F.53.1. ÐбоÑнование
РаÑÑиÑение sr_plan позволÑÐµÑ ÑÐ¾Ñ ÑанÑÑÑ Ð¿Ð»Ð°Ð½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов и иÑполÑзоваÑÑ ÑÑи Ð¿Ð»Ð°Ð½Ñ Ð¿Ñи поÑледÑÑÑем вÑполнении ÑÐµÑ Ð¶Ðµ запÑоÑов, иÑклÑÑÐ°Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑнÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и Ñого же запÑоÑа.
ÐодÑÐ»Ñ sr_plan дейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑиÑÑеме Oracle Outline. ÐÑполÑзÑÑ ÐµÐ³Ð¾, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе жÑÑÑко заÑикÑиÑоваÑÑ Ð¿Ð»Ð°Ð½ вÑполнениÑ. ÐÑо бÑÐ²Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, еÑли Ð²Ñ ÑвеÑенÑ, ÑÑо планиÑовÑик не ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑÑабоÑаÑÑ Ð»ÑÑÑий план.
ÐбÑÑно ÑиÑÑемнÑе админиÑÑÑаÑоÑÑ Ð¸Ð³ÑаÑÑ Ñ Ð·Ð°Ð¿ÑоÑами инÑеÑакÑивно и ÑÐ¾Ñ ÑанÑÑÑ Ð²ÑбÑаннÑе Ð¿Ð»Ð°Ð½Ñ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð·Ð°Ð¿ÑоÑами, вÑÐµÐ¼Ñ Ð¾Ð±ÑабоÑки коÑоÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð¿ÑедÑказÑемÑм.
ÐаÑем ÑÐ¾Ñ ÑанÑннÑе Ð¿Ð»Ð°Ð½Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑÑÑ Ð¿Ñиложением, вÑполнÑÑÑим ÑÑи запÑоÑÑ.
F.53.2. УÑÑановка
ÐÑполниÑе в ваÑей базе:
CREATE EXTENSION sr_plan;
РоÑÑедакÑиÑÑйÑе postgresql.conf:
shared_preload_libraries = 'sr_plan'
Ðажно, ÑÑÐ¾Ð±Ñ ÑÑа библиоÑека пÑедзагÑÑжалаÑÑ Ð¿Ñи запÑÑке ÑеÑвеÑа, Ñак как пÑименение ÑÐ¾Ñ ÑанÑннÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² вклÑÑаеÑÑÑ Ð½Ð° ÑÑовне баз даннÑÑ Ð¸ не завиÑÐ¸Ñ Ð¾Ñ ÐºÐ°ÐºÐ¸Ñ -либо паÑамеÑÑов Ñоединений.
F.53.3. ÐÑполÑзование
ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе ÑÐ¾Ñ ÑаниÑÑ Ð¿Ð»Ð°Ð½ запÑоÑа, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑÑановиÑÑ Ð¿ÐµÑеменнÑÑ:
set sr_plan.write_mode = true;
ÐоÑле ÑÑого Ð¿Ð»Ð°Ð½Ñ Ð²ÑÐµÑ Ð¿Ð¾ÑледÑÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов бÑдÑÑ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² ÑаблиÑе sr_plans, пока ÑÑой пеÑеменной не бÑÐ´ÐµÑ Ð¿ÑиÑвоено знаÑение false. ÐомниÑе, ÑÑо пÑи ÑÑом ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿Ð»Ð°Ð½Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов, вклÑÑÐ°Ñ Ð¿Ð¾Ð²ÑоÑнÑе. ÐÑполниÑе нÑжнÑй вам запÑоÑ:
select query_hash from sr_plans where query_hash=10;
ÐÑклÑÑиÑе ÑÐ¾Ñ Ñанение планов:
set sr_plan.write_mode = false;
УбедиÑеÑÑ Ð² Ñом, ÑÑо план запÑоÑа ÑÐ¾Ñ ÑанÑн:
select query_hash, enable, valid, query, explain_jsonb_plan(plan) from sr_plans;
query_hash | enable | valid | query | explain_jsonb_plan
------------+--------+-------+------------------------------------------------------+----------------------------------------------------
1783086253 | f | t | select query_hash from sr_plans where query_hash=10; | Bitmap Heap Scan on sr_plans +
| | | | Recheck Cond: (query_hash = 10) +
| | | | -> Bitmap Index Scan on sr_plans_query_hash_idx+
| | | | Index Cond: (query_hash = 10) +
| | | | ÐбÑаÑиÑе внимание на вÑзов ÑÑнкÑии explain_jsonb_plan, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð²Ð¸Ð·ÑализиÑоваÑÑ Ð¿Ð»Ð°Ð½ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑомÑ, как ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° EXPLAIN.
ÐÐ»Ð°Ð½Ñ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð² базе даннÑÑ Ð² виде jsonb. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñе запиÑаннÑе Ð¿Ð»Ð°Ð½Ñ Ð¾ÑклÑÑенÑ, Ð¸Ñ Ð¸ÑполÑзование Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑазÑеÑиÑÑ Ð²ÑÑÑнÑÑ:
ЧÑÐ¾Ð±Ñ ÑазÑеÑиÑÑ Ð¸ÑполÑзование ÑÐ¾Ñ ÑанÑнного плана, вÑполниÑе:
update sr_plans set enable=true where query_hash=1783086253;
(ÐдеÑÑ 1783086253 Ñказано ÑолÑко Ð´Ð»Ñ Ð¿ÑимеÑа.) ÐоÑле ÑÑого пÑи вÑполнении данного запÑоÑа бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ð»Ð°Ð½ из ÑаблиÑÑ sr_plans.
ÐÑоме Ñого, sr_plan позволÑÐµÑ ÑÐ¾Ñ ÑанÑÑÑ Ð¿Ð»Ð°Ð½Ñ Ð¿Ð°ÑамеÑÑизованнÑÑ Ð·Ð°Ð¿ÑоÑов. Ð ÑÑом ÑлÑÑае в запÑоÑе бÑдÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе конÑÑанÑÑ, коÑоÑÑе, как пÑедполагаеÑÑÑ, не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° план.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ помеÑиÑÑ Ð² Ñежиме ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð° ÑÑи конÑÑанÑÑ ÐºÐ°Ðº паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑа, иÑполÑзÑÑ ÑпеÑиалÑнÑÑ ÑÑнкÑÐ¸Ñ _p (anyelement). ÐапÑимеÑ:
=>create table test_table (a numeric, b text); CREATE TABLE =>insert into test_table values (1,'1'),(2,'2'),(3,'3'); INSERT 0 3 => set sr_plan.write_mode = true; SET => select a,b from test_table where a = _p(1); a | b ---+--- 1 | 1 (1 row) => set sr_plan.write_mode = false; SET
ТепеÑÑ Ð¿Ð»Ð°Ð½ запÑоÑа к наÑей ÑаблиÑе ÑоÑ
ÑанÑн Ñ Ð¿Ð°ÑамеÑÑом. РеÑли Ð¼Ñ Ð²ÐºÐ»ÑÑим ÑоÑ
ÑанÑннÑй план, он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð»ÑбÑм знаÑением a, еÑли ÑÑо знаÑение бÑÐ´ÐµÑ Ð·Ð°Ð²ÑÑнÑÑо в вÑзов ÑÑнкÑии _p().
=>update sr_plans set enable = true where query= 'select a,b from test_table where a = _p(1)'; UPDATE 1 -- ÐÑи запÑоÑÑ Ð±ÑдÑÑ Ð¸ÑполÑзоваÑÑ ÑÐ¾Ñ ÑанÑннÑй план =>select a,b from test_table where a = _p(2); a | b ---+--- 2 | 2 (1 row) =>select a,b from test_table where a = _p(3); a | b ---+--- 3 | 3 (1 row) -- ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÐ¾Ñ ÑанÑннÑй план, Ñак как -- конÑÑанÑа не завÑÑнÑÑа в _p() =>select a,b from test_table where a = 1; a | b ---+--- 1 | 1 (1 row)