23.1. РегламенÑÐ½Ð°Ñ Ð¾ÑиÑÑка
- 23.1.1. ÐÑновнÑе пÑинÑÐ¸Ð¿Ñ Ð¾ÑиÑÑки
- 23.1.2. ÐÑÑвобождение диÑкового пÑоÑÑÑанÑÑва
- 23.1.3. Ðбновление ÑÑаÑиÑÑики планиÑовÑика
- 23.1.4. Ðбновление каÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи
- 23.1.5. ÐÑедоÑвÑаÑение оÑибок из-за заÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑÑÑÑика ÑÑанзакÑий
- 23.1.6. Ðемон авÑооÑиÑÑки
- 23.1.2. ÐÑÑвобождение диÑкового пÑоÑÑÑанÑÑва
ÐÐ°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Postgres Pro ÑÑебÑÑÑ Ð¿ÐµÑиодиÑеÑкого пÑÐ¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑÑ Ð¾Ð±ÑлÑживаниÑ, коÑоÑÐ°Ñ Ð½Ð°Ð·ÑваеÑÑÑ Ð¾ÑиÑÑкой. Ðо многиÑ
ÑлÑÑаÑÑ
оÑиÑÑÐºÑ Ð´Ð¾ÑÑаÑоÑно вÑполнÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð´ÐµÐ¼Ð¾Ð½Ð° авÑооÑиÑÑки, коÑоÑÑй опиÑан в ÐодÑазделе 23.1.6. Ðозможно, в ваÑей ÑиÑÑаÑии Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑималÑнÑÑ
ÑезÑлÑÑаÑов поÑÑебÑеÑÑÑ Ð½Ð°ÑÑÑоиÑÑ Ð¾Ð¿Ð¸ÑаннÑе Ñам же паÑамеÑÑÑ Ð°Ð²ÑооÑиÑÑки. ÐекоÑоÑÑе админиÑÑÑаÑоÑÑ Ð¡Ð£ÐРмогÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑÑ Ð¸Ð»Ð¸ замениÑÑ Ð´ÐµÐ¹ÑÑвие ÑÑого демона командами VACUUM (обÑÑно они вÑполнÑÑÑÑÑ Ð¿Ð¾ ÑаÑпиÑÐ°Ð½Ð¸Ñ Ð² заданиÑÑ
cron или ÐланиÑовÑика задаÑ). ЧÑÐ¾Ð±Ñ Ð¿ÑавилÑно оÑганизоваÑÑ Ð¾ÑиÑÑÐºÑ Ð²ÑÑÑнÑÑ, необÑ
одимо понимаÑÑ ÑемÑ, коÑоÑÑе бÑдÑÑ ÑаÑÑмоÑÑÐµÐ½Ñ Ð² ÑледÑÑÑиÑ
подÑазделаÑ
. ÐдминиÑÑÑаÑоÑÑ, коÑоÑÑе полагаÑÑÑÑ Ð½Ð° авÑооÑиÑÑкÑ, возможно, вÑÑ Ð¶Ðµ заÑ
оÑÑÑ Ð¿ÑоÑмоÑÑеÑÑ ÑÑÐ¾Ñ Ð¼Ð°ÑеÑиал, ÑÑÐ¾Ð±Ñ Ð»ÑÑÑе понимаÑÑ Ð¸ наÑÑÑаиваÑÑ ÑÑÑ Ð¿ÑоÑедÑÑÑ.
23.1.1. ÐÑновнÑе пÑинÑÐ¸Ð¿Ñ Ð¾ÑиÑÑки
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM в Postgres Pro Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑ ÐºÐ°Ð¶Ð´ÑÑ ÑаблиÑÑ Ð¿Ð¾ ÑледÑÑÑим пÑиÑинам:
- ÐÐ»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ повÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¸Ñкового пÑоÑÑÑанÑÑва, занÑÑого изменÑннÑми или ÑдалÑннÑми ÑÑÑоками.
- ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑаÑиÑÑики по даннÑм, иÑполÑзÑемой планиÑовÑиком запÑоÑов Postgres Pro.
- ÐÐ»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи, коÑоÑÐ°Ñ ÑÑкоÑÑÐµÑ ÑканиÑование ÑолÑко индекÑа.
- ÐÐ»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑеÑи оÑÐµÐ½Ñ ÑÑаÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð·-за заÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов ÑÑанзакÑий или мÑлÑÑиÑÑанзакÑий.
РазнÑе пÑиÑÐ¸Ð½Ñ Ð´Ð¸ÐºÑÑÑÑ Ð²Ñполнение дейÑÑвий VACUUM Ñ Ñазной ÑаÑÑоÑой и в Ñазном обÑÑме, как ÑаÑÑмаÑÑиваеÑÑÑ Ð² ÑледÑÑÑиÑ
подÑазделаÑ
.
СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° ваÑианÑа VACUUM: обÑÑнÑй VACUUM и VACUUM FULL. Ðоманда VACUUM FULL Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑвободиÑÑ Ð±Ð¾Ð»ÑÑе диÑкового пÑоÑÑÑанÑÑва, однако ÑабоÑÐ°ÐµÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½ÐµÐµ. ÐÑоме Ñого, обÑÑÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° VACUUM Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð°ÑаллелÑно Ñ Ð¸ÑполÑзованием пÑоизводÑÑвенной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. (ÐÑи ÑÑом Ñакие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÐºÐ°Ðº SELECT, INSERT, UPDATE и DELETE бÑдÑÑ Ð²ÑполнÑÑÑÑÑ Ð½Ð¾ÑмалÑно, Ñ
оÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¾Ð¿Ñеделение ÑаблиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ Ñипа ALTER TABLE.) Ðоманда VACUUM FULL ÑÑебÑÐµÑ Ð¸ÑклÑÑиÑелÑной блокиÑовки обÑабаÑÑваемой ÑаблиÑÑ Ð¸ поÑÑÐ¾Ð¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð°ÑаллелÑно Ñ Ð´ÑÑгими опеÑаÑиÑми Ñ ÑÑой ÑаблиÑей. Ðо ÑÑой пÑиÑине админиÑÑÑаÑоÑÑ, как пÑавило, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑаÑаÑÑÑÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð±ÑÑнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM и избегаÑÑ VACUUM FULL.
Ðоманда VACUUM поÑÐ¾Ð¶Ð´Ð°ÐµÑ ÑÑÑеÑÑвеннÑй обÑÑм ÑÑаÑика ввода/вÑвода, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð¿ÑиÑиной низкой пÑоизводиÑелÑноÑÑи в дÑÑгиÑ
акÑивнÑÑ
ÑеанÑаÑ
. ÐÑо влиÑние Ñоновой оÑиÑÑки можно ÑегÑлиÑоваÑÑ, наÑÑÑÐ°Ð¸Ð²Ð°Ñ Ð¿Ð°ÑамеÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии (Ñм. ÐодÑаздел 18.4.4).
23.1.2. ÐÑÑвобождение диÑкового пÑоÑÑÑанÑÑва
Ð Postgres Pro ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE или DELETE не вÑзÑваÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑаÑой веÑÑии изменÑемÑÑ
ÑÑÑок. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од необÑ
одим Ð´Ð»Ñ ÑеализаÑии ÑÑÑекÑивного многовеÑÑионного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑÑенÑнÑм доÑÑÑпом (MVCC, Ñм. ÐлавÑ 13): веÑÑÐ¸Ñ ÑÑÑоки не должна ÑдалÑÑÑÑÑ Ð´Ð¾ ÑеÑ
поÑ, пока она оÑÑаÑÑÑÑ Ð¿Ð¾ÑенÑиалÑно видимой Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑÑанзакÑий. Ðднако в конÑе конÑов ÑÑÑаÑевÑÐ°Ñ Ð¸Ð»Ð¸ ÑдалÑÐ½Ð½Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки оказÑваеÑÑÑ Ð½Ðµ нÑжна ни одной из ÑÑанзакÑий. ÐоÑле ÑÑого занимаемое ей меÑÑо должно бÑÑÑ Ð¾Ñвобождено и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ñдано новÑм ÑÑÑокам, во избежание неогÑаниÑенного ÑоÑÑа поÑÑебноÑÑи в диÑковом пÑоÑÑÑанÑÑве. ÐÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM.
ÐбÑÑÐ½Ð°Ñ ÑоÑма VACUUM ÑдалÑÐµÑ Ð½ÐµÐ¸ÑполÑзÑемÑе веÑÑии ÑÑÑок в ÑаблиÑаÑ
и индекÑаÑ
и помеÑÐ°ÐµÑ Ð¿ÑоÑÑÑанÑÑво ÑвободнÑм Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑего иÑполÑзованиÑ. Ðднако ÑÑо диÑковое пÑоÑÑÑанÑÑво не возвÑаÑаеÑÑÑ Ð¾Ð¿ÐµÑаÑионной ÑиÑÑеме, кÑоме оÑобого ÑлÑÑаÑ, когда полноÑÑÑÑ Ð¾ÑвобождаÑÑÑÑ Ð¾Ð´Ð½Ð° или неÑколÑко ÑÑÑÐ°Ð½Ð¸Ñ Ð² конÑе ÑаблиÑÑ Ð¸ можно легко полÑÑиÑÑ Ð¸ÑклÑÑиÑелÑнÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²ÐºÑ ÑаблиÑÑ. Ðоманда VACUUM FULL, напÑоÑив, каÑдиналÑно ÑÐ¶Ð¸Ð¼Ð°ÐµÑ ÑаблиÑÑ, запиÑÑÐ²Ð°Ñ Ð°Ð±ÑолÑÑно новÑÑ Ð²ÐµÑÑÐ¸Ñ Ñайла ÑаблиÑÑ Ð±ÐµÐ· неиÑполÑзÑемого пÑоÑÑÑанÑÑва. ÐÑо минимизиÑÑÐµÑ ÑÐ°Ð·Ð¼ÐµÑ ÑаблиÑÑ, однако Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ вÑемени. ÐÑоме Ñого, Ð´Ð»Ñ ÑÑого ÑÑебÑеÑÑÑ Ð±Ð¾Ð»ÑÑе меÑÑа на диÑке Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи новой копии ÑаблиÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии.
ÐбÑÑно ÑÐµÐ»Ñ ÑегÑлÑÑной оÑиÑÑки â вÑполнÑÑÑ Ð¿ÑоÑÑÑÑ Ð¾ÑиÑÑÐºÑ (VACUUM) доÑÑаÑоÑно ÑаÑÑо, ÑÑÐ¾Ð±Ñ Ð½Ðµ возникала необÑ
одимоÑÑÑ Ð² VACUUM FULL. Ðемон авÑооÑиÑÑки пÑÑаеÑÑÑ ÑабоÑаÑÑ Ð² ÑÑом Ñежиме, и на Ñамом деле он Ñам никогда не вÑполнÑÐµÑ VACUUM FULL. ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¸Ð´ÐµÑ Ñакого подÑ
ода не в Ñом, ÑÑÐ¾Ð±Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð¸ÑоваÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑаблиÑ, а в Ñом, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¸ÑполÑзование диÑкового пÑоÑÑÑанÑÑва на ÑÑабилÑном ÑÑовне: ÐºÐ°Ð¶Ð´Ð°Ñ ÑаблиÑа Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÑм, ÑавнÑй ÐµÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑÐ½Ð¾Ð¼Ñ ÑазмеÑÑ, плÑÑ Ð¾Ð±ÑÑм, коÑоÑÑй бÑл занÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоÑедÑÑами оÑиÑÑки. ХоÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ VACUUM FULL можно ÑжаÑÑ ÑаблиÑÑ Ð´Ð¾ минимÑма и возвÑаÑиÑÑ Ð´Ð¸Ñковое пÑоÑÑÑанÑÑво опеÑаÑионной ÑиÑÑеме, болÑÑого ÑмÑÑла в ÑÑом неÑ, еÑли в бÑдÑÑем ÑаблиÑа Ñак же вÑÑаÑÑÐµÑ Ñнова. СледоваÑелÑно, Ð´Ð»Ñ Ð°ÐºÑивно изменÑемÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð»ÑÑÑе Ñ ÑмеÑенной ÑаÑÑоÑой вÑполнÑÑÑ VACUUM, Ñем оÑÐµÐ½Ñ Ñедко вÑполнÑÑÑ VACUUM FULL.
ÐекоÑоÑÑе админиÑÑÑаÑоÑÑ Ð¿ÑедпоÑиÑаÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑоваÑÑ Ð¾ÑиÑÑÐºÑ ÐÐ ÑамоÑÑоÑÑелÑно, напÑимеÑ, пÑÐ¾Ð²Ð¾Ð´Ñ Ð²Ñе ÑабоÑÑ Ð½Ð¾ÑÑÑ Ð² пеÑиод низкой загÑÑзки. Ðднако оÑиÑÑка ÑолÑко по ÑикÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ ÑаÑпиÑÐ°Ð½Ð¸Ñ Ð¿Ð»Ð¾Ñ
а Ñем, ÑÑо пÑи Ñезком ÑкаÑке инÑенÑивноÑÑи изменений ÑаблиÑа Ð¼Ð¾Ð¶ÐµÑ ÑазÑаÑÑиÑÑ Ð½Ð°ÑÑолÑко, ÑÑо Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑва дейÑÑвиÑелÑно понадобиÑÑÑ Ð²ÑполниÑÑ VACUUM FULL. ÐÑполÑзование демона авÑооÑиÑÑки ÑÐ½Ð¸Ð¼Ð°ÐµÑ ÑÑÑ Ð¿ÑоблемÑ, поÑколÑÐºÑ Ð¾Ð½ планиÑÑÐµÑ Ð¾ÑиÑÑÐºÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки, оÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ñ Ð¸Ð½ÑенÑивноÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹. ÐолноÑÑÑÑ Ð¾ÑклÑÑаÑÑ ÑÑÐ¾Ñ Ð´ÐµÐ¼Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл, ÑолÑко еÑли Ð²Ñ Ð¸Ð¼ÐµÐµÑе дело Ñ Ð¿ÑеделÑно пÑедÑказÑемой загÑÑзкой. Ðозможен и компÑомиÑÑнÑй ваÑÐ¸Ð°Ð½Ñ â наÑÑÑоиÑÑ Ð¿Ð°ÑамеÑÑÑ Ð´ÐµÐ¼Ð¾Ð½Ð° авÑооÑиÑÑки Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑеагиÑовал ÑолÑко на необÑÑайно вÑÑокÑÑ Ð¸Ð½ÑенÑивноÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ и мог ÑдеÑжаÑÑ ÑиÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ конÑÑолем, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM, запÑÑкаемÑе по ÑаÑпиÑаниÑ, бÑдÑÑ Ð²ÑполнÑÑÑ Ð¾ÑновнÑÑ ÑабоÑÑ Ð² пеÑÐ¸Ð¾Ð´Ñ Ð½Ð¾ÑмалÑной загÑÑзки.
ÐÑли же авÑооÑиÑÑка не пÑименÑеÑÑÑ, обÑÑно планиÑÑеÑÑÑ Ð²Ñполнение VACUUM Ð´Ð»Ñ Ð²Ñей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñаз в ÑÑÑки в пеÑиод низкой акÑивноÑÑи, и в ÑлÑÑае необÑ
одимоÑÑи оно дополнÑеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑаÑÑой оÑиÑÑкой инÑенÑивно изменÑемÑÑ
ÑаблиÑ. (РнекоÑоÑÑÑ
ÑиÑÑаÑиÑÑ
, когда Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑоизводÑÑÑÑ ÐºÑайне инÑенÑивно, ÑамÑе воÑÑÑебованнÑе ÑаблиÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÑиÑаÑÑÑÑ Ñаз в неÑколÑко минÑÑ.) ÐÑли в ваÑем клаÑÑеÑе неÑколÑко баз даннÑÑ
, не забÑвайÑе вÑполнÑÑÑ VACUUM Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ из ниÑ
; пÑи ÑÑом Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° пÑогÑамма vacuumdb.
ÐодÑказка
РезÑлÑÑÐ°Ñ Ð¾Ð±ÑÑного VACUUM Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑдовлеÑвоÑиÑелÑнÑм, когда вÑледÑÑвие маÑÑового Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑÑок в ÑаблиÑе оказÑваеÑÑÑ Ð¼Ð½Ð¾Ð³Ð¾ мÑÑÑвÑÑ
веÑÑий ÑÑÑок. ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑÐ°ÐºÐ°Ñ ÑаблиÑа и вам нÑжно оÑвободиÑÑ Ð»Ð¸Ñнее пÑоÑÑÑанÑÑво, коÑоÑое она занимаеÑ, иÑполÑзÑйÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM FULL или, в каÑеÑÑве алÑÑеÑнаÑивÑ, CLUSTER или один из ваÑианÑов ALTER TABLE, вÑполнÑÑÑий пеÑезапиÑÑ ÑаблиÑÑ. ÐÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑ Ð°Ð±ÑолÑÑно новÑÑ ÐºÐ¾Ð¿Ð¸Ñ ÑаблиÑÑ Ð¸ ÑÑÑоÑÑ Ð´Ð»Ñ Ð½ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ. ÐÑе ÑÑи ваÑианÑÑ ÑÑебÑÑÑ Ð¸ÑклÑÑиÑелÑной блокиÑовки. ÐамеÑÑÑе, ÑÑо они Ñакже на вÑÐµÐ¼Ñ ÑÑебÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑного пÑоÑÑÑанÑÑва на диÑке в обÑÑме, пÑиблизиÑелÑно Ñавном ÑазмеÑÑ ÑаблиÑÑ, поÑколÑÐºÑ ÑÑаÑÑе копии ÑаблиÑÑ Ð¸ индекÑов нелÑÐ·Ñ ÑдалиÑÑ Ð´Ð¾ завеÑÑÐµÐ½Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
копий.
ÐодÑказка
ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑаблиÑа, вÑÑ ÑодеÑжимое коÑоÑой пеÑиодиÑеÑки ÑдалÑеÑÑÑ, ÑаÑÑмоÑÑиÑе возможноÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ TRUNCATE вмеÑÑо DELETE Ñ Ð¿Ð¾ÑледÑÑÑей командой VACUUM. TRUNCATE немедленно ÑдалÑÐµÑ Ð²ÑÑ ÑодеÑжимое ÑаблиÑÑ, не ÑÑебÑÑ Ð¿Ð¾ÑледÑÑÑей оÑиÑÑки (VACUUM или VACUUM FULL) Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½ÐµÐ¸ÑполÑзÑемого диÑкового пÑоÑÑÑанÑÑва. ÐедоÑÑаÑком Ñакого подÑ
ода ÑвлÑеÑÑÑ Ð½Ð°ÑÑÑение ÑÑÑогой ÑеманÑики MVCC.
23.1.3. Ðбновление ÑÑаÑиÑÑики планиÑовÑика
ÐланиÑовÑик запÑоÑов в Postgres Pro, вÑбиÑÐ°Ñ ÑÑÑекÑивнÑе Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов, полагаеÑÑÑ Ð½Ð° ÑÑаÑиÑÑиÑеÑкÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑодеÑжимом ÑаблиÑ. ÐÑа ÑÑаÑиÑÑика ÑобиÑаеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ANALYZE, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñама по Ñебе или как дополниÑелÑное дейÑÑвие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM. СÑаÑиÑÑика должна бÑÑÑ Ð´Ð¾ÑÑаÑоÑно ÑоÑной, Ñак как в пÑоÑивном ÑлÑÑае неÑдаÑно вÑбÑаннÑе Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов могÑÑ ÑнизиÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
Ðемон авÑооÑиÑÑки, еÑли он вклÑÑÑн, бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки вÑполнÑÑÑ ANALYZE поÑле ÑÑÑеÑÑвеннÑÑ
изменений ÑодеÑжимого ÑаблиÑÑ. Ðднако админиÑÑÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедпоÑеÑÑÑ Ð²Ñполнение ANALYZE вÑÑÑнÑÑ, в ÑаÑÑноÑÑи, еÑли извеÑÑно, ÑÑо пÑоизводимÑе в ÑаблиÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ повлиÑÑÑ Ð½Ð° ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ «инÑеÑеÑнÑм» ÑÑолбÑам. Ðемон же планиÑÑÐµÑ Ð²Ñполнение ANALYZE в завиÑимоÑÑи ÑолÑко Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва вÑÑавленнÑÑ
или изменÑннÑÑ
ÑÑÑок; он не знаеÑ, пÑиведÑÑ Ð»Ð¸ они к знаÑимÑм изменениÑм ÑÑаÑиÑÑики.
Ðак и пÑоÑедÑÑа оÑиÑÑки Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑва, ÑаÑÑое обновление ÑÑаÑиÑÑики полезнее Ð´Ð»Ñ Ð¸Ð½ÑенÑивно изменÑемÑÑ
ÑаблиÑ, нежели Ð´Ð»Ñ ÑеÑ
ÑаблиÑ, коÑоÑÑе изменÑÑÑÑÑ Ñедко. Ðднако даже в ÑлÑÑае ÑаÑÑо изменÑемой ÑаблиÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ ÑÑаÑиÑÑики Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ ÑÑебоваÑÑÑÑ, еÑли ÑÑаÑиÑÑиÑеÑкое ÑаÑпÑеделение даннÑÑ
менÑеÑÑÑ Ñлабо. Ðак пÑавило, доÑÑаÑоÑно оÑениÑÑ, наÑколÑко менÑÑÑÑÑ Ð¼Ð°ÐºÑималÑное и минималÑное знаÑÐµÐ½Ð¸Ñ Ð² ÑÑолбÑаÑ
ÑаблиÑÑ. ÐапÑимеÑ, макÑималÑное знаÑение в ÑÑолбÑе timestamp, Ñ
ÑанÑÑем вÑÐµÐ¼Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑоки, бÑÐ´ÐµÑ Ð¿Ð¾ÑÑоÑнно ÑвелиÑиваÑÑÑÑ Ð¿Ð¾ меÑе Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑок; Ð´Ð»Ñ Ñакого ÑÑолбÑа Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑаÑÑое обновление ÑÑаÑиÑÑики, Ñем, к пÑимеÑÑ, Ð´Ð»Ñ ÑÑолбÑа, ÑодеÑжаÑего адÑеÑа ÑÑÑÐ°Ð½Ð¸Ñ (URL), коÑоÑÑе запÑаÑивалиÑÑ Ñ ÑайÑа. СÑÐ¾Ð»Ð±ÐµÑ Ñ URL-адÑеÑами Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ ÑÑÐ¾Ð»Ñ Ð¶Ðµ ÑаÑÑо, однако ÑÑаÑиÑÑиÑеÑкое ÑаÑпÑеделение его знаÑений, веÑоÑÑно, бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð¾ÑноÑиÑелÑно медленно.
ÐÐ¾Ð¼Ð°Ð½Ð´Ñ ANALYZE можно вÑполнÑÑÑ Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ даже пÑоÑÑо Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑолбÑов ÑаблиÑÑ, поÑÑомÑ, еÑли Ñого ÑÑебÑÐµÑ Ð¿Ñиложение, одни ÑÑаÑиÑÑиÑеÑкие даннÑе можно обновлÑÑÑ ÑаÑе, Ñем дÑÑгие. Ðднако на пÑакÑике обÑÑно лÑÑÑе пÑоÑÑо анализиÑоваÑÑ Ð²ÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, поÑколÑÐºÑ ÑÑо бÑÑÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ, Ñак как ANALYZE ÑиÑÐ°ÐµÑ Ð½Ðµ каждÑÑ Ð¾ÑделÑнÑÑ ÑÑÑокÑ, а ÑÑаÑиÑÑиÑеÑки ÑлÑÑайнÑÑ Ð²ÑбоÑÐºÑ ÑÑÑок ÑаблиÑÑ.
ÐодÑказка
ХоÑÑ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑалÑÐ½Ð°Ñ Ð½Ð°ÑÑÑойка ÑаÑÑоÑÑ ANALYZE Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑолбÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹, ÑмÑÑл Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð½Ð°ÑÑÑойка деÑализаÑии ÑÑаÑиÑÑики, ÑобиÑаемой командой ANALYZE. ÐÐ»Ñ ÑÑолбÑов, коÑоÑÑе ÑаÑÑо иÑполÑзÑÑÑÑÑ Ð² пÑедложениÑÑ
WHERE, и имеÑÑ Ð¾ÑÐµÐ½Ñ Ð½ÐµÑавномеÑное ÑаÑпÑеделение даннÑÑ
, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ деÑалÑнаÑ, по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð´ÑÑгими ÑÑолбÑами, гиÑÑогÑамма даннÑÑ
. Ð ÑакиÑ
ÑлÑÑаÑÑ
можно воÑполÑзоваÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ALTER TABLE SET STATISTICS или измениÑÑ Ð·Ð½Ð°Ñение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑа ÑÑÐ¾Ð²Ð½Ñ ÐÐ default_statistics_target.
ÐÑоме Ñого, по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± избиÑаÑелÑноÑÑи ÑÑнкÑий огÑаниÑена. Ðднако еÑли Ð²Ñ ÑоздаÑÑе Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ Ð²Ñзовом ÑÑнкÑии, об ÑÑой ÑÑнкÑии бÑÐ´ÐµÑ ÑобÑана Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ ÑÑаÑиÑÑиÑеÑÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑиÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð½Ð°ÑиÑелÑно ÑлÑÑÑиÑÑ Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов, в коÑоÑÑÑ Ð¸ÑполÑзÑеÑÑÑ Ð´Ð°Ð½Ð½Ñй индекÑ.
ÐодÑказка
Ðемон авÑооÑиÑÑки не вÑполнÑÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ANALYZE Ð´Ð»Ñ ÑÑоÑонниÑ
ÑаблиÑ, поÑколÑÐºÑ Ð¾Ð½ не знаеÑ, как ÑаÑÑо ÑÑо ÑледÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ. ÐÑли Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÐºÐ°ÑеÑÑвеннÑÑ
планов ваÑим запÑоÑам необÑ
одима ÑÑаÑиÑÑика по ÑÑоÑонним ÑаблиÑам, бÑÐ´ÐµÑ Ñ
оÑоÑей идеей дополниÑелÑно запÑÑкаÑÑ ANALYZE Ð´Ð»Ñ Ð½Ð¸Ñ
по подÑ
одÑÑÐµÐ¼Ñ ÑаÑпиÑаниÑ.
23.1.4. Ðбновление каÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи
ÐÑоÑедÑÑа оÑиÑÑки поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑаблиÑÑ, позволÑÑÑие опÑеделиÑÑ, в ÐºÐ°ÐºÐ¸Ñ ÑÑÑаниÑÐ°Ñ ÐµÑÑÑ ÑолÑко запиÑи, заведомо видимÑе Ð´Ð»Ñ Ð²ÑÐµÑ Ð°ÐºÑивнÑÑ ÑÑанзакÑий (и вÑÐµÑ Ð±ÑдÑÑÐ¸Ñ ÑÑанзакÑий, пока ÑÑÑаниÑа не бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð°). ÐÑо Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ð° пÑименениÑ. Ðо-пеÑвÑÑ , Ñам пÑоÑеÑÑ Ð¾ÑиÑÑки Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑопÑÑкаÑÑ Ñакие ÑÑÑаниÑÑ Ð¿Ñи ÑледÑÑÑем запÑÑке, поÑколÑÐºÑ Ð½Ð° ÑÑÐ¸Ñ ÑÑÑаниÑÐ°Ñ Ð²ÑÑиÑаÑÑ Ð½ÐµÑего.
Ðо-вÑоÑÑÑ , Ñ Ñакими каÑÑами Postgres Pro Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ ÑезÑлÑÑаÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð¿ÑоÑов, иÑполÑзÑÑ ÑолÑко индекÑ, не обÑаÑаÑÑÑ Ðº даннÑм ÑаблиÑÑ. Так как индекÑÑ Postgres Pro не ÑодеÑÐ¶Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ видимоÑÑи запиÑей, пÑи обÑÑном ÑканиÑовании по индекÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ извлеÑÑ ÑооÑвеÑÑÑвÑÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¸Ð· ÑаблиÑÑ Ð¸ пÑовеÑиÑÑ ÐµÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð´Ð»Ñ ÑекÑÑей ÑÑанзакÑии. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ñи ÑканиÑовании ÑолÑко индекÑа, наобоÑоÑ, ÑнаÑала пÑовеÑÑеÑÑÑ ÐºÐ°ÑÑа видимоÑÑи. ÐÑли извеÑÑно, ÑÑо вÑе запиÑи на ÑÑÑаниÑе видимÑ, Ñо вÑбоÑÐºÑ Ð¸Ð· ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ пÑопÑÑÑиÑÑ. ÐÑо наиболее полезно Ñ Ð±Ð¾Ð»ÑÑими набоÑÐ°Ñ Ð´Ð°Ð½Ð½ÑÑ , когда благодаÑÑ ÐºÐ°ÑÑе видимоÑÑи, можно опÑимизиÑоваÑÑ ÑÑение Ñ Ð´Ð¸Ñка. ÐаÑÑа видимоÑÑи знаÑиÑелÑно менÑÑе ÑаблиÑÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° легко помеÑаеÑÑÑ Ð² кеÑ, даже когда обÑÑм ÑÑÑÐ°Ð½Ð¸Ñ Ð¾ÑÐµÐ½Ñ Ð²ÐµÐ»Ð¸Ðº.
23.1.5. ÐÑедоÑвÑаÑение оÑибок из-за заÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑÑÑÑика ÑÑанзакÑий
Ð Postgres Pro ÑеманÑика ÑÑанзакÑий MVCC завиÑÐ¸Ñ Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð½Ð¾Ð¼ÐµÑов иденÑиÑикаÑоÑов ÑÑанзакÑий (XID): веÑÑÐ¸Ñ ÑÑÑоки, Ñ ÐºÐ¾ÑоÑой XID добавивÑей ÐµÑ ÑÑанзакÑии болÑÑе, Ñем XID ÑекÑÑей ÑÑанзакÑии, оÑноÑиÑÑÑ Â«Ðº бÑдÑÑемÑ» и не должна бÑÑÑ Ð²Ð¸Ð´Ð½Ð° в ÑекÑÑей ÑÑанзакÑии. Ðднако поÑколÑÐºÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ ÑÑанзакÑий имеÑÑ Ð¾Ð³ÑаниÑеннÑй ÑÐ°Ð·Ð¼ÐµÑ (32 биÑа), клаÑÑеÑ, ÑабоÑаÑÑий долгое вÑÐµÐ¼Ñ (более 4 миллиаÑдов ÑÑанзакÑий) ÑÑолкнÑÑÑÑ Ñ Ð·Ð°Ñикливанием иденÑиÑикаÑоÑов ÑÑанзакÑий: ÑÑÑÑÑик XID пÑокÑÑÑиÑÑÑ Ð´Ð¾ нÑлÑ, и внезапно ÑÑанзакÑии, коÑоÑÑе оÑноÑилиÑÑ Ðº пÑоÑломÑ, окажÑÑÑÑ Ð² бÑдÑÑем â ÑÑо ознаÑаеÑ, ÑÑо Ð¸Ñ ÑезÑлÑÑаÑÑ ÑÑанÑÑ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ñми. Ðдним Ñловом, ÑÑо каÑаÑÑÑоÑиÑеÑÐºÐ°Ñ Ð¿Ð¾ÑеÑÑ Ð´Ð°Ð½Ð½ÑÑ . (Ðа Ñамом деле даннÑе никÑда не пÑопадаÑÑ, однако еÑли Ð²Ñ Ð½Ðµ можеÑе Ð¸Ñ Ð¿Ð¾Ð»ÑÑиÑÑ, Ñо ÑÑо Ñлабое ÑÑеÑение.) ÐÐ»Ñ Ñого ÑÑÐ¾Ð±Ñ ÑÑого избежаÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ вÑполнÑÑÑ Ð¾ÑиÑÑÐºÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑаблиÑÑ Ð² каждой базе даннÑÑ ÐºÐ°Ðº минимÑм ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð½Ð° два миллиаÑдов ÑÑанзакÑий.
ÐеÑиодиÑеÑкое вÑполнение оÑиÑÑки ÑеÑÐ°ÐµÑ ÑÑÑ Ð¿ÑоблемÑ, поÑÐ¾Ð¼Ñ ÑÑо пÑоÑедÑÑа VACUUM помеÑÐ°ÐµÑ ÑÑÑоки как замоÑоженнÑе, ÑказÑваÑ, ÑÑо они бÑли вÑÑÐ°Ð²Ð»ÐµÐ½Ñ ÑÑанзакÑией, заÑикÑиÑованной доÑÑаÑоÑно давно, Ñак ÑÑо ÑÑÑÐµÐºÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑей ÑÑанзакÑии Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ MVCC опÑеделÑнно бÑÐ´ÐµÑ Ð²Ð¸Ð´ÐµÐ½ во вÑеÑ
ÑекÑÑиÑ
и бÑдÑÑиÑ
ÑÑанзакÑиÑÑ
. ÐбÑÑнÑе знаÑÐµÐ½Ð¸Ñ XID ÑÑавниваÑÑÑÑ Ð¿Ð¾ модÑÐ»Ñ 232. ÐÑо ознаÑаеÑ, ÑÑо Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обÑÑного XID ÑÑÑеÑÑвÑÑÑ Ð´Ð²Ð° миллиаÑда знаÑений XID, коÑоÑÑе «ÑÑаÑÑе» него, и два миллиаÑда знаÑений, коÑоÑÑе «младÑе» него; дÑÑгими Ñловами, пÑоÑÑÑанÑÑво знаÑений XID ÑиклиÑно и не Ð¸Ð¼ÐµÐµÑ ÐºÐ¾Ð½ÐµÑной ÑоÑки. СледоваÑелÑно, как ÑолÑко ÑоздаÑÑÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑоки Ñ Ð¾Ð±ÑÑнÑм XID, Ð´Ð»Ñ ÑледÑÑÑиÑ
двÑÑ
миллиаÑдов ÑÑанзакÑий ÑÑа веÑÑÐ¸Ñ ÑÑÑоки оказÑваеÑÑÑ Â«Ð² пÑоÑлом», неважно о каком знаÑении обÑÑного XID Ð¸Ð´ÐµÑ ÑеÑÑ. ÐÑли поÑле двÑÑ
миллиаÑдов ÑÑанзакÑий ÑÑа веÑÑÐ¸Ñ ÑÑÑоки вÑÑ ÐµÑÑ ÑÑÑеÑÑвÑеÑ, она внезапно окажеÑÑÑ Ð² бÑдÑÑем. ÐÐ»Ñ Ñого ÑÑÐ¾Ð±Ñ ÑÑо пÑедоÑвÑаÑиÑÑ, в какой-Ñо Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð½Ð°Ñение XID Ð´Ð»Ñ ÑÑаÑÑÑ
веÑÑий ÑÑÑок должно бÑÑÑ Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ð¾ на FrozenTransactionId (замоÑожено) до Ñого, как бÑÐ´ÐµÑ Ð´Ð¾ÑÑигнÑÑа гÑаниÑа в два миллиаÑда ÑÑанзакÑий. ÐоÑле полÑÑÐµÐ½Ð¸Ñ ÑÑого оÑобенного XID Ð´Ð»Ñ Ð²ÑеÑ
обÑÑнÑÑ
ÑÑанзакÑий ÑÑи веÑÑии ÑÑÑок бÑдÑÑ Ð¾ÑноÑиÑÑÑÑ Â«Ðº пÑоÑломÑ», незавиÑимо Ð¾Ñ Ð·Ð°ÑикливаниÑ, и, Ñаким обÑазом, ÑÑи веÑÑии ÑÑÑок бÑдÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑÐ½Ñ Ð´Ð¾ моменÑа иÑ
ÑдалениÑ, когда Ð±Ñ ÑÑо ни пÑоизоÑло.
ÐÑимеÑание
РвеÑÑиÑÑ
PostgreSQL до 9.4 замоÑаживание бÑло Ñеализовано как замена XID Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑÑоки ÑпеÑиалÑнÑм иденÑиÑикаÑоÑом FrozenTransactionId, коÑоÑÑй можно бÑло ÑвидеÑÑ Ð² ÑиÑÑемной колонке xmin данной ÑÑÑоки. РновÑÑ
веÑÑиÑÑ
пÑоÑÑо ÑÑÑанавливаеÑÑÑ Ð±Ð¸ÑовÑй Ñлаг, а иÑÑ
однÑй xmin ÑÑÑоки ÑоÑ
ÑанÑеÑÑÑ Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð³Ð¾ ÑаÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² бÑдÑÑем. Ðднако ÑÑÑоки Ñ xmin, ÑавнÑм FrozenTransactionId (2), можно по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð²ÑÑÑеÑиÑÑ Ð² базаÑ
даннÑÑ
, обновлÑннÑÑ
(Ñ Ð¿Ñименением pg_upgrade) Ñ Ð²ÐµÑÑий до 9.4.
Также ÑиÑÑемнÑе каÑалоги могÑÑ ÑодеÑжаÑÑ ÑÑÑоки Ñо знаÑением xmin, ÑавнÑм BootstrapTransactionId (1), показÑваÑÑим, ÑÑо они бÑли вÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð½Ð° пеÑвом ÑÑапе initdb. Ðак и FrozenTransactionId, ÑÑÐ¾Ñ ÑпеÑиалÑнÑй XID ÑÑиÑаеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑÑаÑÑм, Ñем лÑбой обÑÑнÑй XID.
ÐаÑамеÑÑ vacuum_freeze_min_age опÑеделÑеÑ, наÑколÑко ÑÑаÑÑм должен ÑÑаÑÑ XID, ÑÑÐ¾Ð±Ñ ÑÑÑоки Ñ Ñаким XID бÑли замоÑоженÑ. УвелиÑение его знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð½ÐµÐ½Ñжной ÑабоÑÑ, еÑли ÑÑÑоки, коÑоÑÑе могли Ð±Ñ Ð±ÑÑÑ Ð·Ð°Ð¼Ð¾ÑÐ¾Ð¶ÐµÐ½Ñ Ð² ближайÑее вÑемÑ, бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÐµÑÑ Ñаз, а ÑменÑÑение пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑвелиÑÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑанзакÑий, коÑоÑÑе могÑÑ Ð²ÑполниÑÑÑÑ, пÑежде Ñем поÑÑебÑеÑÑÑ Ð¾ÑеÑÐµÐ´Ð½Ð°Ñ Ð¾ÑиÑÑка ÑаблиÑÑ.
ÐбÑÑно опеÑаÑÐ¸Ñ VACUUM пÑопÑÑÐºÐ°ÐµÑ ÑÑÑаниÑÑ, в коÑоÑÑÑ
Ð½ÐµÑ Ð¼ÑÑÑвÑÑ
веÑÑий ÑÑÑок, однако в ÑÑиÑ
ÑÑÑаниÑаÑ
могÑÑ Ð²ÑÑ-Ñаки наÑ
одиÑÑÑÑ Ð²ÐµÑÑии ÑÑÑок Ñо ÑÑаÑÑми знаÑениÑми XID. ЧÑÐ¾Ð±Ñ Ð³Ð°ÑанÑиÑоваÑÑ, ÑÑо вÑе ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ XID бÑли замоÑоженÑ, необÑ
одимо ÑканиÑование вÑей ÑаблиÑÑ. ÐаÑамеÑÑ vacuum_freeze_table_age задаÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ, когда VACUUM бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ ÑÑÑ Ð¾Ð¿ÐµÑаÑиÑ: полное ÑканиÑование ÑаблиÑÑ Ð²ÑполнÑеÑÑÑ, еÑли ÑаблиÑа не ÑканиÑовалаÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð² ÑеÑение vacuum_freeze_table_age минÑÑ vacuum_freeze_min_age ÑÑанзакÑий. ÐÑи знаÑении, Ñавном 0, команда VACUUM вÑегда ÑканиÑÑÐµÑ Ð²Ñе ÑÑÑаниÑÑ, ÑакÑиÑеÑки игноÑиÑÑÑ ÐºÐ°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи.
ÐакÑималÑное вÑемÑ, в ÑеÑение коÑоÑого ÑаблиÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±Ñ
одиÑÑÑÑ Ð±ÐµÐ· оÑиÑÑки, ÑоÑÑавлÑÐµÑ Ð´Ð²Ð° миллиаÑда ÑÑанзакÑий минÑÑ Ð·Ð½Ð°Ñение vacuum_freeze_min_age, Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа, когда команда VACUUM поÑледний Ñаз пÑоизводила полное ÑканиÑование ÑаблиÑÑ. ÐÑли Ð±Ñ ÑаблиÑа не подвеÑгалаÑÑ Ð¾ÑиÑÑке долÑÑе, бÑла Ð±Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð° поÑеÑÑ Ð´Ð°Ð½Ð½ÑÑ
. ЧÑÐ¾Ð±Ñ Ð³Ð°ÑанÑиÑоваÑÑ, ÑÑо ÑÑо не пÑоизойдÑÑ, Ð´Ð»Ñ Ð»Ñбой ÑаблиÑÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ XID ÑÑаÑÑе, Ñем возÑаÑÑ, ÑказаннÑй в конÑигÑÑаÑионном паÑамеÑÑе autovacuum_freeze_max_age, вÑзÑваеÑÑÑ Ð°Ð²ÑооÑиÑÑка. (ÐÑо ÑлÑÑиÑÑÑ, даже еÑли авÑооÑиÑÑка оÑклÑÑена.)
ÐÑо ознаÑаеÑ, ÑÑо еÑли оÑиÑÑка ÑаблиÑÑ Ð½Ðµ вÑзÑваеÑÑÑ Ð´ÑÑгим ÑпоÑобом, Ñо авÑооÑиÑÑка Ð´Ð»Ñ Ð½ÐµÑ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿ÑиблизиÑелÑно ÑеÑез каждÑе autovacuum_freeze_max_age минÑÑ vacuum_freeze_min_age ÑÑанзакÑий. ÐÐ»Ñ ÑаблиÑ, оÑиÑаемÑÑ
ÑегÑлÑÑно Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑва, ÑÑо неакÑÑалÑно. Ð Ñо же вÑÐµÐ¼Ñ ÑÑаÑиÑнÑе ÑаблиÑÑ (вклÑÑÐ°Ñ ÑаблиÑÑ, в коÑоÑÑÑ
даннÑе вÑÑавлÑÑÑÑÑ, но не изменÑÑÑÑÑ Ð¸ не ÑдалÑÑÑÑÑ) не нÑждаÑÑÑÑ Ð² оÑиÑÑке Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑва, поÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¾ÑÐµÐ½Ñ Ð±Ð¾Ð»ÑÑиÑ
ÑÑаÑиÑнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑвелиÑиÑÑ Ð¸Ð½ÑеÑвал Ð¼ÐµÐ¶Ð´Ñ Ð²ÑнÑжденнÑми запÑÑками авÑооÑиÑÑки. ÐÑевидно, ÑÑо можно ÑделаÑÑ, либо ÑвелиÑив autovacuum_freeze_max_age, либо ÑменÑÑив vacuum_freeze_min_age.
ФакÑиÑеÑкий макÑимÑм Ð´Ð»Ñ vacuum_freeze_table_age ÑоÑÑавлÑÐµÑ 0.95 * autovacuum_freeze_max_age; болÑÑее знаÑение бÑÐ´ÐµÑ Ð¾Ð³ÑаниÑено ÑÑим пÑеделом. ÐнаÑение, пÑевÑÑаÑÑее autovacuum_freeze_max_age, не имело Ð±Ñ ÑмÑÑла, поÑколÑÐºÑ Ð¿Ð¾ доÑÑижении ÑÑого знаÑÐµÐ½Ð¸Ñ Ð² лÑбом ÑлÑÑае вÑзÑвалаÑÑ Ð±Ñ Ð°Ð²ÑооÑиÑÑка Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð·Ð°ÑикливаниÑ, а коÑÑÑиÑÐ¸ÐµÐ½Ñ 0.95 оÑÑавлÑÐµÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ вÑемени Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÑÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM вÑÑÑнÑÑ Ð´Ð¾ Ñого, как ÑÑо пÑоизойдÑÑ. Ðак пÑавило, ÑÑÑановленное знаÑение vacuum_freeze_table_age должно бÑÑÑ Ð½ÐµÑколÑко менÑÑе autovacuum_freeze_max_age, ÑÑÐ¾Ð±Ñ Ð¾ÑÑавленнÑй пÑомежÑÑок бÑл доÑÑаÑоÑен Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² ÑÑом окне VACUUM по ÑаÑпиÑÐ°Ð½Ð¸Ñ Ð¸Ð»Ð¸ авÑооÑиÑÑки, ÑпÑавлÑемой обÑÑной акÑивноÑÑÑÑ Ð¾Ð¿ÐµÑаÑий ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ изменениÑ. ÐÑли ÑÑо знаÑение бÑÐ´ÐµÑ ÑлиÑком близким к макÑимÑмÑ, авÑооÑиÑÑка Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð·Ð°ÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, даже еÑли ÑаблиÑа ÑолÑко ÑÑо бÑла оÑиÑена Ð´Ð»Ñ Ð²ÑÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¿ÑоÑÑÑанÑÑва, в Ñо же вÑÐµÐ¼Ñ Ð¿Ñи неболÑÑом знаÑении бÑÐ´ÐµÑ ÑаÑе оÑÑÑеÑÑвлÑÑÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ ÑканиÑование ÑаблиÑÑ.
ÐдинÑÑвеннÑй минÑÑ ÑвелиÑÐµÐ½Ð¸Ñ autovacuum_freeze_max_age (и vacuum_freeze_table_age Ñ Ð½Ð¸Ð¼) заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо подкаÑалог pg_clog в клаÑÑеÑе Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
бÑÐ´ÐµÑ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑ Ð±Ð¾Ð»ÑÑе меÑÑа, поÑколÑÐºÑ Ð² нÑм нÑжно бÑÐ´ÐµÑ Ñ
ÑаниÑÑ ÑÑаÑÑÑ ÑикÑаÑии вÑеÑ
ÑÑанзакÑий вплоÑÑ Ð´Ð¾ гоÑизонÑа autovacuum_freeze_max_age. ÐÐ»Ñ ÑÑаÑÑÑа ÑикÑаÑии иÑполÑзÑеÑÑÑ Ð¿Ð¾ два биÑа на ÑÑанзакÑиÑ, поÑÑÐ¾Ð¼Ñ ÐµÑли в autovacuum_freeze_max_age ÑÑÑановлено макÑималÑно допÑÑÑимое знаÑение в два миллиаÑда, Ñо ÑÐ°Ð·Ð¼ÐµÑ pg_clog Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑавиÑÑ Ð¿ÑимеÑно Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñ Ð³Ð¸Ð³Ð°Ð±Ð°Ð¹Ñа. ÐÑли по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑмом ваÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑÑÐ¾Ñ Ð¾Ð±ÑÑм незнаÑиÑелен, Ñогда ÑекомендÑеÑÑÑ ÑÑÑановиÑÑ Ð´Ð»Ñ autovacuum_freeze_max_age макÑималÑно допÑÑÑимое знаÑение. РпÑоÑивном ÑлÑÑае ÑÑÑановиÑе знаÑение ÑÑого паÑамеÑÑа в завиÑимоÑÑи Ð¾Ñ Ð¾Ð±ÑÑма, коÑоÑÑй Ð²Ñ Ð³Ð¾ÑÐ¾Ð²Ñ Ð²ÑделиÑÑ Ð´Ð»Ñ pg_clog. (ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, 200 миллионам ÑÑанзакÑий, ÑооÑвеÑÑÑвÑÐµÑ Ð¿ÑиблизиÑелÑно 50 Ðб в pg_clog.)
УменÑÑение знаÑÐµÐ½Ð¸Ñ vacuum_freeze_min_age, Ñ Ð´ÑÑгой ÑÑоÑонÑ, ÑÑеваÑо Ñем, ÑÑо команда VACUUM Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð±ÐµÑполезнÑÑ ÑабоÑÑ: замоÑаживание веÑÑии ÑÑÑоки â пÑÑÑÐ°Ñ ÑÑаÑа вÑемени, еÑли ÑÑа ÑÑÑока бÑÐ´ÐµÑ Ð²ÑкоÑе изменена (и в ÑезÑлÑÑаÑе полÑÑÐ¸Ñ Ð½Ð¾Ð²Ñй XID). ÐоÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°Ñение ÑÑого паÑамеÑÑа должно бÑÑÑ Ð´Ð¾ÑÑаÑоÑно болÑÑим Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑоки не замоÑаживалиÑÑ, пока иÑ
поÑледÑÑÑее изменение не ÑÑÐ°Ð½ÐµÑ Ð¼Ð°Ð»Ð¾Ð²ÐµÑоÑÑнÑм.
ÐÐ»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾Ð·ÑаÑÑа ÑамÑÑ
ÑÑаÑÑÑ
знаÑений XID в базе даннÑÑ
команда VACUUM ÑоÑ
ÑанÑÐµÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð¿Ð¾ XID в ÑиÑÑемнÑÑ
ÑаблиÑаÑ
pg_class и pg_database. Ð ÑаÑÑноÑÑи, ÑÑÐ¾Ð»Ð±ÐµÑ relfrozenxid в запиÑи Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнной ÑаблиÑÑ Ð² pg_class ÑодеÑÐ¶Ð¸Ñ Ð³ÑаниÑное знаÑение XID, Ñ ÐºÐ¾ÑоÑÑм в поÑледний Ñаз вÑполнÑлаÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ VACUUM Ð´Ð»Ñ Ð²Ñей ÑÑой ÑаблиÑÑ. ÐÑе ÑÑÑоки, добавленнÑе ÑÑанзакÑиÑми Ñ Ð±Ð¾Ð»ÐµÐµ Ñанними XID, гаÑанÑиÑованно бÑдÑÑ Ð·Ð°Ð¼Ð¾ÑоженÑ. ÐналогиÑно ÑÑÐ¾Ð»Ð±ÐµÑ datfrozenxid в ÑÑÑоке ÑаблиÑÑ pg_database пÑедÑÑавлÑÐµÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð³ÑаниÑÑ Ð¾Ð±ÑÑнÑÑ
знаÑений XID, вÑÑÑеÑаÑÑиÑ
ÑÑ Ð² ÑÑой базе даннÑÑ
â он пÑоÑÑо Ñ
ÑÐ°Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»Ñное из вÑеÑ
знаÑений relfrozenxid Ð´Ð»Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð² ÑÑой базе даннÑÑ
. ÐÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ñдобно полÑÑаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑакиÑ
запÑоÑов:
SELECT c.oid::regclass as table_name,
greatest(age(c.relfrozenxid),age(t.relfrozenxid)) as age
FROM pg_class c
LEFT JOIN pg_class t ON c.reltoastrelid = t.oid
WHERE c.relkind IN ('r', 'm');
SELECT datname, age(datfrozenxid) FROM pg_database; СÑÐ¾Ð»Ð±ÐµÑ age показÑÐ²Ð°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑанзакÑий Ð¾Ñ Ð³ÑаниÑного знаÑÐµÐ½Ð¸Ñ XID до XID ÑекÑÑей ÑÑанзакÑии.
ÐбÑÑно VACUUM ÑканиÑÑÐµÑ ÑолÑко Ñе ÑÑÑаниÑÑ, коÑоÑÑе изменÑлиÑÑ Ð¿Ð¾Ñле поÑледней оÑиÑÑки, однако relfrozenxid Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑÑÑ ÑолÑко пÑи полном ÑканиÑовании ÑаблиÑÑ. СканиÑование вÑей ÑаблиÑÑ Ð¿ÑоиÑÑ
одиÑ, когда возÑаÑÑ relfrozenxid доÑÑÐ¸Ð³Ð°ÐµÑ vacuum_freeze_table_age, когда VACUUM вÑзÑваеÑÑÑ Ñ Ñказанием FREEZE, или когда оказÑваеÑÑÑ, ÑÑо оÑиÑÑÐºÑ Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼ÑÑÑвÑÑ
веÑÑий ÑÑÑок нÑжно пÑовеÑÑи во вÑеÑ
ÑÑÑаниÑаÑ
. ÐоÑле Ñого как VACUUM завеÑÑÐ°ÐµÑ ÑканиÑование вÑей ÑаблиÑÑ, знаÑение age(relfrozenxid) должно ÑÑаÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ болÑÑе, Ñем знаÑение vacuum_freeze_min_age (болÑÑе Ñем на ÑиÑло ÑÑанзакÑий, наÑаÑÑÑ
Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа запÑÑка VACUUM). ÐÑли по доÑÑижении autovacuum_freeze_max_age Ð´Ð»Ñ ÑаблиÑÑ Ð½Ð¸ ÑÐ°Ð·Ñ Ð±ÑÐ´ÐµÑ Ð²Ñполнена опеÑаÑÐ¸Ñ VACUUM Ñ Ð¿Ð¾Ð»Ð½Ñм ÑканиÑованием, в ÑкоÑом вÑемени Ð´Ð»Ñ Ð½ÐµÑ Ð±ÑÐ´ÐµÑ Ð¿ÑинÑдиÑелÑно запÑÑена авÑооÑиÑÑка.
ÐÑли по какой-либо пÑиÑине авÑооÑиÑÑка не Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑиÑÑиÑÑ ÑÑаÑÑе знаÑÐµÐ½Ð¸Ñ XID из ÑаблиÑÑ, ÑиÑÑема наÑÐ¸Ð½Ð°ÐµÑ Ð²ÑдаваÑÑ Ð¿ÑедÑпÑеждаÑÑие ÑообÑениÑ, подобнÑе пÑиведÑÐ½Ð½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ðµ, когда Ñамое ÑÑаÑое знаÑение XID в базе даннÑÑ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð² деÑÑÑи Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ð°Ñ ÑÑанзакÑий Ð¾Ñ ÑоÑки заÑикливаниÑ:
ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ: база даннÑÑ "mydb" должна бÑÑÑ Ð¾ÑиÑена (пÑеделÑное ÑиÑло ÑÑанзакÑий: 177009986) ÐÐÐСÐÐÐÐÐ: Ðо избежание оÑклÑÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð²ÑполниÑе оÑиÑÑÐºÑ (VACUUM) вÑей Ð±Ð°Ð·Ñ "mydb".
(ÐÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑеÑиÑÑ, как пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð¿Ð¾Ð´Ñказка, запÑÑÑив VACUUM вÑÑÑнÑÑ; однако ÑÑÑиÑе, ÑÑо вÑполнÑÑÑ VACUUM должен ÑÑпеÑполÑзоваÑелÑ, в пÑоÑивном ÑлÑÑае ÑÑа пÑоÑедÑÑа не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабоÑаÑÑ ÑиÑÑемнÑе каÑалоги и, ÑледоваÑелÑно, не ÑÐ¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑ Ð·Ð½Ð°Ñение datfrozenxid Ð´Ð»Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.) ÐÑли ÑÑи пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ, ÑиÑÑема оÑклÑÑиÑÑÑ Ð¸ не бÑÐ´ÐµÑ Ð½Ð°ÑинаÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ
ÑÑанзакÑий, как ÑолÑко до ÑоÑки заÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑÑанеÑÑÑ Ð¼ÐµÐ½ÐµÐµ 1 миллиона ÑÑанзакÑий:
ÐШÐÐÐÐ: база даннÑÑ Ð½Ðµ пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð²Ð¾ избежание поÑеÑи даннÑÑ Ð¸Ð·-за заÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² ÐÐ "mydb" ÐÐÐСÐÐÐÐÐ: ÐÑÑановиÑе ÑпÑавлÑÑÑий пÑоÑеÑÑ (postmaster) и вÑполниÑе оÑиÑÑÐºÑ (VACUUM) Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² однополÑзоваÑелÑÑком Ñежиме.
РезеÑв в 1 миллион ÑÑанзакÑий позволÑÐµÑ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑÑаÑоÑÑ Ð¿ÑовеÑÑи воÑÑÑановление без поÑеÑи даннÑÑ
, вÑполнив необÑ
одимÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ VACUUM вÑÑÑнÑÑ. Ðднако, поÑколÑÐºÑ Ð¿Ð¾Ñле безопаÑной оÑÑановки ÑиÑÑема не бÑÐ´ÐµÑ Ð¸ÑполнÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, админиÑÑÑаÑоÑÑ Ð¾ÑÑанеÑÑÑ ÑолÑко пеÑезапÑÑÑиÑÑ ÑеÑÐ²ÐµÑ Ð² однополÑзоваÑелÑÑком Ñежиме, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÑÑиÑÑ VACUUM. Ðа подÑобной инÑоÑмаÑией об иÑполÑзовании однополÑзоваÑелÑÑкого Ñежима обÑаÑиÑеÑÑ Ðº ÑÑÑаниÑе ÑпÑавки по postgres.
23.1.5.1. ÐÑлÑÑиÑÑанзакÑии и заÑикливание
ÐденÑиÑикаÑоÑÑ Ð¼ÑлÑÑиÑÑанзакÑий иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки блокиÑовки ÑÑÑок неÑколÑкими ÑÑанзакÑиÑми одновÑеменно. ÐоÑколÑÐºÑ Ð² заголовке ÑÑÑоки еÑÑÑ ÑолÑко огÑаниÑенное пÑоÑÑÑанÑÑво Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½ÑоÑмаÑии о блокиÑовкаÑ
, в нÑм ÑказÑваеÑÑÑ Â«Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвенной ÑÑанзакÑии», или иденÑиÑикаÑÐ¾Ñ Ð¼ÑлÑÑиÑÑанзакÑии Ð´Ð»Ñ ÐºÑаÑкоÑÑи, когда ÑÑÑÐ¾ÐºÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно неÑколÑко ÑÑанзакÑий. ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñом, какие именно иденÑиÑикаÑоÑÑ ÑÑанзакÑий оÑноÑÑÑÑÑ Ðº опÑеделÑнной мÑлÑÑиÑÑанзакÑии, Ñ
ÑаниÑÑÑ Ð¾ÑделÑно в подкаÑалоге pg_multixact, а в поле xmax в заголовке ÑÑÑоки ÑоÑ
ÑанÑеÑÑÑ ÑолÑко иденÑиÑикаÑÐ¾Ñ Ð¼ÑлÑÑиÑÑанзакÑии. Ðак и иденÑиÑикаÑоÑÑ ÑÑанзакÑий, иденÑиÑикаÑоÑÑ Ð¼ÑлÑÑиÑÑанзакÑий иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð² виде 32-ÑазÑÑдного ÑÑÑÑÑика и Ñ
ÑанÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно, ÑÑо ÑÑебÑÐµÑ Ð°ÐºÐºÑÑаÑного ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ñ
возÑаÑÑом, оÑиÑÑкой Ñ
ÑанилиÑа и пÑедоÑвÑаÑением заÑикливаний. СÑÑеÑÑвÑÐµÑ Ð¾ÑделÑÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ, в коÑоÑой ÑодеÑжиÑÑÑ ÑпиÑок Ñленов каждой мÑлÑÑиÑÑанзакÑии, где ÑÑÑÑÑики Ñакже 32-биÑнÑе и ÑÑебÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ð³Ð¾ конÑÑолÑ.
Ðо вÑÐµÐ¼Ñ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ VACUUM, ÑаÑÑиÑного или полного, лÑбой иденÑиÑикаÑÐ¾Ñ Ð¼ÑлÑÑиÑÑанзакÑии, ÑÑаÑее Ñем vacuum_multixact_freeze_min_age, бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ñн дÑÑгим знаÑением, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÑлевÑм, иденÑиÑикаÑоÑом одиноÑной ÑÑанзакÑии или новÑм иденÑиÑикаÑоÑом мÑлÑÑиÑÑанзакÑии. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑаблиÑÑ Ð² pg_class.relminmxid Ñ
ÑаниÑÑÑ ÑамÑй ÑÑаÑÑй возможнÑй иденÑиÑикаÑÐ¾Ñ Ð¼ÑлÑÑиÑÑанзакÑии, вÑе еÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвованнÑй в какой-либо ÑÑÑоке ÑÑой ÑаблиÑÑ. ÐÑли ÑÑо знаÑение оказÑваеÑÑÑ ÑÑаÑее vacuum_multixact_freeze_table_age, вÑполнÑеÑÑÑ Ð¿ÑинÑдиÑелÑное ÑканиÑование вÑей ÑаблиÑÑ. УзнаÑÑ Ð²Ð¾Ð·ÑаÑÑ pg_class.relminmxid можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии mxid_age().
ÐлагодаÑÑ Ð¾Ð¿ÐµÑаÑиÑм VACUUM, ÑканиÑÑÑÑим ÑаблиÑÑ Ñеликом, вне завиÑимоÑÑи Ð¾Ñ Ð¸Ñ
пÑиÑинÑ, ÑÑо знаÑение Ð´Ð»Ñ ÑаблиÑÑ Ð±ÑÐ´ÐµÑ ÑвелиÑиваÑÑÑÑ. РконÑе конÑов, по меÑе ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑеÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð²Ð¾ вÑеÑ
базаÑ
даннÑÑ
и ÑвелиÑÐµÐ½Ð¸Ñ Ð¸Ñ
ÑÑаÑейÑиÑ
знаÑений мÑлÑÑиÑÑанзакÑий, инÑоÑмаÑÐ¸Ñ Ð¾ ÑÑаÑÑÑ
мÑлÑÑиÑÑанзакÑиÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñдалена Ñ Ð´Ð¸Ñка.
РкаÑеÑÑве меÑÑ Ð·Ð°ÑиÑÑ, полное ÑканиÑование ÑаблиÑÑ Ñ ÑелÑÑ Ð¾ÑиÑÑки бÑÐ´ÐµÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð´Ð»Ñ Ð»Ñбой ÑаблиÑÑ, возÑаÑÑ Ð¼ÑлÑÑиÑÑанзакÑий коÑоÑой болÑÑе, Ñем autovacuum_multixact_freeze_max_age. ÐпеÑаÑÐ¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ оÑиÑÑки ÑаблиÑÑ Ñакже бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ÑÑепенно Ñо вÑеми ÑаблиÑами, наÑÐ¸Ð½Ð°Ñ Ñ Ð¸Ð¼ÐµÑÑÐ¸Ñ ÑÑаÑейÑие мÑлÑÑиÑÑанзакÑии, еÑли обÑÑм занÑÑой облаÑÑи Ñленов мÑлÑÑиÑÑанзакÑий пÑевÑÑÐ°ÐµÑ 50% Ð¾Ñ Ð¾Ð±ÑÑма адÑеÑÑемого пÑоÑÑÑанÑÑва. ÐÑи два ваÑианÑа ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑÑÑеÑÑвлÑÑÑÑÑ, даже еÑли пÑоÑеÑÑ Ð°Ð²ÑооÑиÑÑки оÑклÑÑÑн.
23.1.6. Ðемон авÑооÑиÑÑки
Ð Postgres Pro имееÑÑÑ Ð½Ðµ обÑзаÑелÑнаÑ, но наÑÑоÑÑелÑно ÑекомендÑÐµÐ¼Ð°Ñ Ðº иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑнкÑиÑ, назÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð°Ð²ÑооÑиÑÑкой, пÑедназнаÑение коÑоÑой â авÑомаÑизиÑоваÑÑ Ð²Ñполнение команд VACUUM и ANALYZE. Ðогда авÑооÑиÑÑка вклÑÑена, она пÑовеÑÑеÑ, в какиÑ
ÑаблиÑаÑ
бÑло вÑÑавлено, изменено или Ñдалено много ÑÑÑок. ÐÑи ÑÑиÑ
пÑовеÑкаÑ
иÑполÑзÑÑÑÑÑ ÑÑедÑÑва ÑбоÑа ÑÑаÑиÑÑики; поÑÑÐ¾Ð¼Ñ Ð°Ð²ÑооÑиÑÑка бÑÐ´ÐµÑ ÑабоÑаÑÑ, ÑолÑко еÑли паÑамеÑÑ track_counts Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true. РконÑигÑÑаÑии по ÑмолÑÐ°Ð½Ð¸Ñ Ð°Ð²ÑооÑиÑÑка вклÑÑена и ÑооÑвеÑÑÑвÑÑÑие паÑамеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð¿Ð¾Ð´Ñ
одÑÑие знаÑениÑ.
«Ðемон авÑооÑиÑÑки» на Ñамом деле ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· неÑколÑкиÑ
пÑоÑеÑÑов. СÑÑеÑÑвÑÐµÑ Ð¿Ð¾ÑÑоÑннÑй ÑоновÑй пÑоÑеÑÑ, назÑваемÑй пÑоÑеÑÑом запÑÑка авÑооÑиÑÑки, коÑоÑÑй оÑвеÑÐ°ÐµÑ Ð·Ð° запÑÑк ÑабоÑиÑ
пÑоÑеÑÑов авÑооÑиÑÑки Ð´Ð»Ñ Ð²ÑеÑ
баз даннÑÑ
. ÐÑÐ¾Ñ ÐºÐ¾Ð½ÑÑолиÑÑÑÑий пÑоÑеÑÑ ÑаÑпÑеделÑÐµÑ ÑабоÑÑ Ð¿Ð¾ вÑемени, ÑÑаÑаÑÑÑ Ð·Ð°Ð¿ÑÑкаÑÑ ÑабоÑий пÑоÑеÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
каждÑе autovacuum_naptime ÑекÑнд. (СледоваÑелÑно, еÑли вÑего имееÑÑÑ N баз даннÑÑ
, новÑй ÑабоÑий пÑоÑеÑÑ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ ÐºÐ°Ð¶Ð´Ñе autovacuum_naptime/N ÑекÑнд.) ÐдновÑеменно могÑÑ Ð²ÑполнÑÑÑÑÑ Ð´Ð¾ autovacuum_max_workers ÑабоÑиÑ
пÑоÑеÑÑов. ÐÑли ÑиÑло баз даннÑÑ
, ÑÑебÑÑÑиÑ
обÑабоÑки, пÑевÑÑÐ°ÐµÑ autovacuum_max_workers, обÑабоÑка ÑледÑÑÑей Ð±Ð°Ð·Ñ Ð½Ð°ÑинаеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾ завеÑÑении пеÑвого ÑабоÑего пÑоÑеÑÑа. ÐаждÑй ÑабоÑий пÑоÑеÑÑ Ð¿ÑовеÑÑÐµÑ Ð²Ñе ÑаблиÑÑ Ð² Ñвоей базе даннÑÑ
и в ÑлÑÑае необÑ
одимоÑÑи вÑполнÑÐµÑ VACUUM и/или ANALYZE. ÐÐ»Ñ Ð¾ÑÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑвий ÑабоÑиÑ
пÑоÑеÑÑов можно ÑÑÑановиÑÑ Ð¿Ð°ÑамеÑÑ log_autovacuum_min_duration.
ÐÑли в ÑеÑение коÑоÑкого пÑомежÑÑка вÑемени поÑÑебноÑÑÑ Ð² оÑиÑÑке Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ Ð±Ð¾Ð»ÑÑÐ¸Ñ ÑаблиÑ, вÑе ÑабоÑие пÑоÑеÑÑÑ Ð°Ð²ÑооÑиÑÑки могÑÑ Ð¿ÑодолжиÑелÑное вÑÐµÐ¼Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÑÑÑÑ Ð¾ÑиÑÑкой ÑолÑко ÑÑÐ¸Ñ ÑаблиÑ. Ð ÑезÑлÑÑаÑе дÑÑгие ÑаблиÑÑ Ð¸ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð±ÑдÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð¾ÑиÑÑки, пока не поÑвиÑÑÑ ÑвободнÑй ÑабоÑий пÑоÑеÑÑ. ЧиÑло ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ð±Ð°Ð·Ñ Ð½Ðµ огÑаниÑиваеÑÑÑ, пÑи ÑÑом каждÑй пÑоÑеÑÑ ÑÑаÑаеÑÑÑ Ð½Ðµ повÑоÑÑÑÑ ÑабоÑÑ, ÑолÑко ÑÑо вÑполненнÑÑ Ð´ÑÑгими. ÐамеÑÑÑе, ÑÑо в огÑаниÑениÑÑ max_connections или superuser_reserved_connections ÑиÑло вÑполнÑÑÑÐ¸Ñ ÑÑ ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов не ÑÑиÑÑваеÑÑÑ.
ÐÐ»Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ñ relfrozenxid, ÑÑÑаÑевÑим более Ñем на autovacuum_freeze_max_age ÑÑанзакÑий, оÑиÑÑка вÑполнÑеÑÑÑ Ð²Ñегда (ÑÑо Ñакже пÑименимо к ÑаблиÑам, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
макÑималÑнÑй поÑог замоÑозки бÑл изменÑн ÑеÑез паÑамеÑÑÑ Ñ
ÑанениÑ; Ñм. ниже). РпÑоÑивном ÑлÑÑае оÑиÑÑка ÑаблиÑÑ Ð¿ÑоизводиÑÑÑ, еÑли колиÑеÑÑво коÑÑежей, ÑÑÑаÑевÑиÑ
Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа поÑледнего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ VACUUM, пÑевÑÑÐ°ÐµÑ Â«Ð¿Ð¾Ñоговое знаÑение оÑиÑÑки». ÐоÑоговое знаÑение оÑиÑÑки опÑеделÑеÑÑÑ ÐºÐ°Ðº:
поÑог оÑиÑÑки = базовÑй поÑог оÑиÑÑки + коÑÑÑиÑÐ¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¸ Ð´Ð»Ñ Ð¾ÑиÑÑки * колиÑеÑÑво коÑÑежей
где базовÑй поÑог оÑиÑÑки â знаÑение autovacuum_vacuum_threshold, коÑÑÑиÑÐ¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¸ â autovacuum_vacuum_scale_factor, а колиÑеÑÑво коÑÑежей â pg_class.reltuples. ÐолиÑеÑÑво ÑÑÑаÑевÑиÑ
коÑÑежей полÑÑаеÑÑÑ Ð¾Ñ ÑбоÑÑика ÑÑаÑиÑÑики; оно пÑедÑÑавлÑÐµÑ Ñобой пÑиблизиÑелÑное ÑиÑло, обновлÑемое поÑле каждой опеÑаÑии UPDATE и DELETE. (ТоÑноÑÑÑ Ð½Ðµ гаÑанÑиÑÑеÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо пÑи болÑÑой нагÑÑзке ÑаÑÑÑ Ð¸Ð½ÑоÑмаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑеÑÑна.) ÐÑли знаÑение relfrozenxid Ð´Ð»Ñ ÑаблиÑÑ ÑÑаÑее vacuum_freeze_table_age ÑÑанзакÑий, пÑоизводиÑÑÑ ÑканиÑование вÑей ÑаблиÑÑ Ñ ÑелÑÑ Ð·Ð°Ð¼Ð¾ÑозиÑÑ ÑÑаÑÑе веÑÑии ÑÑÑок и ÑвелиÑиÑÑ Ð·Ð½Ð°Ñение relfrozenxid, в пÑоÑивном ÑлÑÑае ÑканиÑÑÑÑÑÑ ÑолÑко ÑÑÑаниÑÑ, изменÑннÑе поÑле поÑледней оÑиÑÑки.
ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑбоÑа ÑÑаÑиÑÑики иÑполÑзÑеÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñное ÑÑловие: поÑоговое знаÑение, опÑеделÑемое как:
поÑог анализа = базовÑй поÑог анализа + коÑÑÑиÑÐ¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¸ Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° * колиÑеÑÑво коÑÑежей
ÑÑавниваеÑÑÑ Ñ Ð¾Ð±Ñим колиÑеÑÑвом коÑÑежей добавленнÑÑ
, изменÑннÑÑ
или ÑдалÑннÑÑ
поÑле поÑледнего вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ANALYZE.
ÐвÑооÑиÑÑка не обÑабаÑÑÐ²Ð°ÐµÑ Ð²ÑеменнÑе ÑаблиÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¾ÑиÑÑÐºÑ Ð¸ ÑÐ±Ð¾Ñ ÑÑаÑиÑÑики в Ð½Ð¸Ñ Ð½Ñжно пÑоизводиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ SQL-команд в обÑÑном ÑеанÑе.
ÐÑполÑзÑемÑе по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾ÑоговÑе знаÑÐµÐ½Ð¸Ñ Ð¸ коÑÑÑиÑиенÑÑ Ð±ÐµÑÑÑÑÑ Ð¸Ð· postgresql.conf, однако иÑ
(и многие дÑÑгие паÑамеÑÑÑ, ÑпÑавлÑÑÑие авÑооÑиÑÑкой) можно пеÑеопÑеделиÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑаблиÑÑ; за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐаÑамеÑÑÑ Ñ
ÑанениÑ. ÐÑли какие-либо знаÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑеÑез паÑамеÑÑÑ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑаблиÑÑ, пÑи обÑабоÑке ÑÑой ÑаблиÑÑ Ð´ÐµÐ¹ÑÑвÑÑÑ Ð¾Ð½Ð¸, а в пÑоÑивном ÑлÑÑае â глобалÑнÑе паÑамеÑÑÑ. Ðа более подÑобной инÑоÑмаÑией о глобалÑнÑÑ
паÑамеÑÑаÑ
обÑаÑиÑеÑÑ Ðº РазделÑ 18.10.
Ðогда вÑполнÑÑÑÑÑ Ð½ÐµÑколÑко ÑабоÑиÑ
пÑоÑеÑÑов, паÑамеÑÑÑ Ð·Ð°Ð´ÐµÑжки авÑооÑиÑÑки по ÑÑоимоÑÑи (Ñм. ÐодÑаздел 18.4.4) «ÑаÑпÑеделÑÑÑÑÑ» Ð¼ÐµÐ¶Ð´Ñ Ð²Ñеми ÑÑими пÑоÑеÑÑами, Ñак ÑÑо обÑее воздейÑÑвие на ÑиÑÑÐµÐ¼Ñ Ð¾ÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñм, незавиÑимо Ð¾Ñ Ð¸Ñ
ÑиÑла. Ðднако ÑÑÐ¾Ñ Ð°Ð»Ð³Ð¾ÑиÑм ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ð³ÑÑзки не ÑÑиÑÑÐ²Ð°ÐµÑ Ð¿ÑоÑеÑÑÑ, обÑабаÑÑваÑÑие ÑаблиÑÑ Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑалÑнÑми знаÑениÑми паÑамеÑÑов Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ autovacuum_vacuum_cost_delay и autovacuum_vacuum_cost_limit.
РабоÑие пÑоÑеÑÑÑ Ð°Ð²ÑооÑиÑÑки обÑÑно не меÑаÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÑÑгиÑ
команд. ÐÑли какой-либо пÑоÑеÑÑ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ, конÑликÑÑÑÑÑÑ Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовкой SHARE UPDATE EXCLUSIVE, коÑоÑÐ°Ñ ÑдеÑживаеÑÑÑ Ð² Ñ
оде авÑооÑиÑÑки, авÑооÑиÑÑка пÑеÑвÑÑÑÑ Ð¸ пÑоÑеÑÑ Ð¿Ð¾Ð»ÑÑÐ¸Ñ Ð½ÑжнÑÑ ÐµÐ¼Ñ Ð±Ð»Ð¾ÐºÐ¸ÑовкÑ. ÐонÑликÑÑÑÑие ÑÐµÐ¶Ð¸Ð¼Ñ Ð±Ð»Ð¾ÐºÐ¸Ñовок оÑмеÑÐµÐ½Ñ Ð² ТаблиÑе 13.2. Ðднако еÑли авÑооÑиÑÑка вÑполнÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑедоÑвÑаÑÐµÐ½Ð¸Ñ Ð·Ð°ÑÐ¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑов ÑÑанзакÑий (Ñ. е. опиÑание запÑоÑа авÑооÑиÑÑки в пÑедÑÑавлении pg_stat_activity заканÑиваеÑÑÑ Ð½Ð° (to prevent wraparound)), авÑооÑиÑÑка не пÑеÑÑваеÑÑÑ Ð±ÐµÐ· ÑÑÑного вмеÑаÑелÑÑÑва.
ÐÑедÑпÑеждение
ÐÑи ÑаÑÑом вÑполнении ÑакиÑ
команд, как ANALYZE, коÑоÑÑе заÑÑебÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки, конÑликÑÑÑÑие Ñ SHARE UPDATE EXCLUSIVE, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑÑÑ Ñак, ÑÑо авÑооÑиÑÑка не бÑÐ´ÐµÑ ÑÑпеваÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑÑ Ð² пÑинÑипе.