F.2. aqo â опÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов по ÑÑоимоÑÑи вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ #
ÐодÑÐ»Ñ aqo пÑедÑÑавлÑÐµÑ Ñобой ÑаÑÑиÑение Postgres Pro Standard Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии запÑоÑов по ÑÑоимоÑÑи вÑполнениÑ. ÐÑполÑзÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°Ñинного обÑÑениÑ, а ÑоÑнее модиÑикаÑÐ¸Ñ Ð°Ð»Ð³Ð¾ÑиÑма k-NN, aqo ÑлÑÑÑÐ°ÐµÑ Ð¾ÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑпоÑобÑÑвоваÑÑ Ð²ÑбоÑÑ Ð»ÑÑÑего плана и, как ÑледÑÑвие, ÑÑкоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
F.2.1. ÐпиÑание #
ÐодÑÐ»Ñ aqo Ð¼Ð¾Ð¶ÐµÑ ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем вÑполнÑемÑм запÑоÑам, за иÑклÑÑением запÑоÑов, обÑаÑаÑÑÐ¸Ñ ÑÑ Ðº ÑиÑÑемнÑм оÑноÑениÑм. ÐÑли запÑоÑÑ ÑазлиÑаÑÑÑÑ ÑолÑко конÑÑанÑами, они ÑÑиÑаÑÑÑÑ Ð¾ÑноÑÑÑимиÑÑ Ðº Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа модÑÐ»Ñ aqo ÑÐ¾Ñ ÑанÑÐµÑ Ð´Ð»Ñ Ð¼Ð°Ñинного обÑÑÐµÐ½Ð¸Ñ ÐºÐ°ÑеÑÑво оÑенки колиÑеÑÑва ÑÑÑок, вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, вÑÐµÐ¼Ñ Ð¸ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑполнениÑ. Ðа оÑнове ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ aqo ÑÑÑÐ¾Ð¸Ñ Ð½Ð¾Ð²Ñй план вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ иÑполÑзÑÐµÑ ÐµÐ³Ð¾ Ð´Ð»Ñ ÑледÑÑÑего запÑоÑа Ñого же клаÑÑа. Ð ÑеÑÑÐ°Ñ aqo показал знаÑиÑелÑное ÑвелиÑение пÑоизводиÑелÑноÑÑи Ð´Ð»Ñ ÑложнÑÑ Ð·Ð°Ð¿ÑоÑов.
ÐодÑÐ»Ñ aqo ÑÐ¾Ñ ÑанÑÐµÑ Ð²Ñе даннÑе обÑÑÐµÐ½Ð¸Ñ (aqo_data), запÑоÑÑ (aqo_query_texts), паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑов (aqo_queries) и ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов (aqo_query_stat) в ÑÐ°Ð¹Ð»Ð°Ñ . ÐÑи запÑÑке aqo ÑÑи даннÑе загÑÑжаÑÑÑÑ Ð² ÑазделÑемÑÑ Ð¿Ð°Ð¼ÑÑÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе обÑаÑаÑÑÑÑ Ðº даннÑм aqo, иÑполÑзÑÑ ÑÑнкÑии и пÑедÑÑавлениÑ.
ÐÑи вклÑÑÑнном паÑамеÑÑе aqo.advanced и запÑÑке aqo в Ñежиме intelligent или learn ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð·Ð°Ð¿ÑоÑов Ð´Ð»Ñ ÐµÐ³Ð¾ иденÑиÑикаÑии и ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÑобÑанной ÑÑаÑиÑÑики пÑиÑваиваеÑÑÑ ÑникалÑное Ñ
еÑ-знаÑение, вÑÑиÑлÑемое на оÑнове деÑева запÑоÑов. ÐÑли aqo.advanced оÑклÑÑÑн, ÑÑаÑиÑÑика Ð´Ð»Ñ Ð²ÑеÑ
неоÑÑлеживаемÑÑ
клаÑÑов запÑоÑов Ñ
ÑаниÑÑÑ Ð² обÑем клаÑÑе запÑоÑов Ñ Ñ
еÑем 0.
С каждÑм клаÑÑом запÑоÑов ÑвÑзано оÑделÑное пÑоÑÑÑанÑÑво, назÑваемое пÑоÑÑÑанÑÑвом пÑизнаков, в коÑоÑом ÑобиÑаеÑÑÑ ÑÑаÑиÑÑика Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. ÐÐ»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии ÑÑого пÑоÑÑÑанÑÑва пÑизнаков иÑполÑзÑеÑÑÑ Ñ
еÑ-знаÑение (fs), назÑваемое оÑновнÑм Ñ
еÑ-знаÑением. Ðно ÑвлÑеÑÑÑ Ð¾Ð±Ñим Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, оÑлиÑаÑÑиÑ
ÑÑ ÑолÑко именами ÑаблиÑ, ÑÑо позволÑÐµÑ Ð°Ð³ÑегиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе обÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñаким запÑоÑам. С каждÑм пÑоÑÑÑанÑÑвом пÑизнаков ÑвÑÐ·Ð°Ð½Ñ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков, в коÑоÑÑÑ
ÑобиÑаеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± избиÑаÑелÑноÑÑи и колиÑеÑÑве ÑÑÑок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана запÑоÑа. ÐÐ»Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑии каждого подпÑоÑÑÑанÑÑва Ñакже иÑполÑзÑеÑÑÑ Ñ
еÑ-знаÑение (fss).
ÐаÑамеÑÑÑ Ð¾Ð¿ÑимизаÑии Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑоÑа Ñ ÑанÑÑÑÑ Ð² пÑедÑÑавлении aqo_queries.
F.2.1.1. ÐгÑаниÑÐµÐ½Ð¸Ñ #
РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑаÑÑиÑение aqo Ð¸Ð¼ÐµÐµÑ ÑледÑÑÑие огÑаниÑениÑ:
ÐпÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¸ÑполÑзованием aqo не поддеÑживаеÑÑÑ Ð½Ð° ведомÑÑ ÑеÑвеÑÐ°Ñ .
ÐпÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¸ÑполÑзованием aqo не поддеÑживаеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, обÑаÑаÑÑÐ¸Ñ ÑÑ ÑолÑко к вÑеменнÑм обÑекÑам.
ÐпÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð¸ÑполÑзованием aqo не поддеÑживаеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, ÑодеÑжаÑÐ¸Ñ ÑÑнкÑии
IMMUTABLE.ÐодÑÐ»Ñ aqo не ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ Ñепликам, поÑколÑÐºÑ Ð¾Ð½Ð¸ доÑÑÑÐ¿Ð½Ñ ÑолÑко Ð´Ð»Ñ ÑÑениÑ. Ðднако он Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов Ñ Ð²ÐµÐ´ÑÑего ÑеÑвеÑа пÑи ÑабоÑе Ñ ÑизиÑеÑкой Ñепликой.
РежимÑ
learnиintelligentне Ð´Ð¾Ð»Ð¶Ð½Ñ ÑабоÑаÑÑ Ð½Ð° ÑÑовне клаÑÑеÑа Ñ Ð·Ð°Ð¿ÑоÑами, имеÑÑими динамиÑеÑки генеÑиÑÑемÑÑ ÑÑÑÑкÑÑÑÑ, поÑколÑÐºÑ Ð² ÑÑÐ¸Ñ ÑÐµÐ¶Ð¸Ð¼Ð°Ñ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð²Ñе иденÑиÑикаÑоÑÑ ÐºÐ»Ð°ÑÑов запÑоÑов, коÑоÑÑе ÑазлиÑÐ½Ñ Ð´Ð»Ñ Ð²ÑÐµÑ ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑов. Тем не менее могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки генеÑиÑÑемÑе конÑÑанÑÑ.
F.2.2. УÑÑановка и подгоÑовка #
РаÑÑиÑение aqo вклÑÑено в ÑоÑÑав Postgres Pro Standard. УÑÑановив Postgres Pro Standard, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑÑ aqo к ÑабоÑе:
ÐобавÑÑе
aqoв паÑамеÑÑ shared_preload_libraries в Ñайлеpostgresql.conf:shared_preload_libraries = 'aqo'
ÐиблиоÑÐµÐºÑ aqo нÑжно пÑедваÑиÑелÑно загÑÑзиÑÑ Ð¿Ñи запÑÑке ÑеÑвеÑа, Ñак как адапÑÐ¸Ð²Ð½Ð°Ñ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов должна бÑÑÑ Ð²ÐºÐ»ÑÑена Ð´Ð»Ñ Ð²Ñего клаÑÑеÑа.
СоздайÑе ÑаÑÑиÑение aqo, вÑполнив ÑледÑÑÑий запÑоÑ:
CREATE EXTENSION aqo;
Ðогда ÑаÑÑиÑение бÑÐ´ÐµÑ Ñоздано, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑиÑÑÑпиÑÑ Ðº опÑимизаÑии запÑоÑов.
ЧÑÐ¾Ð±Ñ Ð¾ÑклÑÑиÑÑ aqo в ÑекÑÑей базе даннÑÑ , вÑполниÑе:
DROP EXTENSION aqo;
ЧÑÐ¾Ð±Ñ Ð¾ÑклÑÑиÑÑ aqo на ÑÑовне клаÑÑеÑа, вÑполниÑе ÑледÑÑÑее:
ALTER SYSTEM SET aqo.enable = off; SELECT pg_reload_conf();
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ Ð²Ñе даннÑе из Ñ
ÑанилиÑа aqo, вклÑÑÐ°Ñ ÑобÑаннÑÑ ÑÑаÑиÑÑикÑ, вÑзовиÑе ÑÑнкÑÐ¸Ñ aqo_reset(). ЧÑÐ¾Ð±Ñ ÑдалиÑÑ Ð´Ð°Ð½Ð½Ñе из ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, вÑполниÑе
SELECT aqo_reset();
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ Ð²Ñе даннÑе из Ñ ÑанилиÑа aqo, вÑполниÑе
SELECT aqo_reset(NULL);
ЧÑÐ¾Ð±Ñ ÑаÑÑиÑение aqo не загÑÑжалоÑÑ Ð¿Ñи пеÑезапÑÑке ÑеÑвеÑа, ÑдалиÑе ÑÑÑокÑ
shared_preload_libraries = 'aqo'
из Ñайла postgresql.conf.
Ðажно
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¾Ñибок во вÑÐµÐ¼Ñ ÑизиÑеÑкой ÑепликаÑии пÑи пеÑеноÑе даннÑÑ
aqo Ñ Ð²ÐµÐ´ÑÑего ÑеÑвеÑа на ÑепликÑ, ÑбедиÑеÑÑ, ÑÑо на ÑеÑвеÑаÑ
ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе веÑÑии модÑлÑ. ÐÑли ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑазнÑе веÑÑии aqo, необÑ
одимо задаÑÑ Ð·Ð½Ð°Ñение off Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа aqo.wal_rw на обоиÑ
ÑеÑвеÑаÑ
, однако в Ñаком ÑлÑÑае ÑепликаÑÐ¸Ñ Ð²ÑполнÑÑÑÑÑ Ð½Ðµ бÑдеÑ.
F.2.2.1. ÐонÑигÑÑиÑование #
Ðоведение aqo в оÑновном ÑегÑлиÑÑеÑÑÑ Ð¿Ð°ÑамеÑÑами конÑигÑÑаÑии aqo.enable, aqo.mode и aqo.advanced. ÐнаÑÐµÐ½Ð¸Ñ ÑÑиÑ
паÑамеÑÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð½Ð°ÑаÑÑ Ð¾Ð±ÑÑение aqo в оÑновном Ñежиме, как ÑолÑко Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа aqo.enable ÑÑÑанавливаеÑÑÑ Ð·Ð½Ð°Ñение on.
ЧÑÐ¾Ð±Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки измениÑÑ Ð² ÑекÑÑем ÑеанÑе лÑбой из ÑÑÐ¸Ñ Ð¿Ð°ÑамеÑÑов, напÑÐ¸Ð¼ÐµÑ Ñежим, вÑполниÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SET aqo.mode = 'Ñежим';
ÐдеÑÑ Ñежим â название Ñежима ÑабоÑÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ.
F.2.3. ÐÑполÑзование #
F.2.3.1. ÐÑполÑзование оÑновного Ñежима aqo #
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑ aqo.advanced оÑклÑÑÑн. ÐÑи ÑÑом ÑÑÑанавливаеÑÑÑ ÑекомендÑемÑй оÑновной Ñежим, в коÑоÑом ÑÑаÑиÑÑика ÑобиÑаеÑÑÑ Ð´Ð»Ñ Ñзлов плана (опÑеделÑемÑÑ
fss), а ÑобÑаннÑе даннÑе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¸ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð³ÑеÑноÑÑей оÑенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ð²ÑеÑ
запÑоÑов, план коÑоÑÑÑ
ÑодеÑÐ¶Ð¸Ñ Ð¾Ð¿ÑеделÑннÑй Ñзел плана. Ðак ÑолÑко Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа aqo.enable ÑÑÑанавливаеÑÑÑ Ð·Ð½Ð°Ñение on, aqo наÑÐ¸Ð½Ð°ÐµÑ Ð¾Ð±ÑÑение. СледÑÐµÑ Ð½ÐµÑколÑко Ñаз вÑполниÑÑ Ð·Ð°Ð¿ÑоÑÑ, коÑоÑÑе необÑ
одимо опÑимизиÑоваÑÑ, пока план не ÑÑÐ°Ð½ÐµÑ Ð´Ð¾ÑÑаÑоÑно Ñ
оÑоÑим, и измениÑÑ Ð·Ð½Ð°Ñение паÑамеÑÑа aqo.mode на frozen. ЧÑÐ¾Ð±Ñ Ð¿ÑимениÑÑ Ð´Ð°Ð½Ð½Ñе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑовне ÑкземплÑÑа ÑеÑвеÑа, вÑполниÑе ÑледÑÑÑие командÑ:
ALTER SYSTEM SET aqo.mode = frozen; ALTER SYSTEM SET aqo.enable = on; SELECT pg_reload_conf();
ÐаннÑе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð±ÑдÑÑ Ð¿ÑименÑÑÑÑÑ Ð½Ðµ ÑолÑко к запÑоÑам, на коÑоÑÑÑ
обÑÑалÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ aqo, но Ñакже ко вÑем запÑоÑам Ñ Ð¿Ð»Ð°Ð½Ð¾Ð¼, ÑодеÑжаÑим ÑзлÑ, по коÑоÑÑм ÑобиÑалаÑÑ ÑÑаÑиÑÑика. ЧÑÐ¾Ð±Ñ Ð´Ð°Ð½Ð½Ñе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð½Ðµ влиÑли на дÑÑгие запÑоÑÑ, ÑÑÑановиÑе Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа aqo.advanced знаÑение on, и ÑÑаÑиÑÑика бÑÐ´ÐµÑ ÑобиÑаÑÑÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
запÑоÑов. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.2.3.2.
F.2.3.2. ÐÑÐ±Ð¾Ñ Ñежима ÑабоÑÑ Ð´Ð»Ñ ÑаÑÑиÑенной опÑимизаÑии запÑоÑов #
ÐÑли ÑаÑÑо вÑполнÑÑÑÑÑ Ð¾Ð´Ð½Ð¾ÑипнÑе запÑоÑÑ, напÑимеÑ, в пÑиложении огÑаниÑено ÑиÑло возможнÑÑ
клаÑÑов запÑоÑов, можно вклÑÑиÑÑ Ð¿Ð°ÑамеÑÑ aqo.advanced и иÑполÑзоваÑÑ Ð¸Ð½ÑеллекÑÑалÑнÑй Ñежим (intelligent) Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑакиÑ
запÑоÑов. Ð ÑÑом Ñежиме aqo анализиÑÑÐµÑ Ð²Ñполнение каждого запÑоÑа и ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑикÑ. ÐÑи ÑÑом ÑÑаÑиÑÑика по ÑазнÑм клаÑÑам запÑоÑов ÑобиÑаеÑÑÑ Ð¾ÑделÑно. ÐÑли пÑоизводиÑелÑноÑÑÑ Ð½Ðµ ÑвелиÑиваеÑÑÑ Ð¿Ð¾Ñле 50 иÑеÑаÑий, ÑаÑÑиÑение aqo оÑклÑÑаеÑÑÑ, и планиÑование вÑполнÑеÑÑÑ ÑÑандаÑÑнÑм планиÑовÑиком запÑоÑов.
ÐÑимеÑание
Ðожно поÑмоÑÑеÑÑ ÑекÑÑий план запÑоÑа, воÑполÑзовавÑиÑÑ ÑÑандаÑÑной командой Postgres Pro EXPLAIN Ñ Ñказанием ANALYZE. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 14.1.
Так как в Ñежиме intelligent ÑазлиÑнÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов анализиÑÑÑÑÑÑ Ð¾ÑделÑно, aqo Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑлÑÑÑиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ, еÑли запÑоÑÑ Ð² ÑабоÑей нагÑÑзке оÑноÑÑÑÑÑ Ðº неÑколÑким ÑазнÑм клаÑÑам или поÑÑоÑнно менÑÑÑÑÑ. ÐÐ»Ñ Ñакого пÑоÑÐ¸Ð»Ñ Ð½Ð°Ð³ÑÑзки ÑÑÐ¾Ð¸Ñ Ð¿ÐµÑевеÑÑи aqo в Ñежим controlled или попÑобоваÑÑ Ð¾ÑклÑÑиÑÑ Ð¿Ð°ÑамеÑÑ aqo.advanced.
Ðогда вклÑÑÑн паÑамеÑÑ aqo.advanced, в Ñежиме controlled ÑаÑÑиÑение aqo не ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ
клаÑÑов запÑоÑов, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð¸ не бÑдÑÑ Ð¾Ð¿ÑимизиÑованÑ, но Ð´Ð»Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ
клаÑÑов запÑоÑов aqo пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÑобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¸ иÑполÑзоваÑÑ Ð¾Ð¿ÑимизиÑованнÑе алгоÑиÑÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ. ÐоÑÑÐ¾Ð¼Ñ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñежим controlled ÑолÑко поÑле обÑÑÐµÐ½Ð¸Ñ aqo в Ñежиме learn или intelligent.
ÐоÑле Ñого, как aqo пÑоÑло обÑÑение, ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ñежим controlled Ð´Ð»Ñ ÑабоÑей ÑÑедÑ. ЧÑÐ¾Ð±Ñ aqo ÑабоÑало в ÑÑом Ñежиме на ÑÑовне вÑего пÑоизводÑÑвенного клаÑÑеÑа, вÑполниÑе
ALTER SYSTEM SET aqo.mode = 'controlled'; SELECT pg_reload_conf();
ÐÑи вклÑÑÑнном паÑамеÑÑе aqo.advanced ÑаÑÑиÑение в Ñежиме learn ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем вÑполненнÑм запÑоÑам и обновлÑÐµÑ Ð´Ð°Ð½Ð½Ñе Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов запÑоÑов. ÐÑÐ¾Ñ Ñежим аналогиÑен ÑÐµÐ¶Ð¸Ð¼Ñ intelligent, за иÑклÑÑением возможноÑÑи инÑеллекÑÑалÑной наÑÑÑойки. Ðго не ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾ÑÑоÑнно Ð´Ð»Ñ Ð²Ñего клаÑÑеÑа, поÑколÑÐºÑ Ð¾Ð½ пÑÑаеÑÑÑ Ð¾Ð¿ÑимизиÑоваÑÑ aqo Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑов, даже Ð´Ð»Ñ ÑеÑ
, коÑоÑÑм ÑÑо не нÑжно, и Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ненÑжнÑм вÑÑиÑлиÑелÑнÑм издеÑжкам и ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи.
ÐÐ»Ñ ÑабоÑей нагÑÑзки Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки генеÑиÑÑемой ÑÑÑÑкÑÑÑой запÑоÑов иÑполÑзÑйÑе Ñежим learn Ñ Ð¾ÑклÑÑÑннÑм паÑамеÑÑом. ÐбÑее ÑлÑÑÑение пÑоизводиÑелÑноÑÑи не гаÑанÑиÑÑеÑÑÑ. ÐоÑколÑÐºÑ Ð² ÑÑом Ñежиме оÑÑÑÑÑÑвÑÐµÑ Ð¸Ð½ÑеллекÑÑалÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка, пÑоизводиÑелÑноÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ
запÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð´Ð°Ð¶Ðµ ÑнизиÑÑÑÑ, однако он болÑÑе подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки менÑÑÑейÑÑ Ð½Ð°Ð³ÑÑзки и поÑÑеблÑÐµÑ Ð¼ÐµÐ½ÑÑе памÑÑи, Ñем Ñежим intelligent.
Ðогда паÑамеÑÑ aqo.advanced вклÑÑÑн, aqo в Ñежиме auto ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº в Ñежиме learn, но Ñежим auto пÑедоÑвÑаÑÐ°ÐµÑ Ð¿ÐµÑеполнение памÑÑи, ÑеализÑÑ Ð¼ÐµÑ
анизм вÑÑеÑÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· кеÑа давно неиÑполÑзÑемÑÑ
(LRU, least recently used) даннÑÑ
. ÐÑÐ¾Ñ Ð¼ÐµÑ
анизм гаÑанÑиÑÑеÑ, ÑÑо огÑаниÑÐµÐ½Ð¸Ñ aqo.dsm_size_max и aqo.fss_max_items не бÑдÑÑ Ð¿ÑевÑÑÐµÐ½Ñ Ð¿Ñи ÑоÑ
Ñанении вÑ
одÑÑиÑ
запÑоÑов. ÐÑи вÑзове ÑÑнкÑии aqo_query_texts_update в ÑÑом Ñежиме aqo не ÑоÑ
ÑанÑÐµÑ ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов и не оÑÐ²Ð¾Ð±Ð¾Ð¶Ð´Ð°ÐµÑ Ð¸ÑполÑзÑемÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкÑÑ ÑазделÑемÑÑ Ð¿Ð°Ð¼ÑÑÑ.
ÐаÑамеÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии aqo.delta_rows Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ в ÑлÑÑае Ñ Ð´Ð°Ð½Ð½Ñми, коÑоÑÑе могÑÑ ÑÑÑеÑÑвенно изменÑÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°Ð¿ÑоÑами. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ aqo делаÑÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° оÑнове оÑенки колиÑеÑÑва ÑÑÑок планиÑовÑика. ÐапÑимеÑ, планиÑовÑик оÑÐµÐ½Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÐ½ÑÑее ÑиÑло ÑÑÑок пÑи Ñдалении даннÑÑ
из ÑаблиÑÑ. РаÑÑиÑение aqo Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑннÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑедÑказаÑÑ Ð¼ÐµÐ½ÑÑее ÑиÑло ÑÑÑок без необÑ
одимоÑÑи дополниÑелÑного обÑÑениÑ.
ÐÑли Ð²Ñ Ñ
оÑиÑе ÑменÑÑиÑÑ Ð²Ð»Ð¸Ñние aqo на вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ñежим frozen. Ð ÑÑом Ñежиме aqo ÑолÑко ÑиÑÐ°ÐµÑ ÑобÑаннÑÑ ÑÑаÑиÑÑикÑ, но новÑе даннÑе не ÑобиÑаÑÑÑÑ.
F.2.3.3. Ð¢Ð¾Ð½ÐºÐ°Ñ Ð½Ð°ÑÑÑойка aqo #
ÐÐ»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº пÑедÑÑавлениÑм aqo и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑаÑÑиÑеннÑÑ ÑвойÑÑв запÑоÑов Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð¿Ñава ÑÑпеÑполÑзоваÑелÑ.
ÐÑе обÑабоÑаннÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов и ÑооÑвеÑÑÑвÑÑÑие Ñ ÐµÑ-знаÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑвидеÑÑ Ð² пÑедÑÑавлении aqo_query_texts:
SELECT * FROM aqo_query_texts;
ЧÑÐ¾Ð±Ñ ÑзнаÑÑ ÐºÐ»Ð°ÑÑ (Ñо еÑÑÑ Ñ ÐµÑ) запÑоÑа и Ñежим aqo, вклÑÑиÑе пеÑеменнÑе ÑÑÐµÐ´Ñ aqo.show_hash (boolean) и aqo.show_details (boolean) и вÑполниÑе запÑоÑ. ÐÑвод бÑÐ´ÐµÑ Ð¿ÑимеÑно ÑледÑÑÑим:
... Planning Time: 23.538 ms ... Execution Time: 249813.875 ms ... Using aqo: true AQO mode: LEARN AQO advanced: OFF ... Query hash: -2439501042637610315
РазнÑе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов имеÑÑ ÑобÑÑвеннÑе ÑвойÑÑва опÑимизаÑии. ÐÑи ÑвойÑÑва оÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлении aqo_queries:
SELECT * FROM aqo_queries;
Ðожно вÑÑÑнÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÑÑи ÑвойÑÑва, ÑÑÐ¾Ð±Ñ ÑкоÑÑекÑиÑоваÑÑ Ð¾Ð¿ÑимизаÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов. ÐапÑимеÑ:
-- Ðобавление нового клаÑÑа запÑоÑов в пÑедÑÑавление aqo_queries: SET aqo.enable='on'; SET aqo.advanced='on'; SET aqo.mode='intelligent'; SELECT * FROM a, b WHERE a.id=b.id; SET aqo.mode='controlled'; -- ÐÑклÑÑение авÑонаÑÑÑойки, вклÑÑение learn_aqo и use_aqo -- Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов: SELECT count(*) FROM aqo_queries, LATERAL aqo_queries_update(fs, NULL, true, true, false) WHERE fs = (SELECT fs 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 aqo_queries, LATERAL aqo_queries_update(fs, NULL, false, true, false) WHERE fs = (SELECT fs FROM aqo_query_texts WHERE query_text LIKE 'SELECT * FROM a, b WHERE a.id=b.id;');
ЧÑÐ¾Ð±Ñ Ð¿ÑедоÑвÑаÑиÑÑ Ð¸Ð½ÑеллекÑÑалÑнÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов, оÑклÑÑиÑе ÑвойÑÑво auto_tuning:
SELECT count(*) FROM aqo_queries, LATERAL aqo_queries_update(fs, NULL, NULL, NULL, false) WHERE fs = 'hash';
ÐдеÑÑ Ñ
ÐµÑ â ÑÑо знаÑение Ñ
еÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. Ð ÑезÑлÑÑаÑе aqo не бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки менÑÑÑ ÑвойÑÑва learn_aqo и use_aqo.
ЧÑÐ¾Ð±Ñ Ð¾ÑклÑÑиÑÑ Ð´Ð°Ð»ÑнейÑее обÑÑение Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого клаÑÑа запÑоÑов, вÑполниÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
SELECT count(*) FROM aqo_queries, LATERAL aqo_queries_update(fs, NULL, false, NULL, false) WHERE fs = 'hash';
ÐдеÑÑ Ñ
ÐµÑ â ÑÑо знаÑение Ñ
еÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾ÑклÑÑиÑÑ aqo Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов и иÑполÑзоваÑÑ ÑÑандаÑÑнÑй планиÑовÑик Postgres Pro, вÑполниÑе:
SELECT count(*) FROM aqo_queries, LATERAL aqo_disable_class(fs, NULL) WHERE fs <> 0;
ЧÑÐ¾Ð±Ñ Ð²Ñеменно оÑклÑÑиÑÑ aqo Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов в ÑекÑÑем ÑеанÑе или на ÑÑовне вÑего клаÑÑеÑа, но не ÑдалÑÑÑ Ð¸ не изменÑÑÑ ÑобÑаннÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¸ паÑамеÑÑÑ, оÑклÑÑиÑе паÑамеÑÑ aqo.enable, как Ñказано ниже:
SET aqo.enable = 'off';
или
ALTER SYSTEM SET aqo.enable = 'off'
F.2.3.4. Режим «пеÑоÑниÑÑ» #
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑкÑпеÑименÑиÑоваÑÑ Ñ aqo, не заÑÑÐ°Ð³Ð¸Ð²Ð°Ñ ÐµÐ³Ð¾ оÑновнÑÑ Ð±Ð°Ð·Ñ Ð·Ð½Ð°Ð½Ð¸Ð¹. ÐÐ»Ñ ÑÑого вÑполниÑе командÑ
SET aqo.sandbox = ON;
Ðна вклÑÑÐ¸Ñ Ñежим «пеÑоÑниÑÑ», в коÑоÑом aqo бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð² изолиÑованной ÑÑеде. Ðднако еÑли вклÑÑиÑÑ aqo.sandbox в ÑазнÑÑ ÑеанÑÐ°Ñ SQL, они бÑдÑÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð´Ð½Ð¸ и Ñе же даннÑе.
ÐаннÑе, полÑÑеннÑе в Ñежиме «пеÑоÑниÑÑ», не ÑеплиÑиÑÑÑÑÑÑ. Ðо Ñежим «пеÑоÑниÑÑ» можно иÑполÑзоваÑÑ Ð½Ð° ведомом ÑеÑвеÑе. Ðолее Ñого, единÑÑвеннÑй ÑпоÑоб обÑÑиÑÑ aqo на ведомом ÑеÑвеÑе â вклÑÑиÑÑ Ñежим «пеÑоÑниÑÑ» пÑи вклÑÑÑнной ÑепликаÑии, Ñо еÑÑÑ Ð¿Ñи знаÑении true Ð´Ð»Ñ aqo.wal_rw. Ðез Ñежима «пеÑоÑниÑÑ» aqo бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð½Ð° ведомом ÑеÑвеÑе Ñак, как бÑдÑо aqo.mode = FROZEN, Ñо еÑÑÑ ÑÐ¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑÑеÑÑвÑÑÑÑÑ Ð±Ð°Ð·Ñ Ð·Ð½Ð°Ð½Ð¸Ð¹, но не ÑÐ¼Ð¾Ð¶ÐµÑ ÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ Ð¸Ð»Ð¸ ÑаÑÑиÑÑÑÑ.
F.2.4. СпÑавка #
F.2.4.1. ÐаÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии #
aqo.enable(boolean) #ÐпÑеделÑÐµÑ ÑоÑÑоÑние ÑаÑÑиÑÐµÐ½Ð¸Ñ aqo. ÐÑли ÑÑÑановлено знаÑение
off, aqo не ÑабоÑаеÑ, за иÑклÑÑением ÑлÑÑаев, когда паÑамеÑÑ aqo.force_collect_stat =on.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.mode(text) #УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñежим ÑабоÑÑ aqo и опÑеделÑеÑ, как ÑаÑÑиÑение бÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð½Ð¾Ð²Ñе запÑоÑÑ. ÐозможнÑе знаÑениÑ:
intelligentâ ÑаÑÑиÑение ÑÐ¾Ñ ÑанÑÐµÑ Ð½Ð¾Ð²Ñе запÑоÑÑ Ñ Ð²ÐºÐ»ÑÑÑннÑмauto_tuning. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_queries. Рданном Ñежиме aqo Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑклÑÑиÑÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа в ÑлÑÑае ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑÑедней пÑоизводиÑелÑноÑÑи. ÐÑÐ¾Ñ Ñежим ÑабоÑÐ°ÐµÑ Ñаким обÑазом, ÑолÑко еÑли паÑамеÑÑ aqo.advanced =on, в пÑоÑивном ÑлÑÑае ÑабоÑÐ°ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно ÑежимÑlearn.learnâ ÑаÑÑиÑение ÑобиÑÐ°ÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ вÑем вÑполненнÑм запÑоÑам, обÑÑаеÑÑÑ Ð¸ Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° оÑнове ÑÑой ÑÑаÑиÑÑики.controlledâ ÑаÑÑиÑение ÑолÑко обÑÑаеÑÑÑ Ð¸ Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ Ð·Ð°Ð¿ÑоÑов.frozenâ ÑаÑÑиÑение Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ Ð·Ð°Ð¿ÑоÑов, но не обÑÑаеÑÑÑ Ð½Ð¸ на ÐºÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ .autoâ ÑабоÑÐ°ÐµÑ ÐºÐ°Ðºlearn, но пÑедоÑвÑаÑÐ°ÐµÑ Ð¿ÐµÑеполнение памÑÑи, ÑеализÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ вÑÑеÑÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· кеÑа давно неиÑполÑзÑемÑÑ (LRU, least recently used) даннÑÑ .
Ðо ÑмолÑаниÑ:
learn.aqo.advanced(boolean) #ÐклÑÑÐ°ÐµÑ ÑаÑÑиÑеннÑÑ Ð¿ÑоÑедÑÑÑ Ð¾Ð±ÑÑениÑ, коÑоÑÐ°Ñ ÑÐ¾Ñ ÑанÑÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¾Ð±ÑÑÐµÐ½Ð¸Ñ Ð¾ÑделÑно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑа. Также позволÑÐµÑ Ð½Ð°ÑÑÑаиваÑÑ Ð¿Ð°ÑамеÑÑÑ
use_aqoиlearn_aqoв пÑедÑÑавлении aqo_queries. ÐоÑле Ñонкой наÑÑÑойки паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑа в пÑедÑÑавленииaqo_queryпÑодолжаÑÑ ÑабоÑаÑÑ Ð¿Ñи вÑклÑÑенном паÑамеÑÑеaqo.advanced.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.force_collect_stat(boolean) #СобиÑаÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов во вÑÐµÑ ÑÐµÐ¶Ð¸Ð¼Ð°Ñ aqo даже пÑи
aqo.enable=off.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.show_details(boolean) #ÐобавлÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе деÑали в вÑвод командÑ
EXPLAINзапÑоÑа, Ñакие как пÑедÑказание или Ñ ÐµÑ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков, и оÑобÑажаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑпеÑиÑиÑнÑÑ Ð´Ð»Ñ aqo.Ðо ÑмолÑаниÑ:
on(вкл.).aqo.show_hash(boolean) #ÐоказÑваÑÑ Ñ ÐµÑ-знаÑение, однознаÑно иденÑиÑиÑиÑÑÑÑее клаÑÑ Ð·Ð°Ð¿ÑоÑов или клаÑÑ Ñзлов плана. РаÑÑиÑение aqo иÑполÑзÑÐµÑ Ð² каÑеÑÑве иденÑиÑикаÑоÑа клаÑÑа запÑоÑа иденÑиÑикаÑÐ¾Ñ Ñамого Postgres Pro, ÑÑÐ¾Ð±Ñ Ð¾Ð±ÐµÑпеÑиÑÑ ÑоглаÑованноÑÑÑ Ñ Ð´ÑÑгими ÑаÑÑиÑениÑми, Ñакими как pg_stat_statements. Таким обÑазом, иденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа можно полÑÑиÑÑ Ð¸Ð· полÑ
Query hashв вÑводе командÑEXPLAIN ANALYZE.Ðо ÑмолÑаниÑ:
on(вкл.).aqo.join_threshold(integer) #ÐгноÑиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ, ÑодеÑжаÑие колиÑеÑÑво Ñоединений менÑÑе Ñказанного, Ñо еÑÑÑ ÑÑаÑиÑÑика Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑов не ÑобиÑаеÑÑÑ.
Ðо ÑмолÑаниÑ:
0(запÑоÑÑ Ð½Ðµ игноÑиÑÑÑÑÑÑ).aqo.learn_statement_timeout(boolean) #ÐбÑÑаÑÑÑÑ Ð½Ð° Ð¿Ð»Ð°Ð½Ð°Ñ Ð·Ð°Ð¿ÑоÑов, пÑеÑваннÑÑ Ð¿Ð¾ Ñайм-аÑÑÑ Ð¾Ð¿ÐµÑаÑоÑа.
Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.statement_timeout(integer) #ÐпÑеделÑÐµÑ Ð½Ð°ÑалÑное знаÑение Ñак назÑваемого «Ñмного» Ñайм-аÑÑа опеÑаÑоÑов в миллиÑекÑÐ½Ð´Ð°Ñ , коÑоÑÑй Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð²Ñемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи ÑÑÑном обÑÑении aqo на ÑпеÑиалÑнÑÑ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ñ Ð½ÐµÑдовлеÑвоÑиÑелÑнÑм пÑогнозом колиÑеÑÑва ÑÑÑок. РаÑÑиÑение aqo Ð¼Ð¾Ð¶ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки изменÑÑÑ ÑмнÑй Ñайм-аÑÑ Ð¾Ð¿ÐµÑаÑоÑов во вÑÐµÐ¼Ñ ÑÑого обÑÑениÑ. Ðогда погÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок на ÑÐ·Ð»Ð°Ñ Ð¿ÑевÑÑÐ°ÐµÑ 0.1, знаÑение
aqo.statement_timeoutавÑомаÑиÑеÑки ÑвелиÑиваеÑÑÑ ÑкÑпоненÑиалÑно, но не пÑевÑÑÐ°ÐµÑ statement_timeout.Ðо ÑмолÑаниÑ:
0.aqo.wide_search(boolean) #ÐклÑÑÐ°ÐµÑ Ð¿Ð¾Ð¸Ñк ÑоÑедей Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же подпÑоÑÑÑанÑÑвом пÑизнаков ÑÑеди ÑазнÑÑ ÐºÐ»Ð°ÑÑов запÑоÑов. РабоÑаеÑ, ÑолÑко еÑли паÑамеÑÑ aqo.advanced =
on.Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.min_neighbors_for_predicting(integer) #ÐпÑеделÑеÑ, ÑколÑко вÑбоÑок, ÑобÑаннÑÑ Ð¿Ñи пÑедÑдÑÑÐ¸Ñ Ð²ÑполнениÑÑ Ð·Ð°Ð¿ÑоÑа, бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿ÑогнозиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñенки колиÑеÑÑва ÑÑÑок в ÑледÑÑÑий Ñаз. ÐÑли колиÑеÑÑво вÑбоÑок менÑÑе заданного знаÑениÑ, aqo не бÑÐ´ÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð¿ÑедÑказаний. СлиÑком болÑÑое знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»Ð¸ÑÑÑ Ð½Ð° пÑоизводиÑелÑноÑÑÑ, а ÑлиÑком маленÑкое â ÑнизиÑÑ ÐºÐ°ÑеÑÑво пÑедÑказаниÑ.
Ðо ÑмолÑаниÑ:
3.aqo.predict_with_few_neighbors(boolean) #ÐозволÑÐµÑ aqo делаÑÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ Ð¼ÐµÐ½ÑÑим колиÑеÑÑвом ÑоÑедей, Ñем Ñказано в паÑамеÑÑе aqo.min_neighbors_for_predicting. ÐÑли ÑÑÑановлено знаÑение
off, aqo обÑÑаеÑÑÑ, но не Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´Ð¾ ÑÐµÑ Ð¿Ð¾Ñ, пока ÑÑÑÑÑик вÑполнений запÑоÑа Ñ ÑазнÑми конÑÑанÑами не доÑÑÐ¸Ð³Ð½ÐµÑ 3 (по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñaqo.min_neighbors_for_predicting).Ðо ÑмолÑаниÑ:
on(вкл.).aqo.fs_max_items(integer) #ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво пÑоÑÑÑанÑÑв пÑизнаков, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ aqo. ÐÑи пÑевÑÑении ÑÑого колиÑеÑÑва обÑÑение на новÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð·Ð°Ð¿ÑоÑов пÑекÑаÑиÑÑÑ, и они не бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлениÑÑ . ÐадаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.
Ðо ÑмолÑаниÑ:
10000.aqo.fss_max_items(integer) #ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑное колиÑеÑÑво подпÑоÑÑÑанÑÑв пÑизнаков, Ñ ÐºÐ¾ÑоÑÑми Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ aqo. ÐÑи пÑевÑÑении ÑÑого колиÑеÑÑва даннÑе об избиÑаÑелÑноÑÑи и пÑедÑказание колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ñзлов плана запÑоÑа болÑÑе не бÑдÑÑ ÑобиÑаÑÑÑÑ Ð¸ новÑе подпÑоÑÑÑанÑÑва пÑизнаков не бÑдÑÑ Ð¾ÑобÑажаÑÑÑÑ Ð² пÑедÑÑавлении aqo_data. ÐадаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.
Ðо ÑмолÑаниÑ:
100000.aqo.querytext_max_size(integer) #ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа в пÑедÑÑавлении aqo_query_texts. ÐадаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.
Ðо ÑмолÑаниÑ:
1000.aqo.dsm_size_max(integer) #ÐпÑеделÑÐµÑ Ð¼Ð°ÐºÑималÑнÑй ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкой ÑазделÑемой памÑÑи в мегабайÑÐ°Ñ , коÑоÑÑÑ Ð¼Ð¾Ð´ÑÐ»Ñ aqo Ð¼Ð¾Ð¶ÐµÑ Ð²ÑделиÑÑ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¾Ð±ÑÑÐµÐ½Ð¸Ñ Ð¸ ÑекÑÑов запÑоÑов. ÐÑли ÑÑÑановленное знаÑение менÑÑе обÑÑма ÑÐ¾Ñ ÑанÑннÑÑ Ð´Ð°Ð½Ð½ÑÑ aqo, ÑеÑÐ²ÐµÑ Ð½Ðµ запÑÑÑиÑÑÑ. ÐадаÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.
Ðо ÑмолÑаниÑ:
100.aqo.wal_rw(boolean) #ÐклÑÑÐ°ÐµÑ ÑизиÑеÑкÑÑ ÑепликаÑÐ¸Ñ Ð¸ обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ воÑÑÑановление даннÑÑ aqo поÑле ÑбоÑ. ÐÑи знаÑении
offна ведÑÑем ÑеÑвеÑе даннÑе на ÑÐµÐ¿Ð»Ð¸ÐºÑ Ð½Ðµ пеÑедаÑÑÑÑ. ÐÑи знаÑенииoffна Ñеплике даннÑе, пеÑедаваемÑе Ñ Ð²ÐµÐ´ÑÑего ÑеÑвеÑа, игноÑиÑÑÑÑÑÑ. Ð Ñаком ÑлÑÑае пÑи Ñбое ÑеÑвеÑа даннÑе могÑÑ Ð±ÑÑÑ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ ÑолÑко до поÑледней конÑÑолÑной ÑоÑки. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ ÑолÑко пÑи запÑÑке ÑеÑвеÑа.Ðо ÑмолÑаниÑ:
on(вкл.).aqo.sandbox(boolean) #ÐозволÑÐµÑ ÑезеÑвиÑоваÑÑ Ð¾ÑделÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð² обÑей памÑÑи Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÐ´ÑÑим или ведомÑм Ñзлом, ÑÑо позволÑÐµÑ ÑобиÑаÑÑ Ð¸ иÑполÑзоваÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ñ Ð´Ð°Ð½Ð½Ñми в ÑÑой облаÑÑи памÑÑи. ÐÑли вклÑÑÑн на ведомом Ñзле, ÑаÑÑиÑение иÑполÑзÑÐµÑ Ð¾ÑделÑнÑÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð¾Ð±Ñей памÑÑи, коÑоÑÐ°Ñ Ð½Ðµ ÑеплиÑиÑÑеÑÑÑ Ð½Ð° ведомÑй ÑеÑвеÑ. Ðзменение знаÑÐµÐ½Ð¸Ñ ÑÑого паÑамеÑÑа ÑбÑаÑÑÐ²Ð°ÐµÑ ÐºÐµÑ aqo. ÐзмениÑÑ ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.
Ðо ÑмолÑаниÑ:
off(вÑкл.).aqo.delta_rows(boolean) #ÐклÑÑÐ°ÐµÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ обÑÑениÑ, пÑи коÑоÑом aqo коÑÑекÑиÑÑÐµÑ Ð¾ÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок планиÑовÑика Ñвоими пÑедÑказаниÑми. ÐÑли паÑамеÑÑ Ð²ÑклÑÑен, aqo иÑполÑзÑÐµÑ ÑобÑÑвеннÑе пÑедÑказаниÑ.
Ðо ÑмолÑаниÑ:
off(вÑкл.).
F.2.4.2. ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ #
F.2.4.2.1. aqo_query_texts #
РпÑедÑÑавлении aqo_query_texts клаÑÑиÑиÑиÑÑÑÑÑÑ Ð²Ñе клаÑÑÑ Ð·Ð°Ð¿ÑоÑов, обÑабаÑÑваемÑе aqo. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клаÑÑа запÑоÑов в пÑедÑÑавлении оÑобÑажаеÑÑÑ ÑекÑÑ Ð¿ÐµÑвого пÑоанализиÑованного запÑоÑа ÑÑого клаÑÑа.
ТаблиÑа F.1. ÐÑедÑÑавление aqo_query_texts
| ÐÐ¼Ñ ÑÑолбÑа | ÐпиÑание |
|---|---|
queryid | УникалÑнÑй иденÑиÑикаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа. |
dbid | ÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . |
fs | ÐденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. |
query_text | ТекÑÑ Ð¿ÐµÑвого пÑоанализиÑованного запÑоÑа данного клаÑÑа. Ðлина ÑекÑÑа запÑоÑа огÑаниÑиваеÑÑÑ Ð¿Ð°ÑамеÑÑом aqo.querytext_max_size. |
F.2.4.2.2. aqo_queries #
РпÑедÑÑавлении aqo_queries оÑобÑажаÑÑÑÑ ÑвойÑÑва опÑимизаÑии Ð´Ð»Ñ ÑазнÑÑ
клаÑÑов запÑоÑов. Ðдин запÑоÑ, вÑполненнÑй в двÑÑ
ÑазнÑÑ
базаÑ
даннÑÑ
, ÑоÑ
ÑанÑеÑÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм иденÑиÑикаÑоÑом запÑоÑа (fs).
ТаблиÑа F.2. ÐÑедÑÑавление aqo_queries
| СвойÑÑво | ÐпиÑание |
|---|---|
fs | ÐденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. |
dbid | ÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , в коÑоÑой вÑполнÑлÑÑ Ð·Ð°Ð¿ÑоÑ. |
learn_aqo | ÐоказÑваеÑ, вклÑÑÑн ли ÑÐ±Ð¾Ñ ÑÑаÑиÑÑики Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
use_aqo | ÐоказÑваеÑ, вклÑÑено ли пÑедÑказание колиÑеÑÑва ÑÑÑок ÑÑедÑÑвами aqo Ð´Ð»Ñ ÑледÑÑÑего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
auto_tuning | ÐоказÑваеÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ aqo динамиÑеÑки изменÑÑÑ Ð¿Ð°ÑамеÑÑÑ ÐÑи вклÑÑÑнном ÑвойÑÑве ÐапÑоÑÑ Ñ |
smart_timeout | ÐнаÑение «Ñмного» Ñайм-аÑÑа опеÑаÑоÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. ÐаÑалÑное знаÑение Ñакого Ñайм-аÑÑа Ð´Ð»Ñ Ð»Ñбого запÑоÑа опÑеделÑеÑÑÑ Ð¿Ð°ÑамеÑÑом конÑигÑÑаÑии statement_timeout. |
count_increase_timeout | ÐоказÑваеÑ, ÑколÑко Ñаз ÑвелиÑивалÑÑ Â«ÑмнÑй» Ñайм-аÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ клаÑÑа запÑоÑов. |
F.2.4.2.3. aqo_data #
РпÑедÑÑавлении aqo_data оÑобÑажаÑÑÑÑ Ð´Ð°Ð½Ð½Ñе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑоÑÐ½ÐµÐ½Ð¸Ñ Ð¾Ñенки колиÑеÑÑва ÑÑÑок. ÐолиÑеÑÑво ÑÑÑок огÑаниÑено паÑамеÑÑом aqo.fss_max_items. ЧÑÐ¾Ð±Ñ ÑбÑоÑиÑÑ Ð²ÑÑ ÑобÑаннÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов, можно ÑдалиÑÑ Ð¸Ð· пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_data вÑе ÑÑÑоки Ñ ÑооÑвеÑÑÑвÑÑÑим fs.
ТаблиÑа F.3. ÐÑедÑÑавление aqo_data
| ÐаннÑе | ÐпиÑание |
|---|---|
fs | ÐденÑиÑикаÑÐ¾Ñ (Ñ ÐµÑ) пÑоÑÑÑанÑÑва пÑизнаков. |
fss | ÐденÑиÑикаÑÐ¾Ñ (Ñ ÐµÑ) подпÑоÑÑÑанÑÑва пÑизнаков. |
dbid | ÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . |
delta_rows | ÐÑли true, aqo Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ð° оÑнове оÑенки планиÑовÑика; в пÑоÑивном ÑлÑÑае false. |
nfeatures | Ð Ð°Ð·Ð¼ÐµÑ Ð¿Ð¾Ð´Ð¿ÑоÑÑÑанÑÑва пÑизнаков Ð´Ð»Ñ Ñзла плана запÑоÑа. |
features | ÐогаÑиÑм избиÑаÑелÑноÑÑи, на коÑоÑом оÑновано пÑедÑказание колиÑеÑÑва ÑÑÑок. |
targets | ÐогаÑиÑм колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ñзла плана запÑоÑа. |
reliability | УÑÐ¾Ð²ÐµÐ½Ñ Ð´Ð¾ÑÑовеÑноÑÑи ÑÑаÑиÑÑики обÑÑениÑ:
|
oids | СпиÑок иденÑиÑикаÑоÑов ÑаблиÑ, коÑоÑÑе ÑÑаÑÑвовали в пÑедÑказании Ð´Ð»Ñ ÑÑого Ñзла. |
tmpoids | СпиÑок иденÑиÑикаÑоÑов вÑеменнÑÑ ÑаблиÑ, коÑоÑÑе ÑÑаÑÑвовали в пÑедÑказании Ð´Ð»Ñ ÑÑого Ñзла. |
F.2.4.2.4. aqo_query_stat #
РпÑедÑÑавлении aqo_query_stat оÑобÑажаеÑÑÑ ÑÑаÑиÑÑика вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, гÑÑппиÑÑÐµÐ¼Ð°Ñ Ð¿Ð¾ клаÑÑам запÑоÑов. РаÑÑиÑение aqo иÑполÑзÑÐµÑ ÑÑи даннÑе, когда Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного клаÑÑа запÑоÑов вклÑÑено ÑвойÑÑво auto_tuning.
ТаблиÑа F.4. ÐÑедÑÑавление aqo_query_stat
| ÐаннÑе | ÐпиÑание |
|---|---|
fs | ÐденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. |
dbid | ÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . |
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.2.4.3. ФÑнкÑии #
ÐодÑÐ»Ñ aqo добавлÑÐµÑ Ð½ÐµÑколÑко ÑÑнкÑий в каÑалог Postgres Pro.
F.2.4.3.1. ФÑнкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ ÑанилиÑем #
Ðажно
ФÑнкÑии aqo_queries_update, aqo_query_texts_update, aqo_query_stat_update, aqo_data_update и aqo_data_delete изменÑÑÑ ÑÐ°Ð¹Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
, на коÑоÑÑÑ
оÑÐ½Ð¾Ð²Ð°Ð½Ñ ÑооÑвеÑÑÑвÑÑÑие пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo. ÐоÑÑÐ¾Ð¼Ñ Ð²ÑзÑвайÑе ÑÑи ÑÑнкÑии ÑолÑко в Ñом ÑлÑÑае, еÑли Ð²Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑе Ð»Ð¾Ð³Ð¸ÐºÑ Ð°Ð´Ð°Ð¿Ñивной опÑимизаÑии запÑоÑов.
aqo_cleanup() âsetof integerУдалÑÐµÑ Ð´Ð°Ð½Ð½Ñе, оÑноÑÑÑиеÑÑ Ðº клаÑÑам запÑоÑов, коÑоÑÑе ÑвÑÐ·Ð°Ð½Ñ (возможно ÑаÑÑиÑно) Ñ ÑдалÑннÑми оÑноÑениÑми. ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑдалÑннÑÑ Ð¿ÑоÑÑÑанÑÑв пÑизнаков (клаÑÑов) и подпÑоÑÑÑанÑÑв пÑизнаков. ÐгноÑиÑÑÐµÑ Ñдаление дÑÑÐ³Ð¸Ñ Ð¾Ð±ÑекÑов.
aqo_enable_class(fsbigint,dbidoid) âvoidУÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ
learn_aqo,use_aqoиauto_tuning(ÑолÑко в Ñежимеintelligent) знаÑение true Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа запÑоÑов Ñ ÑказаннÑмиfsиdbid. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .aqo_disable_class(fsbigint,dbidoid) âvoidУÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð´Ð»Ñ
learn_aqo,use_aqoиauto_tuningзнаÑение false Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа запÑоÑов Ñ ÑказаннÑмиfsиdbid. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .aqo_drop_class(fsbigint,dbidoid) âintegerУдалÑÐµÑ Ð²Ñе даннÑе, оÑноÑÑÑиеÑÑ Ðº Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ð·Ð°Ð¿ÑоÑов и базе даннÑÑ , из Ñ ÑанилиÑа aqo. ÐÐ»Ñ Ð¿Ð°ÑамеÑÑа
dbidможно задаÑÑ Ð·Ð½Ð°Ñение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво запиÑей, ÑдалÑннÑÑ Ð¸Ð· Ñ ÑанилиÑа aqo.aqo_reset(dbidoid) âbigintУдалÑÐµÑ Ð·Ð°Ð¿Ð¸Ñи из Ñказанной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ : даннÑе маÑинного обÑÑениÑ, ÑекÑÑÑ Ð·Ð°Ð¿ÑоÑов, ÑÑаÑиÑÑÐ¸ÐºÑ Ð¸ ÑвойÑÑва клаÑÑов запÑоÑов. ÐÑли паÑамеÑÑ
dbidне Ñказан, даннÑе ÑдалÑÑÑÑÑ Ð¸Ð· ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑлиdbidÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение NULL, ÑдалÑÑÑÑÑ Ð²Ñе запиÑи из Ñ ÑанилиÑа aqo. ÐозвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑдалÑннÑÑ Ð·Ð°Ð¿Ð¸Ñей.aqo_queries_update(fsbigint,dbidoid,learn_aqoboolean,use_aqoboolean,auto_tuningboolean) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ вÑÑавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл даннÑÑ , лежаÑий в оÑнове пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_queries, Ð´Ð»Ñ ÑказаннÑÑ
fsиdbid. ÐмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð²dbidможно ÑказаÑÑ NULL. ÐнаÑÐµÐ½Ð¸Ñ NULL Ð´Ð»Ñ Ð¾ÑÑалÑнÑÑ Ð¿Ð°ÑамеÑÑов ознаÑаÑÑ, ÑÑо Ð¸Ñ ÑледÑÐµÑ Ð¾ÑÑавиÑÑ Ð±ÐµÐ· изменений. ÐбÑаÑиÑе внимание, ÑÑо запиÑи Ñ Ð½ÑлевÑм знаÑениемfsилиdbidне могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. ÐозвÑаÑаеÑfalseв ÑлÑÑае оÑибки иtrueв пÑоÑивном ÑлÑÑае.aqo_query_texts_update(fsbigint,dbidoid,query_texttext) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ вÑÑавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл даннÑÑ , лежаÑий в оÑнове пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_texts, Ð´Ð»Ñ ÑказаннÑÑ
fsиdbid. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐбÑаÑиÑе внимание, ÑÑо запиÑи Ñ Ð½ÑлевÑм знаÑениемfsилиdbidне могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. ÐозвÑаÑаеÑfalseв ÑлÑÑае оÑибки иtrueв пÑоÑивном ÑлÑÑае.aqo_query_stat_update(fsbigint,dbidoid,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, Ð´Ð»Ñ ÑказаннÑÑ
fsиdbid. ÐапиÑи Ð´Ð»Ñ Ð¾Ð±Ð¾Ð±Ñенного пÑоÑÑÑанÑÑва пÑизнаков, Ñ Ð½ÑлевÑм знаÑениемfsилиdbid, не могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐозвÑаÑаеÑfalseв ÑлÑÑае оÑибки иtrueв пÑоÑивном ÑлÑÑае.aqo_data_update(fsbigint,fssinteger,dbidoid,delta_rowsboolean,nfeaturesinteger,featuresdouble precision[][],targetsdouble precision[],reliabilitydouble precision[],oidsoid[],tmpoidsoid[]) âbooleanÐзменÑÐµÑ Ð¸Ð»Ð¸ вÑÑавлÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² Ñайл даннÑÑ , лежаÑий в оÑнове пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_data, Ð´Ð»Ñ ÑказаннÑÑ
fs,fssиdbid. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли длÑdelta_rowsзадаÑÑ NULL, бÑÐ´ÐµÑ Ð¸ÑполÑзовано знаÑение паÑамеÑÑа конÑигÑÑаÑииaqo.delta_rows. ÐозвÑаÑаеÑfalseв ÑлÑÑае оÑибки иtrueв пÑоÑивном ÑлÑÑае.aqo_data_delete(fsbigint,fssinteger,dbidoid,delta_rowsboolean) âbooleanУдалÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð· Ñайла даннÑÑ , лежаÑего в оÑнове пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_data, Ð´Ð»Ñ ÑказаннÑÑ
fs,fssиdbid. Ðожно иÑполÑзоваÑÑ Ð´Ð»ÑdbidзнаÑение NULL вмеÑÑо иденÑиÑикаÑоÑа ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли не ÑказаÑÑ Ð¿Ð°ÑамеÑÑdelta_rowsили задаÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ NULL, бÑÐ´ÐµÑ Ð¸ÑполÑзовано знаÑение паÑамеÑÑа конÑигÑÑаÑииaqo.delta_rows. ÐозвÑаÑаеÑfalseв ÑлÑÑае оÑибки иtrueв пÑоÑивном ÑлÑÑае.
F.2.4.3.2. ФÑнкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ #
aqo_memory_usage() âsetof recordÐÑобÑÐ°Ð¶Ð°ÐµÑ Ð²ÑделеннÑе и иÑполÑзованнÑе ÑазмеÑÑ ÐºÐ¾Ð½ÑекÑÑов памÑÑи и Ñ ÐµÑ-ÑÐ°Ð±Ð»Ð¸Ñ aqo. ÐозвÑаÑÐ°ÐµÑ ÑаблиÑÑ Ñо ÑледÑÑÑими ÑÑолбÑами:
nameÐÑаÑкое опиÑание конÑекÑÑа памÑÑи или Ñ ÐµÑ-ÑаблиÑÑ
allocated_sizeÐбÑий ÑÐ°Ð·Ð¼ÐµÑ Ð²Ñделенной памÑÑи
used_sizeÐ Ð°Ð·Ð¼ÐµÑ ÑекÑÑей иÑполÑзÑемой памÑÑи
F.2.4.3.3. ФÑнкÑии Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ñики #
aqo_cardinality_error(controlledboolean) âsetof recordÐоказÑÐ²Ð°ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ Ð¿Ð¾Ñледнего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐÑли
controlledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñениеtrue, показÑÐ²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ, вÑполненнÑе Ñ Ð²ÐºÐ»ÑÑÑннÑм aqo. ÐÑлиcontrolledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñениеfalse, показÑÐ²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ, вÑполненнÑе Ñ Ð¾ÑклÑÑÑннÑм aqo, но имеÑÑие накопленнÑÑ ÑÑаÑиÑÑикÑ. ÐозвÑаÑÐ°ÐµÑ ÑаблиÑÑ Ñо ÑледÑÑÑими ÑÑолбÑами:numÐоÑÑдковÑй номеÑ
dbidÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
fsÐденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. ÐÐ¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ оÑновное Ñ ÐµÑ-знаÑение.
errorÐогÑеÑноÑÑÑ aqo, ÑаÑÑÑиÑÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð½Ð° ÑÐ·Ð»Ð°Ñ Ð¿Ð»Ð°Ð½Ð¾Ð² запÑоÑов
nexecsÐолиÑеÑÑво вÑполнений запÑоÑов, ÑвÑзаннÑÑ Ñ Ð´Ð°Ð½Ð½Ñм
fs
aqo_execution_time(controlledboolean) âsetof recordÐоказÑÐ²Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов. ÐÑли
controlledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, показÑÐ²Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего запÑоÑа Ñ Ð²ÐºÐ»ÑÑÑннÑм aqo. ÐÑлиcontrolledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение false, возвÑаÑÐ°ÐµÑ ÑÑеднее вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаннÑÑ Ð² жÑÑнал вÑполнений Ñ Ð¾ÑклÑÑÑннÑм aqo. ÐÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÐµÐ· aqo можно ÑобÑаÑÑ, еÑли паÑамеÑÑ aqo.mode =intelligentили паÑамеÑÑ aqo.force_collect_stat =on. ÐозвÑаÑÐ°ÐµÑ ÑаблиÑÑ Ñо ÑледÑÑÑими ÑÑолбÑами:numÐоÑÑдковÑй номеÑ
dbidÐденÑиÑикаÑÐ¾Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
fsÐденÑиÑикаÑÐ¾Ñ Ð¿ÑоÑÑÑанÑÑва пÑизнаков. ÐÐ¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ оÑновное Ñ ÐµÑ-знаÑение.
exec_timeÐÑли
controlledÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, показÑÐ²Ð°ÐµÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего запÑоÑа Ñ Ð²ÐºÐ»ÑÑÑннÑм aqo, в пÑоÑивном ÑлÑÑае â ÑÑеднее вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ð´Ð»Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿Ð¸ÑаннÑÑ Ð² жÑÑнал вÑполнений Ñ Ð¾ÑклÑÑÑннÑм aqo.nexecsÐолиÑеÑÑво вÑполнений запÑоÑов, ÑвÑзаннÑÑ Ñ Ð´Ð°Ð½Ð½Ñм
fs
F.2.5. ÐÑимеÑÑ #
ÐÑÐ¸Ð¼ÐµÑ F.1. ÐбÑÑение на запÑоÑе (ÐÑновной Ñежим)
РаÑÑмоÑÑим опÑимизаÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¸ÑполÑзованием ÑаÑÑиÑÐµÐ½Ð¸Ñ aqo.
Ðогда запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð² пеÑвÑй Ñаз, его Ð½ÐµÑ Ð² ÑаблиÑаÑ
, лежаÑиÑ
в оÑнове пÑедÑÑавлений aqo. Таким обÑазом, даннÑÑ
Ð´Ð»Ñ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ aqo Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана неÑ, и в вÑводе EXPLAIN поÑвлÑÑÑÑÑ ÑÑÑоки «AQO not used»:
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=63796.33..140286.73 rows=477728 width=25) (actual rows=2215 loops=1)
AQO not used, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO not used, fss=1362775811343989307
-> Hash (cost=51379.43..51379.43 rows=595260 width=22) (actual rows=468255 loops=1)
Buckets: 131072 Batches: 8 Memory Usage: 4223kB
-> Hash Join (cost=1859.80..51379.43 rows=595260 width=22) (actual rows=468255 loops=1)
AQO not used, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO not used, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16560 width=4) (actual rows=16340 loops=1)
Buckets: 32768 Batches: 1 Memory Usage: 831kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16560 width=4) (actual rows=16340 loops=1)
AQO not used, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-15 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 49324
Using aqo: true
AQO mode: LEARN
AQO advanced: OFF
Query hash: 402936317627943257
JOINS: 2
(23 rows)
ÐÑли в пÑедÑÑавлении aqo_data Ð½ÐµÑ Ð¸Ð½ÑоÑмаÑии об опÑеделÑнном Ñзле, aqo Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ Ð² него ÑооÑвеÑÑÑвÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего изÑÑÐµÐ½Ð¸Ñ Ð¸ пÑедÑказаниÑ, за иÑклÑÑением Ñзлов Ñ fss=0 в вÑводе EXPLAIN. ÐоÑколÑÐºÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² полÑÑ
features и targets в пÑедÑÑавлении aqo_data ÑвлÑÑÑÑÑ Ð»Ð¾Ð³Ð°ÑиÑмом по оÑÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ e, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑакÑиÑеÑкое знаÑение, возведиÑе e в ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑепенÑ. ÐапÑимеÑ: exp(7.703007682479236):
demo=# select * from aqo_data;
fs | fss | dbid | delta_rows | nfeatures | features | targets | reliability | oids | tmpoids
----+----------------------+-------+------------+-----------+---------------------------------------------+----------------------+-------------+---------------------+-------
0 | 1362775811343989307 | 16429 | f | 0 | | {14.454357295615447} | {1} | {16452} |
0 | -6410966714754547713 | 16429 | f | 0 | | {14.674314116080508} | {1} | {16479} |
0 | -1289471166524579716 | 16429 | f | 1 | {{-1.3775704575284085}} | {9.701371368413994} | {1} | {16458} |
0 | 8598194613120045129 | 16429 | f | 2 | {{-13.492416828684513,-1.3775704575284085}} | {7.703007682479236} | {1} | {16479,16458,16452} |
0 | -7651474063207585780 | 16429 | f | 2 | {{-11.092306109090387,-1.3775704575284085}} | {13.056768298305919} | {1} | {16479,16458} |
(5 rows)
ÐÑи повÑоÑном вÑполнении запÑоÑа aqo ÑаÑпознаÑÑ ÐµÐ³Ð¾ и Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑедÑказание. ÐбÑаÑиÑе внимание на оÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок, пÑедÑказаннÑÑ aqo, и знаÑение погÑеÑноÑÑи aqo («error=0%»).
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=61144.50..136890.86 rows=2215 width=25) (actual rows=2215 loops=1)
AQO: rows=2215, error=0%, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO: rows=1894295, error=0%, fss=1362775811343989307
-> Hash (cost=51376.68..51376.68 rows=468255 width=22) (actual rows=468255 loops=1)
Buckets: 131072 Batches: 4 Memory Usage: 7438kB
-> Hash Join (cost=1857.05..51376.68 rows=468255 width=22) (actual rows=468255 loops=1)
AQO: rows=468255, error=0%, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO: rows=2360335, error=0%, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16340 width=4) (actual rows=16340 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 703kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16340 width=4) (actual rows=16340 loops=1)
AQO: rows=16340, error=0%, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-15 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 49324
Using aqo: true
AQO mode: LEARN
AQO advanced: OFF
Query hash: 402936317627943257
JOINS: 2
(23 rows)
Ðзменив конÑÑанÑÑ Ð² запÑоÑе, можно замеÑиÑÑ, ÑÑо пÑедÑказание Ñделано Ñ Ð¾Ñибкой:
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-10 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=61144.50..136890.86 rows=2215 width=25) (actual rows=111397 loops=1)
AQO: rows=2215, error=-4929%, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO: rows=1894295, error=0%, fss=1362775811343989307
-> Hash (cost=51376.68..51376.68 rows=468255 width=22) (actual rows=577437 loops=1)
Buckets: 131072 (originally 131072) Batches: 8 (originally 4) Memory Usage: 7169kB
-> Hash Join (cost=1857.05..51376.68 rows=468255 width=22) (actual rows=577437 loops=1)
AQO: rows=468255, error=-23%, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO: rows=2360335, error=0%, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16340 width=4) (actual rows=19040 loops=1)
Buckets: 32768 (originally 16384) Batches: 1 (originally 1) Memory Usage: 926kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16340 width=4) (actual rows=19040 loops=1)
AQO: rows=16340, error=-17%, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-10 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 46624
Using aqo: true
AQO mode: LEARN
AQO advanced: OFF
Query hash: 402936317627943257
JOINS: 2
(23 rows)
Ðднако вмеÑÑо пеÑеÑÑÑÑа полей features и targets, aqo добавил новÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð±Ð¸ÑаÑелÑноÑÑи и оÑенки колиÑеÑÑва ÑÑÑок Ð´Ð»Ñ ÑÑого запÑоÑа в aqo_data:
demo=# select * from aqo_data;
fs | fss | dbid | delta_rows | nfeatures | features | targets | reliability | oids | tmpoids
----+----------------------+-------+------------+-----------+---------------------------------------------------------------------------------------+-----------------------------------------+-------------+---------------------+---------
0 | 1362775811343989307 | 16429 | f | 0 | | {14.454357295615447} | {1} | {16452} |
0 | -6410966714754547713 | 16429 | f | 0 | | {14.674314116080508} | {1} | {16479} |
0 | -1289471166524579716 | 16429 | f | 1 | {{-1.3775704575284085},{-1.2287385463463019}} | {9.701371368413994,9.854297308345357} | {1,1} | {16458} |
0 | 8598194613120045129 | 16429 | f | 2 | {{-13.492416828684513,-1.3775704575284085},{-13.492416828684513,-1.2287385463463019}} | {7.703007682479236,11.620855676130656} | {1,1} | {16479,16458,16452} |
0 | -7651474063207585780 | 16429 | f | 2 | {{-11.092306109090387,-1.3775704575284085},{-11.092306109090387,-1.2287385463463019}} | {13.056768298305919,13.266354624518149} | {1,1} | {16479,16458} |
(5 rows)
ТепеÑÑ Ð² пÑедÑказании еÑÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÐ°Ñ Ð¿Ð¾Ð³ÑеÑноÑÑÑ Ð¿ÑимеÑно в 3%, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑÑÑнÑÑÑÑÑ Ð¿Ð¾Ð³ÑеÑноÑÑÑÑ Ð²ÑÑиÑлений:
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-10 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=63438.72..139820.11 rows=108541 width=25) (actual rows=111397 loops=1)
AQO: rows=108541, error=-3%, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO: rows=1894295, error=0%, fss=1362775811343989307
-> Hash (cost=51410.19..51410.19 rows=576635 width=22) (actual rows=577437 loops=1)
Buckets: 131072 Batches: 8 Memory Usage: 4966kB
-> Hash Join (cost=1890.56..51410.19 rows=576635 width=22) (actual rows=577437 loops=1)
AQO: rows=576635, error=-0%, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO: rows=2360335, error=0%, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=19021 width=4) (actual rows=19040 loops=1)
Buckets: 32768 Batches: 1 Memory Usage: 926kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=19021 width=4) (actual rows=19040 loops=1)
AQO: rows=19021, error=-0%, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-10 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 46624
Using aqo: true
AQO mode: LEARN
AQO advanced: OFF
Query hash: 402936317627943257
JOINS: 2
(23 rows)
Ðожно измениÑÑ Ð·Ð°Ð¿ÑоÑ, добавив некоÑоÑÑÑ ÑаблиÑÑ Ð² ÑпиÑок JOIN. Ð ÑÑом ÑлÑÑае aqo бÑÐ´ÐµÑ Ð¿ÑогнозиÑоваÑÑ Ð¾ÑÐµÐ½ÐºÑ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑок на ÑзлаÑ
, иÑполÑзовавÑиÑ
ÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑениÑ.
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT t.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
JOIN tickets t ON t.ticket_no = tf.ticket_no
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=61158.91..134296.78 rows=2273 width=104) (actual rows=2215 loops=1)
AQO not used, fss=-8581941154270057231
-> Hash Join (cost=61158.48..133208.83 rows=2273 width=28) (actual rows=2215 loops=1)
AQO: rows=2273, error=3%, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=18) (actual rows=1894295 loops=1)
AQO: rows=1894295, error=0%, fss=1362775811343989307
-> Hash (cost=51376.89..51376.89 rows=468906 width=22) (actual rows=468255 loops=1)
Buckets: 131072 Batches: 4 Memory Usage: 7438kB
-> Hash Join (cost=1857.26..51376.89 rows=468906 width=22) (actual rows=468255 loops=1)
AQO: rows=468906, error=0%, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO: rows=2360335, error=0%, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16357 width=4) (actual rows=16340 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 703kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16357 width=4) (actual rows=16340 loops=1)
AQO: rows=16357, error=0%, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-15 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 49324
-> Index Scan using tickets_pkey on tickets t (cost=0.42..0.48 rows=1 width=104) (actual rows=1 loops=2215)
AQO not used, fss=2731022528523952664
Index Cond: (ticket_no = bp.ticket_no)
Using aqo: true
AQO mode: LEARN
AQO advanced: OFF
Query hash: 7809046947949890015
JOINS: 3
(28 rows)
ÐÑÐ¸Ð¼ÐµÑ F.2. ÐÑполÑзование пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_stat
РпÑедÑÑавлении aqo_query_stat оÑобÑажаеÑÑÑ ÑÑаÑиÑÑика вÑемени планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, вÑемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов и оÑибок оÑенки колиÑеÑÑва ÑÑÑок. Ðа оÑновании ÑÑиÑ
даннÑÑ
Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑинимаÑÑ ÑеÑÐµÐ½Ð¸Ñ Ð¾Ð± иÑполÑзовании пÑедÑказаний aqo Ð´Ð»Ñ ÑазлиÑнÑÑ
клаÑÑов запÑоÑов.
ÐбÑаÑимÑÑ Ðº пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ aqo_query_stats:
demo=# SELECT * FROM aqo_query_stat \gx
-[ RECORD 1 ]-----------------+---------------------------------------------------------------
fs | 7809046947949890015
dbid | 16429
execution_time_with_aqo | {1.039218233,0.925258453,0.831166925,0.779602353}
execution_time_without_aqo | {1.022052611,0.936486619}
planning_time_with_aqo | {0.003305339,0.002129048,0.002538877,0.002142972}
planning_time_without_aqo | {0.000767553,0.000711208}
cardinality_error_with_aqo | {0.4854215265638894,0,1.1711726076352047,0.007732205169478082}
cardinality_error_without_aqo | {0.4854215265638894,1.571562511977072}
executions_with_aqo | 4
executions_without_aqo | 2 ÐолÑÑеннÑе даннÑе оÑноÑÑÑÑÑ Ðº запÑоÑÑ, ÑаÑÑмоÑÑÐµÐ½Ð½Ð¾Ð¼Ñ Ð² пÑимеÑе ÐÑимеÑ F.1. ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð²ÑполнÑлÑÑ Ñ ÐºÐ°Ð¶Ð´Ñм из паÑамеÑÑов f.scheduled_departure > '2017-08-10 15:00:00+00' и f.scheduled_departure > '2017-08-15 15:00:00+00' по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ°Ð·Ñ Ð±ÐµÐ· aqo и по два Ñаза Ñ aqo. Ðидно, ÑÑо Ñ aqo погÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок ÑменÑÑаеÑÑÑ Ð´Ð¾ 0,0077, а минималÑÐ½Ð°Ñ Ð¿Ð¾Ð³ÑеÑноÑÑÑ Ð¾Ñенки колиÑеÑÑва ÑÑÑок без aqo ÑоÑÑавлÑÐµÑ 0,4854. ÐÑоме Ñого, вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ aqo менÑÑе, Ñем без него. Таким обÑазом, можно ÑделаÑÑ Ð²Ñвод, ÑÑо aqo Ñ
оÑоÑо обÑÑаеÑÑÑ Ð½Ð° ÑÑом запÑоÑе и пÑедÑказание можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑÑого клаÑÑа запÑоÑов.
ÐÑÐ¸Ð¼ÐµÑ F.3. ÐÑполÑзование ÑаÑÑиÑенного Ñежима aqo
РаÑÑиÑеннÑй Ñежим позволÑÐµÑ Ð±Ð¾Ð»ÐµÐµ гибко ÑпÑавлÑÑÑ ÑаÑÑиÑением aqo. ÐÑи вклÑÑении данного Ñежима, Ñо еÑÑÑ
demo=# SET aqo.advanced = on;
aqo бÑÐ´ÐµÑ ÑобиÑаÑÑ Ð´Ð°Ð½Ð½Ñе маÑинного обÑÑÐµÐ½Ð¸Ñ Ð¾ÑделÑно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вÑполнÑемого запÑоÑа. ÐапÑимеÑ:
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=63796.33..140286.73 rows=477728 width=25) (actual rows=2215 loops=1)
AQO not used, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO not used, fss=1362775811343989307
-> Hash (cost=51379.43..51379.43 rows=595260 width=22) (actual rows=468255 loops=1)
Buckets: 131072 Batches: 8 Memory Usage: 4223kB
-> Hash Join (cost=1859.80..51379.43 rows=595260 width=22) (actual rows=468255 loops=1)
AQO not used, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO not used, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16560 width=4) (actual rows=16340 loops=1)
Buckets: 32768 Batches: 1 Memory Usage: 831kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16560 width=4) (actual rows=16340 loops=1)
AQO not used, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-15 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 49324
Using aqo: true
AQO mode: LEARN
AQO advanced: ON
Query hash: 402936317627943257
JOINS: 2
(23 rows)
ТепеÑÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ñ
ÑаниÑÑÑ Ð² aqo_data Ñ Ð½ÐµÐ½ÑлевÑм fs (по ÑмолÑÐ°Ð½Ð¸Ñ fs Ñавен Ñ
еÑÑ Ð·Ð°Ð¿ÑоÑа):
demo=# SELECT * FROM aqo_data;
fs | fss | dbid | delta_rows | nfeatures | features | targets | reliability | oids | tmpoids
--------------------+----------------------+-------+------------+-----------+---------------------------------------------+----------------------+-------------+---------------------+---------
402936317627943257 | -6410966714754547713 | 16429 | f | 0 | | {14.674314116080508} | {1} | {16479} |
402936317627943257 | 1362775811343989307 | 16429 | f | 0 | | {14.454357295615447} | {1} | {16452} |
402936317627943257 | -1289471166524579716 | 16429 | f | 1 | {{-1.3775704575284085}} | {9.701371368413994} | {1} | {16458} |
402936317627943257 | 8598194613120045129 | 16429 | f | 2 | {{-13.492416828684513,-1.3775704575284085}} | {7.703007682479236} | {1} | {16479,16458,16452} |
402936317627943257 | -7651474063207585780 | 16429 | f | 2 | {{-11.092306109090387,-1.3775704575284085}} | {13.056768298305919} | {1} | {16479,16458} |
(5 rows)
Ðожно наÑÑÑоиÑÑ Ð½ÐµÑколÑко паÑамеÑÑов ÑолÑко Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ запÑоÑа. ÐÑо знаÑÐµÐ½Ð¸Ñ learn_aqo, use_aqo и auto_tuning в пÑедÑÑавлении aqo_queries:
demo=# SELECT * FROM aqo_queries;
fs | dbid | learn_aqo | use_aqo | auto_tuning | smart_timeout | count_increase_timeout
--------------------+-------+-----------+---------+-------------+---------------+------------------------
402936317627943257 | 16429 | t | t | f | 0 | 0
0 | 0 | f | f | f | 0 | 0
(2 rows)
Ðададим Ð´Ð»Ñ use_aqo знаÑение false:
demo=# SELECT aqo_queries_update(402936317627943257, NULL, NULL, false, NULL); aqo_queries_update -------------------- t (1 row)
ТепеÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð¼ конÑÑанÑÑ Ð² запÑоÑе:
demo=# EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT bp.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
WHERE f.scheduled_departure > '2017-08-10 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------
Hash Join (cost=65822.16..142872.60 rows=554378 width=25) (actual rows=111397 loops=1)
AQO not used, fss=0
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=25) (actual rows=1894295 loops=1)
AQO not used, fss=0
-> Hash (cost=51412.64..51412.64 rows=690768 width=22) (actual rows=577437 loops=1)
Buckets: 131072 Batches: 8 Memory Usage: 4966kB
-> Hash Join (cost=1893.01..51412.64 rows=690768 width=22) (actual rows=577437 loops=1)
AQO not used, fss=0
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO not used, fss=0
-> Hash (cost=1652.80..1652.80 rows=19217 width=4) (actual rows=19040 loops=1)
Buckets: 32768 Batches: 1 Memory Usage: 926kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=19217 width=4) (actual rows=19040 loops=1)
AQO not used, fss=0
Filter: (scheduled_departure > '2017-08-10 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 46624
Using aqo: false
AQO mode: LEARN
AQO advanced: ON
Query hash: 402936317627943257
JOINS: 2
(23 rows)
aqo не иÑполÑзовалÑÑ Ð´Ð»Ñ ÑÑого запÑоÑа, но в пÑедÑÑавлении aqo_data поÑвилиÑÑ Ð½Ð¾Ð²Ñе даннÑе:
demo=# SELECT * FROM aqo_data;
fs | fss | dbid | delta_rows | nfeatures | features | targets | reliability | oids | tmpoids
--------------------+----------------------+-------+------------+-----------+---------------------------------------------------------------------------------------+-----------------------------------------+-------------+---------------------+---------
402936317627943257 | -6410966714754547713 | 16429 | f | 0 | | {14.674314116080508} | {1} | {16479} |
402936317627943257 | 1362775811343989307 | 16429 | f | 0 | | {14.454357295615447} | {1} | {16452} |
402936317627943257 | -1289471166524579716 | 16429 | f | 1 | {{-1.3775704575284085},{-1.2287385463463019}} | {9.701371368413994,9.854297308345357} | {1,1} | {16458} |
402936317627943257 | 8598194613120045129 | 16429 | f | 2 | {{-13.492416828684513,-1.3775704575284085},{-13.492416828684513,-1.2287385463463019}} | {7.703007682479236,11.620855676130656} | {1,1} | {16479,16458,16452} |
402936317627943257 | -7651474063207585780 | 16429 | f | 2 | {{-11.092306109090387,-1.3775704575284085},{-11.092306109090387,-1.2287385463463019}} | {13.056768298305919,13.266354624518149} | {1,1} | {16479,16458} |
(5 rows)
УÑÑановленное знаÑение паÑамеÑÑа use_aqo не оÑноÑиÑÑÑ Ðº дÑÑгим запÑоÑам. ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÑÑгого запÑоÑа Ð´Ð²Ð°Ð¶Ð´Ñ Ð²Ð¸Ð´Ð½Ð¾, ÑÑо aqo обÑÑаеÑÑÑ Ð½Ð° нÑм и Ð´ÐµÐ»Ð°ÐµÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ пÑедÑказание:
EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF)
SELECT t.*
FROM ticket_flights tf
JOIN flights f ON f.flight_id = tf.flight_id
JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id
JOIN tickets t ON t.ticket_no = tf.ticket_no
WHERE f.scheduled_departure > '2017-08-15 15:00:00+00';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=61144.93..134251.05 rows=2215 width=104) (actual rows=2215 loops=1)
AQO: rows=2215, error=0%, fss=-8581941154270057231
-> Hash Join (cost=61144.50..133190.86 rows=2215 width=28) (actual rows=2215 loops=1)
AQO: rows=2215, error=0%, fss=8598194613120045129
Hash Cond: ((bp.flight_id = f.flight_id) AND (bp.ticket_no = tf.ticket_no))
-> Seq Scan on boarding_passes bp (cost=0.00..32894.95 rows=1894295 width=18) (actual rows=1894295 loops=1)
AQO: rows=1894295, error=0%, fss=1362775811343989307
-> Hash (cost=51376.68..51376.68 rows=468255 width=22) (actual rows=468255 loops=1)
Buckets: 131072 Batches: 4 Memory Usage: 7438kB
-> Hash Join (cost=1857.05..51376.68 rows=468255 width=22) (actual rows=468255 loops=1)
AQO: rows=468255, error=0%, fss=-7651474063207585780
Hash Cond: (tf.flight_id = f.flight_id)
-> Seq Scan on ticket_flights tf (cost=0.00..43323.35 rows=2360335 width=18) (actual rows=2360335 loops=1)
AQO: rows=2360335, error=0%, fss=-6410966714754547713
-> Hash (cost=1652.80..1652.80 rows=16340 width=4) (actual rows=16340 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 703kB
-> Seq Scan on flights f (cost=0.00..1652.80 rows=16340 width=4) (actual rows=16340 loops=1)
AQO: rows=16340, error=0%, fss=-1289471166524579716
Filter: (scheduled_departure > '2017-08-15 22:00:00+07'::timestamp with time zone)
Rows Removed by Filter: 49324
-> Index Scan using tickets_pkey on tickets t (cost=0.42..0.48 rows=1 width=104) (actual rows=1 loops=2215)
AQO not used, fss=2731022528523952664
Index Cond: (ticket_no = bp.ticket_no)
Using aqo: true
AQO mode: LEARN
AQO advanced: ON
Query hash: 7809046947949890015
JOINS: 3
(28 rows)
ÐÑÐ¸Ð¼ÐµÑ F.4. ÐÑполÑзование Ñежима «пеÑоÑниÑÑ»
SET aqo.sandbox = ON; SET aqo.enable = ON; SET aqo.advanced = OFF; -- ÐÑиÑÑка Ð±Ð°Ð·Ñ Ð·Ð½Ð°Ð½Ð¸Ð¹ пеÑоÑниÑÑ, не заÑÑагиваÑÑÐ°Ñ Ð¾ÑновнÑе даннÑе SELECT aqo_reset(); EXPLAIN (ANALYZE, SUMMARY OFF, TIMING OFF) SELECT t.* FROM ticket_flights tf JOIN flights f ON f.flight_id = tf.flight_id JOIN boarding_passes bp ON bp.ticket_no = tf.ticket_no AND bp.flight_id = tf.flight_id JOIN tickets t ON t.ticket_no = tf.ticket_no WHERE f.scheduled_departure > '2017-08-15 15:00:00+00'; -- ÐÑполнение пÑедÑдÑÑего запÑоÑа, пока Ð¿Ð»Ð°Ð½Ñ Ð½Ðµ ÑÑабилизиÑÑÑÑÑÑ ... -- ÐопиÑование даннÑÑ , полÑÑеннÑÑ Ð¸Ð· пеÑоÑниÑÑ Ñ aqo.advanced = OFF CREATE TABLE aqo_data_sandbox AS SELECT * FROM aqo_data; SET aqo.sandbox = OFF; SELECT aqo_data_update (fs, fss, dbid, delta_rows, nfeatures, features, targets, reliability, oids, tmpoids) FROM aqo_data_sandbox WHERE fs = 0; DROP TABLE aqo_data_sandbox;
F.2.6. ÐвÑÐ¾Ñ #
Ðлег Ðванов