F.3. aqo
ÐодÑÐ»Ñ aqo пÑедÑÑавлÑÐµÑ Ñобой ÑаÑÑиÑение Postgres Pro Standard Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии запÑоÑов по ÑÑоимоÑÑи вÑполнениÑ. ÐÑполÑзÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°Ñинного обÑÑениÑ, а ÑоÑнее модиÑикаÑÐ¸Ñ Ð°Ð»Ð³Ð¾ÑиÑма k-NN, aqo ÑлÑÑÑÐ°ÐµÑ Ð¾ÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑпоÑобÑÑвоваÑÑ Ð²ÑбоÑÑ Ð»ÑÑÑего плана и, как ÑледÑÑвие, ÑÑкоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
ÐодÑÐ»Ñ aqo Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем вÑполнÑемÑм запÑоÑам, за иÑклÑÑением запÑоÑов, обÑаÑаÑÑÐ¸Ñ ÑÑ Ðº ÑиÑÑемнÑм оÑноÑениÑм. ÐÑли запÑоÑÑ ÑазлиÑаÑÑÑÑ ÑолÑко конÑÑанÑами, они ÑÑиÑаÑÑÑÑ Ð¾ÑноÑÑÑимиÑÑ Ðº Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа модÑÐ»Ñ aqo ÑÐ¾Ñ ÑанÑÐµÑ Ð´Ð»Ñ Ð¼Ð°Ñинного обÑÑÐµÐ½Ð¸Ñ ÐºÐ°ÑеÑÑво оÑенки колиÑеÑÑва ÑÑÑок, вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, вÑÐµÐ¼Ñ Ð¸ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑполнениÑ. Ðа оÑнове ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ aqo ÑÑÑÐ¾Ð¸Ñ Ð½Ð¾Ð²Ñй план вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ иÑполÑзÑÐµÑ ÐµÐ³Ð¾ Ð´Ð»Ñ ÑледÑÑÑего запÑоÑа Ñого же клаÑÑа. Ð ÑеÑÑÐ°Ñ aqo показал знаÑиÑелÑное ÑвелиÑение пÑоизводиÑелÑноÑÑи Ð´Ð»Ñ ÑложнÑÑ Ð·Ð°Ð¿ÑоÑов.
Ðажно
ÐпÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¸ÑполÑзованием aqo не поддеÑживаеÑÑÑ Ð½Ð° ведомÑÑ ÑеÑвеÑÐ°Ñ .
ÐодÑÐ»Ñ aqo ÑÐ¾Ñ ÑанÑÐµÑ Ð²Ñе даннÑе обÑÑÐµÐ½Ð¸Ñ (aqo_data), запÑоÑÑ (aqo_query_texts), паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑов (aqo_queries) и ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов (aqo_query_stat) в ÑÐ°Ð¹Ð»Ð°Ñ . ÐÑи запÑÑке aqo ÑÑи даннÑе загÑÑжаÑÑÑÑ Ð² ÑазделÑемÑÑ Ð¿Ð°Ð¼ÑÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе обÑаÑаÑÑÑÑ Ðº даннÑм aqo, иÑполÑзÑÑ ÑÑнкÑии и пÑедÑÑавлениÑ.
ÐÑедÑпÑеждение
УÑÑиÑе, ÑÑо aqo Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ð½ÐµÐºÐ¾ÑÑекÑно непоÑÑедÑÑвенно поÑле обновлений ÑаÑÑиÑениÑ, коÑоÑÑе изменÑÑÑ ÐµÐ³Ð¾ ÑдÑо, и поÑле обновлений Postgres Pro. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ñле каждого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Postgres Pro ÑледÑÐµÑ Ð²ÑзÑваÑÑ ÑÑнкÑÐ¸Ñ aqo_reset() и вÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DROP EXTENSION aqo. Ðднако пÑи обновлении миноÑнÑÑ
веÑÑий Postgres Pro до веÑÑий не ниже 13.11/14.8/15.3 вÑзов ÑÑнкÑии aqo_reset() не ÑÑебÑеÑÑÑ, Ñак как ÑбÑÐ¾Ñ Ð´Ð°Ð½Ð½ÑÑ
aqo пÑи необÑ
одимоÑÑи бÑÐ´ÐµÑ Ð²Ñполнен авÑомаÑиÑеÑки.
ÐÑи обновлении миноÑнÑÑ
веÑÑий Ñакже вÑполниÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER EXTENSION aqo UPDATE и имейÑе в видÑ, ÑÑо оÑÐºÐ°Ñ Ðº более низкой веÑÑии ÑаÑÑиÑÐµÐ½Ð¸Ñ aqo бÑÐ´ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶ÐµÐ½.
ÐÑли даннÑе aqo бÑли ÑбÑоÑÐµÐ½Ñ Ð°Ð²ÑомаÑиÑеÑки или вÑзовом aqo_reset(), Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑебÑеÑÑÑ Ð½Ð¾Ð²Ð¾Ðµ обÑÑение. ÐоÑÑÐ¾Ð¼Ñ ÐµÑли какие-либо даннÑе, напÑÐ¸Ð¼ÐµÑ ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов, могÑÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð² обÑÑении aqo, ÑоздайÑе ÑезеÑвнÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑÑиÑ
даннÑÑ
заÑанее.
F.3.1. УÑÑановка и подгоÑовка
РаÑÑиÑение aqo вклÑÑено в ÑоÑÑав Postgres Pro Standard. УÑÑановив Postgres Pro Standard, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑÑ aqo к ÑабоÑе:
ÐобавÑÑе
aqoв паÑамеÑÑ shared_preload_libraries в Ñайлеpostgresql.conf:shared_preload_libraries = 'aqo'
ÐиблиоÑÐµÐºÑ aqo нÑжно пÑедваÑиÑелÑно загÑÑзиÑÑ Ð¿Ñи запÑÑке ÑеÑвеÑа, Ñак как адапÑÐ¸Ð²Ð½Ð°Ñ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов должна бÑÑÑ Ð²ÐºÐ»ÑÑена Ð´Ð»Ñ Ð²Ñего клаÑÑеÑа.
СоздайÑе ÑаÑÑиÑение aqo, вÑполнив ÑледÑÑÑий запÑоÑ:
CREATE EXTENSION aqo;
Ðогда ÑаÑÑиÑение бÑÐ´ÐµÑ Ñоздано, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑиÑÑÑпиÑÑ Ðº опÑимизаÑии запÑоÑов.
Ðоманда
DROP EXTENSION aqo;
ÑÐ´Ð°Ð»Ð¸Ñ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ aqo ÑолÑко на ÑÑовне клаÑÑеÑа. РаÑÑиÑение aqo вÑÑ Ñавно бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½Ð° вÑеÑ
ÑеÑвеÑаÑ
, пока оно Ñказано в shared_preload_libraries, и пÑи пеÑезапÑÑке ÑеÑвеÑа пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÑабоÑÑ Ð² Ñежиме, Ñказанном в postgresql.conf. ÐÑоме Ñого, aqo ÑоÑ
ÑÐ°Ð½Ð¸Ñ ÑÐ²Ð¾Ñ Ð²Ð½ÑÑÑеннее ÑоÑÑоÑние поÑле поÑледоваÑелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ DROP EXTENSION -> CREATE EXTENSION.
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ Ð²Ñе даннÑе из Ñ
ÑанилиÑа aqo, вклÑÑÐ°Ñ ÑобÑаннÑÑ ÑÑаÑиÑÑикÑ, вÑзовиÑе ÑÑнкÑÐ¸Ñ aqo_reset():
SELECT aqo_reset();
ЧÑÐ¾Ð±Ñ ÑакÑиÑеÑки оÑклÑÑиÑÑ aqo на ÑÑовне клаÑÑеÑа, ÑделайÑе ÑледÑÑÑее:
ALTER SYSTEM SET aqo.mode = 'disabled'; SELECT pg_reload_conf(); DROP EXTENSION aqo;
ÐÑли Ð²Ñ Ð½Ðµ Ñ Ð¾ÑиÑе, ÑÑÐ¾Ð±Ñ aqo загÑÑжалÑÑ Ð¿Ñи пеÑезапÑÑке ÑеÑвеÑа, ÑдалиÑе ÑÑÑокÑ
shared_preload_libraries = 'aqo'
из Ñайла postgresql.conf.
F.3.1.1. ÐонÑигÑÑиÑование
Ð Ñежиме ÑабоÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ (controlled) aqo не влиÑÐµÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ Ð·Ð°Ð¿ÑоÑов. РзавиÑимоÑÑи Ð¾Ñ Ð²Ð°Ñей модели иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑбÑаÑÑ Ð¾Ð´Ð¸Ð½ из ÑледÑÑÑиÑ
Ñежимов:
intelligentâ в ÑÑом Ñежиме вÑполнÑеÑÑÑ Ð°Ð²ÑонаÑÑÑойка запÑоÑов на оÑнове ÑÑаÑиÑÑики, ÑобÑанной по клаÑÑам запÑоÑов. ÐбÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ Ñлагаauto_tuningпÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_queries Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подÑобной инÑоÑмаÑии об ÑÑом Ñежиме.forcedâ в ÑÑом Ñежиме ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика по вÑем запÑоÑам, вне завиÑимоÑÑи Ð¾Ñ Ð¸Ñ ÐºÐ»Ð°ÑÑа.controlledâ в ÑÑом Ñежиме иÑполÑзÑеÑÑÑ ÑÑандаÑÑнÑй планиÑовÑик Ð´Ð»Ñ Ð»ÑбÑÑ Ð½Ð¾Ð²ÑÑ Ð·Ð°Ð¿ÑоÑов, но Ð´Ð»Ñ Ñже извеÑÑнÑÑ ÐºÐ»Ð°ÑÑов запÑоÑов пÑодолжаÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ñанее заданнÑе паÑамеÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ.learnâ в ÑÑом Ñежиме ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика по вÑем вÑполненнÑм запÑоÑам и обновлÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе о клаÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑов без авÑонаÑÑÑойки запÑоÑов.frozenâ в ÑÑом Ñежиме ÑÑаÑиÑÑика, ÑобÑÐ°Ð½Ð½Ð°Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов извеÑÑнÑÑ ÐºÐ»Ð°ÑÑов, иÑполÑзÑеÑÑÑ, но новÑе даннÑе не ÑобиÑаÑÑÑÑ. ÐÑÐ¾Ñ Ñежим можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑменÑÑÐµÐ½Ð¸Ñ Ð²Ð»Ð¸ÑÐ½Ð¸Ñ aqo на вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.disabledâ в ÑÑом Ñежиме aqo оÑклÑÑаеÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов, даже Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов извеÑÑнÑÑ ÐºÐ»Ð°ÑÑов. СобÑÐ°Ð½Ð½Ð°Ñ ÑÑаÑиÑÑика и паÑамеÑÑÑ aqo ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¸ могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð² далÑнейÑем. ÐÑÐ¾Ñ Ñежим можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð²Ñеменного оÑклÑÑÐµÐ½Ð¸Ñ aqo Ñ ÑÐ¾Ñ Ñанением конÑигÑÑаÑии и ÑобÑанной ÑÑаÑиÑÑики.
ЧÑÐ¾Ð±Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки измениÑÑ Ñежим aqo в ÑекÑÑем ÑеанÑе, вÑполниÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
ALTER SYSTEM SET aqo.mode = 'Ñежим';
SELECT pg_reload_conf(); ÐдеÑÑ Ñежим â название Ñежима ÑабоÑÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ.
F.3.2. ÐÑполÑзование
F.3.2.1. ÐÑÐ±Ð¾Ñ Ñежима ÑабоÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии запÑоÑов
ÐÑли Ñ Ð²Ð°Ñ ÑаÑÑо вÑполнÑÑÑÑÑ Ð¾Ð´Ð½Ð¾ÑипнÑе запÑоÑÑ, напÑимеÑ, ваÑе пÑиложение вÑдаÑÑ Ð¾Ð³ÑаниÑенное ÑиÑло вÑевозможнÑÑ
клаÑÑов запÑоÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ Ð¸Ð½ÑеллекÑÑалÑнÑм Ñежимом (intelligent) Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑакиÑ
запÑоÑов. Ð ÑÑом Ñежиме aqo анализиÑÑÐµÑ Ð²Ñполнение каждого запÑоÑа и ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑикÑ. ÐÑи ÑÑом ÑÑаÑиÑÑика по ÑазнÑм клаÑÑам запÑоÑов ÑобиÑаеÑÑÑ Ð¾ÑделÑно. ÐÑли пÑоизводиÑелÑноÑÑÑ Ð½Ðµ ÑвелиÑиваеÑÑÑ Ð¿Ð¾Ñле 50 иÑеÑаÑий, ÑаÑÑиÑение aqo ÑÑÑÑÐ¿Ð°ÐµÑ Ð¿Ð»Ð°Ð½Ð¸Ñование ÑÑандаÑÑÐ½Ð¾Ð¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑÐ¸ÐºÑ Ð·Ð°Ð¿ÑоÑов.
ÐÑимеÑание
Ðожно поÑмоÑÑеÑÑ ÑекÑÑий план запÑоÑа, воÑполÑзовавÑиÑÑ ÑÑандаÑÑной командой Postgres Pro EXPLAIN Ñ Ñказанием ANALYZE. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 14.1.
Так как в Ñежиме intelligent ÑазлиÑнÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов анализиÑÑÑÑÑÑ Ð¾ÑделÑно, aqo Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑлÑÑÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, еÑли запÑоÑÑ Ð² ÑабоÑей нагÑÑзке оÑноÑÑÑÑÑ Ðº неÑколÑким ÑазнÑм клаÑÑам или поÑÑоÑнно менÑÑÑÑÑ. ÐÐ»Ñ Ñакого пÑоÑÐ¸Ð»Ñ Ð½Ð°Ð³ÑÑзки ÑÑÐ¾Ð¸Ñ Ð¿ÐµÑевеÑÑи aqo в Ñежим controlled или попÑобоваÑÑ Ñежим forced.
Ð Ñежиме forced ÑаÑÑиÑение aqo не ÑазделÑÐµÑ ÑобÑаннÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ клаÑÑам запÑоÑов и пÑÑаеÑÑÑ Ð¾Ð¿ÑимизиÑоваÑÑ Ð¸Ñ
одинаково. СледоваÑелÑно, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_texts, aqo_queries и aqo_query_stat не обновлÑÑÑÑÑ. ÐаннÑе маÑинного обÑÑениÑ, ÑобÑаннÑе в лÑбом дÑÑгом Ñежиме, непÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ð´Ð»Ñ Ñежима forced и наобоÑоÑ. ÐаннÑй Ñежим Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии нагÑÑзки Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвом ÑазлиÑнÑÑ
клаÑÑов запÑоÑов и ÑÑебÑÐµÑ Ð¼ÐµÐ½ÑÑе памÑÑи, Ñем инÑеллекÑÑалÑнÑй Ñежим. Ðо Ñак как в Ñежиме forced не пÑоизводиÑÑÑ Ð¸Ð½ÑеллекÑÑалÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка по клаÑÑÑ Ð·Ð°Ð¿ÑоÑа, Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
запÑоÑов пÑоизводиÑелÑноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑнизиÑÑÑÑ. ÐÑли Ð²Ñ Ð½Ð°Ð±Ð»ÑдаеÑе Ñнижение пÑоизводиÑелÑноÑÑи в ÑÑом Ñежиме, пеÑеклÑÑиÑе aqo в Ñежим controlled.
РконÑÑолиÑÑемом Ñежиме (controlled) aqo не ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ
клаÑÑов запÑоÑов, Ñак ÑÑо они не бÑдÑÑ Ð¾Ð¿ÑимизиÑоваÑÑÑÑ. ÐÐ»Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ
клаÑÑов запÑоÑов aqo бÑÐ´ÐµÑ Ð¿ÑодолжаÑÑ ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¸ пÑименÑÑÑ Ð¾Ð¿ÑимизиÑованнÑе алгоÑиÑÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзÑйÑе Ñежим controlled ÑолÑко поÑле Ñого, как модÑÐ»Ñ aqo обÑÑалÑÑ Ð² Ñежиме learn или intelligent. ÐоÑколÑÐºÑ Ð² Ñежиме forced Ð½ÐµÑ ÐºÐ»Ð°ÑÑов запÑоÑов, пеÑеÑ
од из него в Ñежим controlled ÑакÑиÑеÑки ознаÑÐ°ÐµÑ Ð¾ÑклÑÑение aqo.
Ð Ñежиме learn ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика по вÑем вÑполненнÑм запÑоÑам и обновлÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе о клаÑÑаÑ
запÑоÑов. ÐÑÐ¾Ñ Ñежим поÑ
ож на Ñежим intelligent, за иÑклÑÑением Ñого, ÑÑо инÑеллекÑÑалÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка на клаÑÑ Ð·Ð°Ð¿ÑоÑа не пÑоизводиÑÑÑ.
ÐÑли Ð²Ñ Ñ
оÑиÑе ÑменÑÑиÑÑ Ð²Ð»Ð¸Ñние aqo на вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ñежим frozen. Ð ÑÑом Ñежиме ÑÑаÑиÑÑика, ÑобÑÐ°Ð½Ð½Ð°Ñ aqo Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов извеÑÑнÑÑ
клаÑÑов, иÑполÑзÑеÑÑÑ, но новÑе даннÑе не ÑобиÑаÑÑÑÑ.
ÐеÑеклÑÑение в Ñежим disabled â ÑÑо единÑÑвеннÑй ÑпоÑоб ÑакÑиÑеÑки оÑклÑÑиÑÑ aqo без поÑеÑи ÑÑаÑиÑÑики и паÑамеÑÑов aqo, коÑоÑÑе ÑоÑ
ÑанÑÑÑÑÑ Ð¸ могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² бÑдÑÑем. ÐапÑоÑÑ Ð² ÑÑом Ñежиме бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ñак, как бÑдÑо ÑаÑÑиÑÐµÐ½Ð¸Ñ aqo вообÑе неÑ.
F.3.2.2. Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°ÑÑÑойка aqo
ÐÐ»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº пÑедÑÑавлениÑм aqo и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑаÑÑиÑеннÑÑ ÑвойÑÑв запÑоÑов Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð¿Ñава ÑÑпеÑполÑзоваÑелÑ.
РабоÑÐ°Ñ Ð² инÑеллекÑÑалÑном Ñежиме (intelligent) или Ñежиме обÑÑÐµÐ½Ð¸Ñ (learn), aqo назнаÑÐ°ÐµÑ ÑникалÑное Ñ
еÑ-знаÑение ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð·Ð°Ð¿ÑоÑов Ð´Ð»Ñ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑобиÑаемой ÑÑаÑиÑÑики. Ð Ñежиме forced ÑÑаÑиÑÑика вÑеÑ
Ñанее ненаблÑдаемÑÑ
клаÑÑов запÑоÑов ÑобиÑаеÑÑÑ Ð²Ð¼ÐµÑÑе, в одной запиÑи Ð´Ð»Ñ Ð¾Ð±Ñего клаÑÑа Ñ Ñ
еÑем, ÑавнÑм 0. ÐÑоÑмоÑÑеÑÑ Ð²Ñе обÑабоÑаннÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов и иÑ
Ñ
еÑ-знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в пÑедÑÑавлении aqo_query_texts:
SELECT * FROM aqo_query_texts;
ЧÑÐ¾Ð±Ñ ÑзнаÑÑ ÐºÐ»Ð°ÑÑ (Ñо еÑÑÑ Ñ
еÑ) запÑоÑа и Ñежим aqo, вклÑÑиÑе пеÑеменнÑе ÑÑÐµÐ´Ñ aqo.show_hash и aqo.show_details и вÑполниÑе запÑоÑ. ÐÑвод бÑÐ´ÐµÑ Ð¿ÑимеÑно ÑледÑÑÑим:
... Planning Time: 23.538 ms ... Execution Time: 249813.875 ms ... Using aqo: true ... AQO mode: LEARN ... Query hash: -2439501042637610315
С каждÑм клаÑÑом запÑоÑов ÑвÑзано оÑделÑное пÑоÑÑÑанÑÑво, назÑваемое пÑоÑÑÑанÑÑвом пÑизнаков, в коÑоÑом ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. С каждÑм пÑоÑÑÑанÑÑвом пÑизнаков ÑвÑÐ·Ð°Ð½Ñ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков, в коÑоÑÑÑ ÑобиÑаеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± избиÑаÑелÑноÑÑи и колиÑеÑÑве ÑÑÑок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана запÑоÑа.
РазнÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов имеÑÑ ÑобÑÑвеннÑе ÑвойÑÑва опÑимизаÑии. ÐÑи ÑвойÑÑва оÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлении aqo_queries:
SELECT * FROM aqo_queries;
ÐоÑÑÑпнÑе паÑамеÑÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ÑаблиÑе ÐÑедÑÑавление aqo_queries.
Ðожно вÑÑÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑÑи ÑвойÑÑва, ÑÑÐ¾Ð±Ñ ÑкоÑÑекÑиÑоваÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов. ÐапÑимеÑ:
-- Ðобавление нового клаÑÑа запÑоÑов в пÑедÑÑавление aqo_queries: SET aqo.mode='intelligent'; SELECT * FROM a, b WHERE a.id=b.id; SET aqo.mode='controlled'; -- ÐÑклÑÑение авÑонаÑÑÑойки, вклÑÑение learn_aqo и use_aqo -- Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов: SELECT count(*) FROM (SELECT queryid FROM aqo_queries) AS q1, LATERAL aqo_queries_update(q1.queryid, NULL, true, true, false) AS q2 WHERE queryid = (SELECT queryid FROM aqo_query_texts WHERE query_text LIKE 'SELECT * FROM a, b WHERE a.id=b.id;'); -- ÐапÑÑк EXPLAIN ANALYZE и наблÑдение изменÑнного плана: EXPLAIN ANALYZE SELECT * FROM a, b WHERE a.id=b.id; EXPLAIN ANALYZE SELECT * FROM a, b WHERE a.id=b.id; -- ÐÑклÑÑение обÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÑекÑаÑÐµÐ½Ð¸Ñ ÑбоÑа ÑÑаÑиÑÑики и -- наÑала иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÑимизиÑованного плана: SELECT count(*) FROM (SELECT queryid FROM aqo_queries) AS q1, LATERAL aqo_queries_update(q1.queryid, NULL, false, true, false) AS q2 WHERE queryid = (SELECT queryid FROM aqo_query_texts WHERE query_text LIKE 'SELECT * FROM a, b WHERE a.id=b.id;');
ЧÑÐ¾Ð±Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð¸Ð½ÑеллекÑÑалÑнÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов, оÑклÑÑиÑе ÑвойÑÑво auto_tuning:
SELECT count(*) FROM (SELECT queryid FROM aqo_queries) AS q1,
LATERAL aqo_queries_update(q1.queryid, NULL, true, true, false) AS q2
WHERE queryid = 'hash'); ÐдеÑÑ Ñ
ÐµÑ â ÑÑо знаÑение Ñ
еÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. Ð ÑезÑлÑÑаÑе aqo не бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки менÑÑÑ ÑвойÑÑва learn_aqo и use_aqo.
ЧÑÐ¾Ð±Ñ Ð¾ÑклÑÑиÑÑ Ð´Ð°Ð»ÑнейÑее обÑÑение Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого клаÑÑа запÑоÑов, вÑполниÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SELECT count(*) FROM (SELECT queryid FROM aqo_queries) AS q1,
LATERAL aqo_queries_update(q1.queryid, NULL, false, true, false) AS q2
WHERE queryid = 'hash'); ÐдеÑÑ Ñ
ÐµÑ â ÑÑо знаÑение Ñ
еÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾ÑклÑÑиÑÑ aqo Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов и иÑполÑзоваÑÑ ÑÑандаÑÑнÑй планиÑовÑик Postgres Pro, вÑполниÑе:
SELECT count(*) FROM (SELECT queryid FROM aqo_queries) AS q1, LATERAL aqo_queries_update(q1.queryid, NULL, false, false, false) AS q2 WHERE queryid IN (SELECT queryid FROM aqo_query_texts);
F.3.3. СпÑавка
F.3.3.1. ÐаÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии
aqo.mode(text)ÐпÑеделÑÐµÑ Ñежим ÑабоÑÑ aqo. ÐозможнÑе знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ÐодÑазделе F.3.1.1.
Ðо ÑмолÑаниÑ:
controlled.aqo.show_hash(boolean)ÐоказÑваÑÑ Ñ ÐµÑ-знаÑение, вÑÑиÑленное из деÑева запÑоÑов и однознаÑно иденÑиÑиÑиÑÑÑÑее клаÑÑ Ð·Ð°Ð¿ÑоÑов или клаÑÑ Ñзлов плана. ÐаÑÐ¸Ð½Ð°Ñ Ñ Postgres Pro веÑÑии 14, модÑÐ»Ñ aqo иÑполÑзÑÐµÑ Ð² каÑеÑÑве иденÑиÑикаÑоÑа клаÑÑа запÑоÑа иденÑиÑикаÑÐ¾Ñ Ñамого Postgres Pro, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ ÑоглаÑованноÑÑÑ Ñ Ð´ÑÑгими ÑаÑÑиÑениÑми, Ñакими как pg_stat_statements. Таким обÑазом, иденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа можно полÑÑиÑÑ Ð¸Ð· полÑ
Query Identifierв вÑводе командÑEXPLAIN ANALYZE.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.show_details(boolean)ÐобавлÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе деÑали в вÑвод командÑ
EXPLAINзапÑоÑа, Ñакие как пÑедÑказание или Ñ ÐµÑ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков, и оÑобÑазиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑпеÑиÑиÑнÑÑ Ð´Ð»Ñ aqo.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.join_threshold(integer)ÐгноÑиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ, ÑодеÑжаÑие колиÑеÑÑво Ñоединений менÑÑе Ñказанного, Ñо еÑÑÑ ÑÑаÑиÑÑика Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑов ÑобиÑаÑÑÑÑ Ð½Ðµ бÑдеÑ.
Ðо ÑмолÑаниÑ:
3.aqo.statement_timeout(integer)ÐпÑеделÑÐµÑ Ð½Ð°ÑалÑное знаÑение Ñак назÑваемого «Ñмного» Ñайм-аÑÑа опеÑаÑоÑов в миллиÑекÑÐ½Ð´Ð°Ñ , коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð²Ñемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи ÑÑÑном обÑÑении aqo на ÑпеÑиалÑнÑÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ñ Ð½ÐµÑдовлеÑвоÑиÑелÑнÑм пÑогнозом колиÑеÑÑва ÑÑÑок. РаÑÑиÑение aqo Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки изменÑÑÑ ÑмнÑй Ñайм-аÑÑ Ð¾Ð¿ÐµÑаÑоÑов во вÑÐµÐ¼Ñ ÑÑого обÑÑениÑ. Ðогда погÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок на ÑÐ·Ð»Ð°Ñ Ð¿ÑевÑÑÐ°ÐµÑ 0.1, знаÑение
aqo.statement_timeoutавÑомаÑиÑеÑки ÑвелиÑиваеÑÑÑ ÑкÑпоненÑиалÑно, но не пÑевÑÑÐ°ÐµÑ statement_timeout.Ðо ÑмолÑаниÑ:
0.aqo.force_collect_stat(boolean)СобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов даже в Ñежиме
disabled. ХоÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¿ÑедÑказаний пÑи ÑÑом не делаеÑÑÑ, добавлÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе издеÑжки.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.dsm_size_max(integer)ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой ÑазделÑемой памÑÑи в мегабайÑÐ°Ñ , коÑоÑÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ aqo Ð¼Ð¾Ð¶ÐµÑ Ð²ÑделиÑÑ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¾Ð±ÑÑениÑ. ÐÑи пÑевÑÑении ÑÑого знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿ÑÑка загÑÑзиÑÑ Ð¿ÑедÑÑавление aqo_data завеÑÑаеÑÑÑ Ð¾Ñибкой «недоÑÑаÑоÑно памÑÑи».
Ðо ÑмолÑаниÑ:
100.aqo.fs_max_items(integer)ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво пÑоÑÑÑанÑÑв пÑизнаков, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ aqo. ÐÑи пÑевÑÑении ÑÑого колиÑеÑÑва обÑÑение на новÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑов пÑекÑаÑиÑÑÑ, и они не бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлениÑÑ .
Ðо ÑмолÑаниÑ:
10000.aqo.fss_max_items(integer)ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво подпÑоÑÑÑанÑÑв пÑизнаков, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ aqo. ÐÑи пÑевÑÑении ÑÑого колиÑеÑÑва даннÑе об избиÑаÑелÑноÑÑи и пÑедÑказание колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ñзлов плана запÑоÑа болÑÑе не бÑдÑÑ ÑобиÑаÑÑÑÑ Ð¸ новÑе подпÑоÑÑÑанÑÑва пÑизнаков не бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлении aqo_data.
Ðо ÑмолÑаниÑ:
100000.aqo.wide_search(boolean)ÐклÑÑÐ°ÐµÑ Ð¿Ð¾Ð¸Ñк ÑоÑедей Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же подпÑоÑÑÑанÑÑвом пÑизнаков ÑÑеди ÑазнÑÑ ÐºÐ»Ð°ÑÑов запÑоÑов.
Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.querytext_max_size(integer)ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа в пÑедÑÑавлении aqo_query_texts.
Ðо ÑмолÑаниÑ:
1000.aqo.min_neighbors_for_predicting(integer)ÐпÑеделÑÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñное колиÑеÑÑво ÑоÑедей, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ðµ Ð´Ð»Ñ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок. ÐÑли Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑво менÑÑе Ñказанного знаÑениÑ, aqo не бÑÐ´ÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð¿ÑедÑказаний.
Ðо ÑмолÑаниÑ:
3.aqo.predict_with_few_neighbors(boolean)ÐозволÑÐµÑ aqo делаÑÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ Ð¼ÐµÐ½ÑÑим колиÑеÑÑвом ÑоÑедей, Ñем бÑло найдено.
Ðо ÑмолÑаниÑ:
on(вкл.).
F.3.3.2. ÐÑедÑÑавлениÑ
F.3.3.2.1. aqo_query_texts
РпÑедÑÑавлении aqo_query_texts клаÑÑиÑиÑиÑÑÑÑÑÑ Ð²Ñе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов, обÑабаÑÑваемÑе aqo. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑов в пÑедÑÑавлении оÑобÑажаеÑÑÑ ÑекÑÑ Ð¿ÐµÑвого пÑоанализиÑованного запÑоÑа ÑÑого клаÑÑа.
ТаблиÑа F.2. ÐÑедÑÑавление aqo_query_texts
| ÐÐ¼Ñ ÑÑолбÑа | ÐпиÑание |
|---|---|
queryid | СодеÑÐ¶Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа, Ñо еÑÑÑ Ñ ÐµÑ Ð¿ÑоÑÑÑанÑÑва пÑизнаков, однознаÑно опÑеделÑÑÑий клаÑÑ Ð·Ð°Ð¿ÑоÑа. |
query_text | СодеÑÐ¶Ð¸Ñ ÑекÑÑ Ð¿ÐµÑвого пÑоанализиÑованного запÑоÑа данного клаÑÑа. |
F.3.3.2.2. aqo_queries
РпÑедÑÑавлении aqo_queries оÑобÑажаÑÑÑÑ ÑвойÑÑва опÑимизаÑии Ð´Ð»Ñ ÑазнÑÑ
клаÑÑов запÑоÑов.
ТаблиÑа F.3. ÐÑедÑÑавление aqo_queries
| СвойÑÑво | ÐпиÑание |
|---|---|
queryid | СодеÑÐ¶Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа, однознаÑно опÑеделÑÑÑий клаÑÑ Ð·Ð°Ð¿ÑоÑа. |
learn_aqo | ÐклÑÑÐ°ÐµÑ ÑÐ±Ð¾Ñ ÑÑаÑиÑÑики Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
use_aqo | ÐклÑÑÐ°ÐµÑ Ð¿ÑедÑказание колиÑеÑÑва ÑÑÑок ÑÑедÑÑвами aqo Ð´Ð»Ñ ÑледÑÑÑего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. ÐÑли Ð¼Ð¾Ð´ÐµÐ»Ñ Ð¾Ñенки ÑÑоимоÑÑи неÑоÑнаÑ, вÑполнение запÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ´Ð»Ð¸ÑÑÑÑ. |
fspace_hash | ÐадаÑÑ ÑникалÑнÑй иденÑиÑикаÑÐ¾Ñ Ð¾ÑделÑного пÑоÑÑÑанÑÑва, в коÑоÑом ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. Ðо ÑмолÑÐ°Ð½Ð¸Ñ fspace_hash ÑавнÑеÑÑÑ queryid. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑиÑвоиÑÑ ÐµÐ¼Ñ Ð´ÑÑгой queryid, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑимизиÑоваÑÑ ÑазнÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов вмеÑÑе. Ð ÑезÑлÑÑаÑе Ð¼Ð¾Ð¶ÐµÑ ÑокÑаÑиÑÑÑÑ Ð¾Ð±ÑÑм памÑÑи Ð´Ð»Ñ Ð¼Ð¾Ð´ÐµÐ»ÐµÐ¹ и даже ÑвелиÑиÑÑÑÑ ÑкоÑоÑÑÑ Ð·Ð°Ð¿ÑоÑов. Ðднако изменение ÑÑого ÑвойÑÑва Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиводиÑÑ Ð¸ к Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ aqo, Ñак ÑÑо иÑполÑзоваÑÑ ÑÑо ÑледÑеÑ, ÑолÑко еÑли Ð²Ñ ÑоÑно понимаеÑе, ÑÑо делаеÑе. |
auto_tuning | ÐоказÑваеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ aqo динамиÑеÑки изменÑÑÑ Ð¿Ð°ÑамеÑÑÑ ÐовоÑÑ Ð¿Ð¾Ð´Ñобнее, пÑи вклÑÑÑнном ÑвойÑÑве ÐапÑоÑÑ Ñ |
smart_timeout | ÐоказÑÐ²Ð°ÐµÑ Ð·Ð½Ð°Ñение «Ñмного» Ñайм-аÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
count_increase_timeout | ÐоказÑваеÑ, ÑколÑко Ñаз ÑвелиÑивалÑÑ Â«ÑмнÑй» Ñайм-аÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
F.3.3.2.3. aqo_data
РпÑедÑÑавлении aqo_data оÑобÑажаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑоÑÐ½ÐµÐ½Ð¸Ñ Ð¾Ñенки колиÑеÑÑва ÑÑÑок. ЧÑÐ¾Ð±Ñ ÑÑеÑеÑÑ Ð²ÑÑ ÑобÑаннÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑдалиÑÑ Ð¸Ð· пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_data вÑе ÑÑÑоки Ñ ÑооÑвеÑÑÑвÑÑÑим fs.
ТаблиÑа F.4. ÐÑедÑÑавление aqo_data
| ÐаннÑе | ÐпиÑание |
|---|---|
fs | Ð¥ÐµÑ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. |
fss | Ð¥ÐµÑ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков. |
nfeatures | Ð Ð°Ð·Ð¼ÐµÑ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков Ð´Ð»Ñ Ñзла плана запÑоÑа. |
features | ÐогаÑиÑм избиÑаÑелÑноÑÑи, на коÑоÑом оÑновано пÑедÑказание колиÑеÑÑва ÑÑÑок. |
targets | ÐогаÑиÑм колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ñзла плана запÑоÑа. |
reliability | РавнознаÑно:
|
oids | СпиÑок иденÑиÑикаÑоÑов ÑаблиÑ, коÑоÑÑе ÑÑаÑÑвовали в пÑедÑказании Ð´Ð»Ñ ÑÑого Ñзла. |
F.3.3.2.4. aqo_query_stat
РпÑедÑÑавлении aqo_query_stat оÑобÑажаеÑÑÑ ÑÑаÑиÑÑика вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, гÑÑппиÑÑÐµÐ¼Ð°Ñ Ð¿Ð¾ клаÑÑам запÑоÑов. РаÑÑиÑение aqo иÑполÑзÑÐµÑ ÑÑи даннÑе, когда Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов вклÑÑено ÑвойÑÑво auto_tuning.
ТаблиÑа F.5. ÐÑедÑÑавление aqo_query_stat
| ÐаннÑе | ÐпиÑание |
|---|---|
execution_time_with_aqo | ÐÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñо вклÑÑÑннÑм aqo. |
execution_time_without_aqo | ÐÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¾ÑклÑÑÑннÑм aqo. |
planning_time_with_aqo | ÐÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñо вклÑÑÑннÑм aqo. |
planning_time_without_aqo | ÐÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¾ÑклÑÑÑннÑм aqo. |
cardinality_error_with_aqo | ÐÑибка оÑенки колиÑеÑÑва ÑÑÑок в Ð¿Ð»Ð°Ð½Ð°Ñ Ð·Ð°Ð¿ÑоÑов, вÑбÑаннÑÑ Ñо вклÑÑÑннÑм aqo. |
cardinality_error_without_aqo | ÐÑибка оÑенки колиÑеÑÑва ÑÑÑок в Ð¿Ð»Ð°Ð½Ð°Ñ Ð·Ð°Ð¿ÑоÑов, вÑбÑаннÑÑ Ñ Ð¾ÑклÑÑÑннÑм aqo. |
executions_with_aqo | ЧиÑло запÑоÑов, вÑполненнÑÑ Ñо вклÑÑÑннÑм aqo. |
executions_without_aqo | ЧиÑло запÑоÑов, вÑполненнÑÑ Ñ Ð¾ÑклÑÑÑннÑм aqo. |
F.3.3.3. ФÑнкÑии
ÐодÑÐ»Ñ aqo добавлÑÐµÑ Ð½ÐµÑколÑко ÑÑнкÑий в каÑалог Postgres Pro.
F.3.3.3.1. ФÑнкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ ÑанилиÑем
Ðажно
ФÑнкÑии aqo_queries_update, aqo_query_texts_update, aqo_query_stat_update и aqo_data_update изменÑÑÑ ÑÐ°Ð¹Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, на коÑоÑÑÑ
оÑÐ½Ð¾Ð²Ð°Ð½Ñ ÑооÑвеÑÑÑвÑÑÑие пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo. ÐоÑÑÐ¾Ð¼Ñ Ð²ÑзÑвайÑе ÑÑи ÑÑнкÑии ÑолÑко в Ñом ÑлÑÑае, еÑли Ð²Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑе Ð»Ð¾Ð³Ð¸ÐºÑ Ð°Ð´Ð°Ð¿Ñивной опÑимизаÑии запÑоÑов.
aqo_cleanup() âsetof integerУдалÑÐµÑ Ð´Ð°Ð½Ð½Ñе, оÑноÑÑÑиеÑÑ Ðº клаÑÑам запÑоÑов, коÑоÑÑе ÑвÑÐ·Ð°Ð½Ñ (возможно ÑаÑÑиÑно) Ñ ÑдалÑннÑми оÑноÑениÑми. ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑдалÑннÑÑ Ð¿ÑоÑÑÑанÑÑв пÑизнаков (клаÑÑов) и подпÑоÑÑÑанÑÑв пÑизнаков. ÐгноÑиÑÑÐµÑ Ñдаление дÑÑÐ³Ð¸Ñ Ð¾Ð±ÑекÑов.
aqo_enable_class(queryidbigint) âvoidУÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ
learn_aqo,use_aqoиauto_tuning(ÑолÑко в Ñежимеintelligent) знаÑение true Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов.aqo_disable_class(queryidbigint) âvoidУÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ
learn_aqo,use_aqoиauto_tuning(ÑолÑко в Ñежимеintelligent) знаÑение false Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов.aqo_drop_class(queryidbigint) âintegerУдалÑÐµÑ Ð²Ñе даннÑе, оÑноÑÑÑиеÑÑ Ðº Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð·Ð°Ð¿ÑоÑов, из Ñ ÑанилиÑа aqo. ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запиÑей, ÑдалÑннÑÑ Ð¸Ð· Ñ ÑанилиÑа aqo.
aqo_reset() âbigintУдалÑÐµÑ ÑледÑÑÑие даннÑе из Ñ ÑанилиÑа aqo: даннÑе маÑинного обÑÑениÑ, ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов, ÑвойÑÑва опÑимизаÑии Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов запÑоÑов и ÑÑаÑиÑÑикÑ. ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запиÑей, ÑдалÑннÑÑ Ð¸Ð· Ñ ÑанилиÑа aqo.
aqo_queries_update(queryidbigint,fsbigint,learn_aqoboolean,use_aqoboolean,auto_tuningboolean) âbooleanÐÑиÑÐ²Ð°Ð¸Ð²Ð°ÐµÑ Ð½Ð¾Ð²Ñе знаÑÐµÐ½Ð¸Ñ ÑледÑÑÑим паÑамеÑÑам в пÑедÑÑавлении aqo_queries Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов:
fspace_hash,learn_aqo,use_aqoиauto_tuning. ÐнаÑение NULL ознаÑÐ°ÐµÑ Â«Ð¾ÑÑавиÑÑ ÐºÐ°Ðº еÑÑÑ».aqo_query_texts_update(queryidbigint,query_texttext) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ добавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл, на коÑоÑом оÑновано пÑедÑÑавление aqo_query_texts, Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾
queryid.aqo_query_stat_update(queryidbigint,execution_time_with_aqodouble precision[],execution_time_without_aqodouble precision[],planning_time_with_aqodouble precision[],planning_time_without_aqodouble precision[],cardinality_error_with_aqodouble precision[],cardinality_error_without_aqodouble precision[],executions_with_aqobigint[],executions_without_aqobigint[]) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ добавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл, на коÑоÑом оÑновано пÑедÑÑавление aqo_query_stat, Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾
queryid.aqo_data_update(fsbigint,fssinteger,nfeaturesinteger,featuresdouble precision[][],targetsdouble precision[],reliabilitydouble precision[],oidsoid[]) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ добавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл, на коÑоÑом оÑновано пÑедÑÑавление aqo_data, Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
fsиfss.
F.3.3.3.2. ФÑнкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ
aqo_memory_usage() âsetof recordÐÑобÑÐ°Ð¶Ð°ÐµÑ ÑазмеÑÑ ÐºÐ¾Ð½ÑекÑÑов памÑÑи и Ñ ÐµÑ-ÑÐ°Ð±Ð»Ð¸Ñ aqo.
F.3.3.3.3. ФÑнкÑии аналиÑики
aqo_cardinality_error(controlledboolean) âsetof recordÐоказÑÐ²Ð°ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. ÐÑли
controlledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, показÑÐ²Ð°ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¾Ñенки Ð´Ð»Ñ Ð¿Ð¾Ñледнего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð²ÐºÐ»ÑÑÑннÑм aqo. ÐÑлиcontrolledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение false, возвÑаÑÐ°ÐµÑ ÑÑеднÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаннÑÑ Ð² жÑÑнал вÑполнений запÑоÑов Ñ Ð¾ÑклÑÑÑннÑм aqo.aqo_execution_time(controlledboolean) âsetof recordÐоказÑÐ²Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. ÐÑли
controlledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, показÑÐ²Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего запÑоÑа Ñ Ð²ÐºÐ»ÑÑÑннÑм aqo. ÐÑлиcontrolledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение false, возвÑаÑÐ°ÐµÑ ÑÑеднее вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаннÑÑ Ð² жÑÑнал вÑполнений Ñ Ð¾ÑклÑÑÑннÑм aqo.
F.3.4. ÐÑимеÑÑ
ÐÑÐ¸Ð¼ÐµÑ F.1. ÐбÑÑение на запÑоÑе
РаÑÑмоÑÑим опÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¸ÑполÑзованием ÑаÑÑиÑÐµÐ½Ð¸Ñ aqo.
Ðогда запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð² пеÑвÑй Ñаз, его Ð½ÐµÑ Ð² ÑаблиÑаÑ
, лежаÑиÑ
в оÑнове пÑедÑÑавлений aqo. Таким обÑазом, даннÑÑ
Ð´Ð»Ñ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ aqo Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана неÑ, и в вÑводе EXPLAIN поÑвлÑÑÑÑÑ ÑÑÑоки «AQO not used»:
postgres=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF) select count(*) from score join course on score.cno=course.cno join student on score.sno=student.sno where degree<90 and test_preparation = 0;
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Aggregate (cost=308.28..308.29 rows=1 width=8) (actual rows=1 loops=1)
AQO not used, fss=0
-> Hash Join (cost=124.80..299.47 rows=3526 width=0) (actual rows=3649 loops=1)
AQO not used, fss=2128507884
Hash Cond: (score.sno = student.sno)
-> Hash Join (cost=16.30..181.70 rows=3526 width=4) (actual rows=3649 loops=1)
AQO not used, fss=-303037802
Hash Cond: (score.cno = course.cno)
-> Seq Scan on score (cost=0.00..156.00 rows=3526 width=8) (actual rows=3649 loops=1)
AQO not used, fss=-636613046
Filter: ((degree < 90) AND (test_preparation = 0))
Rows Removed by Filter: 1351
-> Hash (cost=12.80..12.80 rows=280 width=4) (actual rows=10 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> Seq Scan on course (cost=0.00..12.80 rows=280 width=4) (actual rows=10 loops=1)
AQO not used, fss=-1076069505
-> Hash (cost=71.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 138kB
-> Seq Scan on student (cost=0.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
AQO not used, fss=-1838231581
Using aqo: true
AQO mode: LEARN
Query hash: -727505571757520766
JOINS: 2
(24 rows)
ÐÑли в пÑедÑÑавлении aqo_data Ð½ÐµÑ Ð¸Ð½ÑоÑмаÑии об опÑеделÑнном Ñзле, aqo Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ð² него ÑооÑвеÑÑÑвÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего изÑÑÐµÐ½Ð¸Ñ Ð¸ пÑедÑказаниÑ, за иÑклÑÑением Ñзлов Ñ fss=0 в вÑводе EXPLAIN. ÐоÑколÑÐºÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² полÑÑ
features и targets в пÑедÑÑавлении aqo_data ÑвлÑÑÑÑÑ Ð»Ð¾Ð³Ð°ÑиÑмом по оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ e, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑакÑиÑеÑкое знаÑение, возведиÑе e в ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑепенÑ. ÐапÑимеÑ: exp(0):
fs | fss | nfeatures | features | targets | reliability | oids
---------------------+-------------+-----------+------------------------------------------------------------------------------------+---------------------+-------------+---------------------
-727505571757520766 | 2128507884 | 4 | {{-0.03438753143452488,-5.634789603169249,-0.3149847743198556,-8.006367567650246}} | {8.202208436436448} | {1} | {16579,16555,16563}
-727505571757520766 | -1076069505 | 0 | | {2.302585092994046} | {1} | {16555}
-727505571757520766 | -1838231581 | 0 | | {8.006367567650246} | {1} | {16563}
-727505571757520766 | -303037802 | 3 | {{-0.03438753143452488,-5.634789603169249,-0.3149847743198556}} | {8.202208436436448} | {1} | {16579,16555}
-727505571757520766 | -636613046 | 2 | {{-0.03438753143452488,-0.3149847743198556}} | {8.202208436436448} | {1} | {16579}
(6 rows)
Ðогда запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð²Ð¾ вÑоÑой Ñаз, aqo ÑаÑпознаÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¸ Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑказание. ÐбÑаÑиÑе внимание на оÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, пÑедÑказаннÑÑ aqo, и знаÑение оÑибки aqo («error=0%»).
postgres=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF) select count(*) from score join course on score.cno=course.cno join student on score.sno=student.sno where degree<90 and test_preparation = 0;
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Aggregate (cost=305.86..305.87 rows=1 width=8) (actual rows=1 loops=1)
AQO not used, fss=0
-> Hash Join (cost=121.42..296.74 rows=3649 width=0) (actual rows=3649 loops=1)
AQO: rows=3649, error=0%, fss=2128507884
Hash Cond: (score.sno = student.sno)
-> Hash Join (cost=12.93..178.65 rows=3649 width=4) (actual rows=3649 loops=1)
AQO: rows=3649, error=0%, fss=-303037802
Hash Cond: (score.cno = course.cno)
-> Seq Scan on score (cost=0.00..156.00 rows=3649 width=8) (actual rows=3649 loops=1)
AQO: rows=3649, error=0%, fss=-636613046
Filter: ((degree < 90) AND (test_preparation = 0))
Rows Removed by Filter: 1351
-> Hash (cost=12.80..12.80 rows=10 width=4) (actual rows=10 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> Seq Scan on course (cost=0.00..12.80 rows=10 width=4) (actual rows=10 loops=1)
AQO: rows=10, error=0%, fss=-1076069505
-> Hash (cost=71.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 138kB
-> Seq Scan on student (cost=0.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
AQO: rows=3000, error=0%, fss=-1838231581
Using aqo: true
AQO mode: LEARN
Query hash: -727505571757520766
JOINS: 2
(24 rows)
Ð ÑлÑÑае оÑибки знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ features и targets Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑÑÑ, но поÑколÑÐºÑ Ð¾Ñибки вÑÑе не бÑло, они не изменилиÑÑ.
fs | fss | nfeatures | features | targets | reliability | oids
---------------------+-------------+-----------+------------------------------------------------------------------------------------+---------------------+-------------+---------------------
-727505571757520766 | 2128507884 | 4 | {{-0.03438753143452488,-5.634789603169249,-0.3149847743198556,-8.006367567650246}} | {8.202208436436448} | {1} | {16579,16555,16563}
-727505571757520766 | -1076069505 | 0 | | {2.302585092994046} | {1} | {16555}
-727505571757520766 | -1838231581 | 0 | | {8.006367567650246} | {1} | {16563}
-727505571757520766 | -303037802 | 3 | {{-0.03438753143452488,-5.634789603169249,-0.3149847743198556}} | {8.202208436436448} | {1} | {16579,16555}
-727505571757520766 | -636613046 | 2 | {{-0.03438753143452488,-0.3149847743198556}} | {8.202208436436448} | {1} | {16579}
(6 rows)
Ðзменив конÑÑанÑÑ Ð² запÑоÑе, можно замеÑиÑÑ, ÑÑо пÑедÑказание Ñделано Ñ Ð¾Ñибкой:
postgres=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF) select count(*) from score join course on score.cno=course.cno join student on score.sno=student.sno where degree<80 and test_preparation = 0;
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Aggregate (cost=305.86..305.87 rows=1 width=8) (actual rows=1 loops=1)
AQO not used, fss=0
-> Hash Join (cost=121.42..296.74 rows=3649 width=0) (actual rows=3551 loops=1)
AQO: rows=3649, error=3%, fss=2128507884
Hash Cond: (score.sno = student.sno)
-> Hash Join (cost=12.93..178.65 rows=3649 width=4) (actual rows=3551 loops=1)
AQO: rows=3649, error=3%, fss=-303037802
Hash Cond: (score.cno = course.cno)
-> Seq Scan on score (cost=0.00..156.00 rows=3649 width=8) (actual rows=3551 loops=1)
AQO: rows=3649, error=3%, fss=-636613046
Filter: ((degree < 80) AND (test_preparation = 0))
Rows Removed by Filter: 1449
-> Hash (cost=12.80..12.80 rows=10 width=4) (actual rows=10 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> Seq Scan on course (cost=0.00..12.80 rows=10 width=4) (actual rows=10 loops=1)
AQO: rows=10, error=0%, fss=-1076069505
-> Hash (cost=71.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 138kB
-> Seq Scan on student (cost=0.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
AQO: rows=3000, error=0%, fss=-1838231581
Using aqo: true
AQO mode: LEARN
Query hash: -727505571757520766
JOINS: 2
(24 rows)
Ðднако вмеÑÑо пеÑеÑÑÑÑа полей features и targets, aqo добавил новÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð±Ð¸ÑаÑелÑноÑÑи и оÑенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ ÑÑого запÑоÑа в aqo_data:
fs | fss | nfeatures | features | targets | reliability | oids
---------------------+-------------+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------+-------------+---------------------
-727505571757520766 | 1141621836 | 0 | | {0} | {1} | {16579,16555,16563}
-727505571757520766 | 2128507884 | 4 | {{-0.030949078292235133,-5.634789603169249,-0.3149847743198556,-8.006367567650246},{-0.34221288089027607,-5.634789603169249,-0.3149847743198556,-8.006367567650246}} | {8.202208436436448,8.174984532943087} | {1,1} | {16579,16555,16563}
-727505571757520766 | -1076069505 | 0 | | {2.302585092994046} | {1} | {16555}
-727505571757520766 | -1838231581 | 0 | | {8.006367567650246} | {1} | {16563}
-727505571757520766 | -303037802 | 3 | {{-0.030949078292235133,-5.634789603169249,-0.3149847743198556},{-0.34221288089027607,-5.634789603169249,-0.3149847743198556}} | {8.202208436436448,8.174984532943087} | {1,1} | {16579,16555}
-727505571757520766 | -636613046 | 2 | {{-0.030949078292235133,-0.3149847743198556},{-0.34221288089027607,-0.3149847743198556}}
ТепеÑÑ Ð² пÑедÑказании Ð½ÐµÑ Ð¾Ñибок:
postgres=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF) select count(*) from score join course on score.cno=course.cno join student on score.sno=student.sno where degree<80 and test_preparation = 0;
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Aggregate (cost=305.10..305.11 rows=1 width=8) (actual rows=1 loops=1)
AQO not used, fss=0
-> Hash Join (cost=121.42..296.22 rows=3551 width=0) (actual rows=3551 loops=1)
AQO: rows=3551, error=0%, fss=2128507884
Hash Cond: (score.sno = student.sno)
-> Hash Join (cost=12.93..178.39 rows=3551 width=4) (actual rows=3551 loops=1)
AQO: rows=3551, error=0%, fss=-303037802
Hash Cond: (score.cno = course.cno)
-> Seq Scan on score (cost=0.00..156.00 rows=3551 width=8) (actual rows=3551 loops=1)
AQO: rows=3551, error=0%, fss=-636613046
Filter: ((degree < 80) AND (test_preparation = 0))
Rows Removed by Filter: 1449
-> Hash (cost=12.80..12.80 rows=10 width=4) (actual rows=10 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 9kB
-> Seq Scan on course (cost=0.00..12.80 rows=10 width=4) (actual rows=10 loops=1)
AQO: rows=10, error=0%, fss=-1076069505
-> Hash (cost=71.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
Buckets: 4096 Batches: 1 Memory Usage: 138kB
-> Seq Scan on student (cost=0.00..71.00 rows=3000 width=4) (actual rows=3000 loops=1)
AQO: rows=3000, error=0%, fss=-1838231581
Using aqo: true
AQO mode: LEARN
Query hash: -727505571757520766
JOINS: 2
(24 rows)
ÐÑÐ¸Ð¼ÐµÑ F.2. ÐÑполÑзование пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_stat
РпÑедÑÑавлении aqo_query_stat оÑобÑажаеÑÑÑ ÑÑаÑиÑÑика вÑемени планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, вÑемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов и оÑибок оÑенки колиÑеÑÑва ÑÑÑок. Ðа оÑновании ÑÑиÑ
даннÑÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑинимаÑÑ ÑеÑÐµÐ½Ð¸Ñ Ð¾Ð± иÑполÑзовании пÑедÑказаний aqo Ð´Ð»Ñ ÑазлиÑнÑÑ
клаÑÑов запÑоÑов.
ÐбÑаÑимÑÑ Ðº пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_stats:
select queryid, cardinality_error_with_aqo, cardinality_error_without_aqo,execution_time_with_aqo, execution_time_without_aqo, planning_time_with_aqo, planning_time_without_aqo from aqo_query_stat \gx
-[ RECORD 1 ]-----------------+------------------------------------------------------------------------------------------------------------
queryid | 8041624334006338922
cardinality_error_with_aqo | {0.14932737556062836,0,0.507421202801325,0.00040469447777891077}
cardinality_error_without_aqo | {0.1493979460962751,0.018403615483185476}
execution_time_with_aqo | {0.004760108,0.008743075,0.006608304,0.012392751}
execution_time_without_aqo | {0.005775926,0.012730316}
planning_time_with_aqo | {0.006927997,0.004247339,0.005005022,0.004169717}
planning_time_without_aqo | {0.001783542,0.001706121} ÐолÑÑеннÑе даннÑе оÑноÑÑÑÑÑ Ðº запÑоÑÑ, ÑаÑÑмоÑÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð² пÑимеÑе ÐÑимеÑ F.1. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑполнÑлÑÑ Ñ ÐºÐ°Ð¶Ð´Ñм из паÑамеÑÑов degree<80 и degree<90 по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ°Ð·Ñ Ð±ÐµÐ· aqo и по два Ñаза Ñ aqo. Ðидно, ÑÑо Ñ aqo погÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок ÑменÑÑаеÑÑÑ Ð´Ð¾ 0,0004, а минималÑÐ½Ð°Ñ Ð¿Ð¾Ð³ÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок без aqo ÑоÑÑавлÑÐµÑ 0,15. ÐÑоме Ñого, вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ aqo менÑÑе, Ñем без него. Таким обÑазом, можно ÑделаÑÑ Ð²Ñвод, ÑÑо aqo Ñ
оÑоÑо обÑÑаеÑÑÑ Ð½Ð° ÑÑом запÑоÑе и пÑедÑказание можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÑого клаÑÑа запÑоÑов.
F.3.5. ÐвÑоÑ
Ðлег Ðванов