F.38. pg_pathman
Ðажно
ÐаÑÐ¸Ð½Ð°Ñ Ñ Postgres Pro 12, иÑполÑзоваÑÑ pg_pathman не ÑекомендÑеÑÑÑ. ÐÑименÑйÑе вмеÑÑо него Ñеализованное в ванилÑной веÑÑии деклаÑаÑивное ÑекÑиониÑование, опиÑанное в Разделе 5.11.
pg_pathman â ÑÑо ÑаÑÑиÑение Postgres Pro, ÑеализÑÑÑее опÑимизиÑованное ÑеÑение Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑÑиÑ
и ÑаÑпÑеделÑннÑÑ
баз даннÑÑ
. ÐÑполÑзÑÑ pg_pathman, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе:
СекÑиониÑоваÑÑ Ð±Ð¾Ð»ÑÑие Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , не пÑеÑÑÐ²Ð°Ñ Ð¸Ñ ÑабоÑÑ.
УÑкоÑÑÑÑ Ð²Ñполнение запÑоÑов Ñ ÑекÑиониÑованнÑми ÑаблиÑами.
УпÑавлÑÑÑ ÑÑÑеÑÑвÑÑÑими и добавлÑÑÑ Ð½Ð¾Ð²Ñе ÑекÑии на леÑÑ.
ÐобавлÑÑÑ Ð² каÑеÑÑве ÑекÑий ÑÑоÑонние ÑаблиÑÑ.
СоединÑÑÑ ÑекÑиониÑованнÑе ÑаблиÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи.
ÐÑо ÑаÑÑиÑение ÑовмеÑÑимо Ñ Postgres Pro 9.5 и новее.
F.38.1. УÑÑановка и наÑÑÑойка
РаÑÑиÑение pg_pathman вклÑÑено в ÑоÑÑав Postgres Pro. УÑÑановив Postgres Pro, вÑполниÑе ÑледÑÑÑие дейÑÑвиÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑÑ pg_pathman к ÑабоÑе:
ÐобавÑÑе
pg_pathmanв пеÑеменнÑÑshared_preload_librariesв Ñайлеpostgresql.conf:shared_preload_libraries = 'pg_pathman'
Ðажно
pg_pathmanÐ¼Ð¾Ð¶ÐµÑ ÐºÐ¾Ð½ÑликÑоваÑÑ Ñ Ð´ÑÑгими ÑаÑÑиÑениÑми, иÑполÑзÑÑÑими Ñе же ÑÑнкÑии Ð´Ð»Ñ Ð¿ÐµÑÐµÑ Ð²Ð°Ñа ÑпÑавлениÑ. ÐапÑимеÑ, возможен конÑликÑpg_pathmanÑpg_stat_statements, Ñак как оба ÑÑи ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÑÑ ÑÑнкÑиÑProcessUtility_hook. Ðо избежание подобнÑÑ Ð¿Ñоблемpg_pathmanдолжен бÑÑÑ Ð²Ñегда поÑледним в ÑпиÑке библиоÑек:shared_preload_libraries = 'pg_stat_statements, pg_pathman'ÐеÑезапÑÑÑиÑе Postgres Pro, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑÑÑпили в ÑилÑ.
СоздайÑе ÑаÑÑиÑение
pg_pathmanÑледÑÑÑим обÑазом:CREATE SCHEMA pathman; GRANT USAGE ON SCHEMA pathman TO PUBLIC; CREATE EXTENSION pg_pathman WITH SCHEMA pathman;
Ðажно
ЧÑÐ¾Ð±Ñ Ð²Ð°Ñи обÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑнкÑиÑм
pg_pathmanбÑли заÑиÑÐµÐ½Ñ Ð¾Ñ Ð°Ñак Ñ Ð¿Ð¾Ð´Ð¼ÐµÐ½Ð¾Ð¹search_path(Ñм. CREATE EXTENSION), ÑÑÑанавливайÑе ÑÑо ÑаÑÑиÑение ÑолÑко в ÑиÑÑÑÑ ÑÑ ÐµÐ¼Ñ, где никÑо, кÑоме ÑÑпеÑполÑзоваÑелей, не Ð¸Ð¼ÐµÐµÑ Ð¿ÑаваCREATEÐ´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ .
ÐоÑле Ñого как ÑаÑÑиÑение pg_pathman бÑÐ´ÐµÑ Ñоздано, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑиÑÑÑпиÑÑ Ðº ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑ.
ÐÑимеÑание
Ðо вÑÐµÐ¼Ñ ÑÑÑановки pg_pathman ÑоздаÑÑ Ð½ÐµÑколÑко полиÑик RLS Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпа к ÑобÑÑвеннÑм ÑаблиÑам. Ðднако ÑдÑо Postgres Pro не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð² полной меÑе вÑгÑÑзкÑ/воÑÑÑановление дампов Ñ ÑаÑÑиÑениÑми, иÑполÑзÑÑÑими в ÑвоиÑ
ÑкÑипÑаÑ
опеÑаÑоÑÑ CREATE POLICY. Ð ÑвÑзи Ñ ÑÑим пÑи воÑÑÑановлении дампа базÑ, в коÑоÑой ÑÑÑановлено ÑаÑÑиÑение pg_pathman, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
вида:
ERROR: policy "allow_select" for table "pathman_config" already exists
(ÐШÐÐÐÐ: полиÑика "allow_select" Ð´Ð»Ñ ÑаблиÑÑ "pathman_config" Ñже ÑÑÑеÑÑвÑеÑ) ÐÑ ÑледÑÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ, Ñак как на полноÑÑ Ð²Ð¾ÑÑÑанавливаемÑÑ Ð´Ð°Ð½Ð½ÑÑ ÑÑи оÑибки не влиÑÑÑ.
ÐодÑказка
ÐÑ Ñакже можеÑе ÑкомпилиÑоваÑÑ pg_pathman из иÑÑ
одного кода, вÑполнив ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð² каÑалоге pg_pathman:
make install USE_PGXS=1
ÐавеÑÑив ÑÑÑ Ð¾Ð¿ÐµÑаÑиÑ, вÑполниÑе ÑледÑÑÑие дейÑÑÐ²Ð¸Ñ Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½ÑÐ°Ð½Ð¸Ñ ÑÑÑановки.
Также не забÑдÑÑе дополниÑелÑно ÑÑÑановиÑÑ Ð¿ÐµÑеменнÑÑ PG_CONFIG, еÑли Ð²Ñ Ñ
оÑиÑе иÑпÑÑаÑÑ pg_pathman в неÑÑандаÑÑной ÑбоÑке Postgres Pro. ÐодÑобнее об ÑÑом Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоÑиÑаÑÑ Ð·Ð´ÐµÑÑ.
ÐклÑÑаÑÑ/оÑклÑÑаÑÑ pg_pathman или его опÑеделÑннÑе ÑÐ·Ð»Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¿ÐµÑеменнÑÑ
GUC. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.38.5.1.
ÐÑли Ð²Ñ Ñ
оÑиÑе полноÑÑÑÑ Ð¾ÑклÑÑиÑÑ pg_pathman Ð´Ð»Ñ Ñанее ÑекÑиониÑованной ÑаблиÑÑ, воÑполÑзÑйÑеÑÑ ÑÑнкÑией disable_pathman_for():
SELECT disable_pathman_for('range_rel');ÐÑе ÑекÑии и даннÑе оÑÑанÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñми и бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑÑандаÑÑнÑм Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Postgres Pro.
F.38.1.1. Ðбновление ÑаÑÑиÑÐµÐ½Ð¸Ñ pg_pathman
ÐÑли Ñ Ð²Ð°Ñ Ñже бÑла ÑÑÑановлена пÑедÑдÑÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ pg_pathman, вÑполниÑе ÑледÑÑÑие дейÑÑÐ²Ð¸Ñ Ð´Ð»Ñ ÑÑÑановки новой веÑÑии:
УÑÑановиÑе Postgres Pro.
ÐеÑезапÑÑÑиÑе клаÑÑÐµÑ Postgres Pro.
ÐÑли Ñ Ð²Ð°Ñ Ñже бÑла ÑÑÑановлена пÑедÑдÑÑÐ°Ñ Ð¾ÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð²ÐµÑÑиÑ
pg_pathman(в ÐµÑ Ð½Ð¾Ð¼ÐµÑе дÑÑÐ³Ð°Ñ Ð²ÑоÑÐ°Ñ ÑиÑÑа), вÑполниÑе ÑледÑÑÑие дейÑÑÐ²Ð¸Ñ Ð´Ð»Ñ ÑÑÑановки новой веÑÑии:ALTER EXTENSION pg_pathman UPDATE TO
веÑÑиÑ; SET pg_pathman.enable = t;ÐдеÑÑ
веÑÑиÑâ ÑÑо Ð½Ð¾Ð¼ÐµÑ Ð¾Ñновной веÑÑииpg_pathman, напÑимеÑ, 1.5.УзнаÑÑ ÑекÑÑÑÑ Ð²ÐµÑÑиÑ
pg_pathmanможно, воÑполÑзовавÑиÑÑ ÑÑнкÑиейpathman_version().
F.38.2. ÐÑполÑзование
ÐÑÐ±Ð¾Ñ ÑÑÑаÑегии ÑекÑиониÑованиÑ
ÐÑÑÑеÑÑвление неблокиÑÑÑÑего пеÑеноÑа даннÑÑ
СекÑиониÑование по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð²ÑÑажениÑ
СекÑиониÑование по ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ
РеализаÑÐ¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑÑовневого ÑекÑиониÑованиÑ
УпÑавление ÑекÑиÑми
Ðо меÑе ÑвелиÑÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑÑановиÑÑÑÑ Ð½ÐµÑÑÑекÑивнÑми и запÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÑполнÑÑÑÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ медленнее. ÐÐ»Ñ Ð¿Ð¾Ð²ÑÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи, ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¼Ð°ÑÑÑабиÑÑемоÑÑи и опÑимизаÑии пÑоÑеÑÑов админиÑÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑекÑиониÑование â Ñазделение болÑÑой ÑаблиÑÑ Ð½Ð° множеÑÑво менÑÑÐ¸Ñ Ð¿Ð¾ ÑазмеÑÑ, когда вÑе ÑÑÑоки ÑазмеÑаÑÑÑÑ Ð² ÑекÑиÑÑ ÑоглаÑно клÑÑÑ ÑекÑиониÑованиÑ.
ÐÑÑоÑиÑеÑки Postgres Pro поддеÑживал ÑекÑиониÑование ÑеÑез меÑ
анизм наÑледованиÑ, когда ÐºÐ°Ð¶Ð´Ð°Ñ ÑекÑÐ¸Ñ ÑоздавалаÑÑ Ð² виде доÑеÑней ÑаблиÑÑ Ñ Ð¾Ð³ÑаниÑением-пÑовеÑкой. Ð Postgres Pro 10 поÑвилаÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка деклаÑаÑивного ÑекÑиониÑованиÑ, коÑоÑÐ°Ñ Ñакже полагаеÑÑÑ Ð½Ð° наÑледование. ÐÑи Ñаком подÑ
оде планиÑовÑик запÑоÑов должен вÑполниÑÑ Ð¿Ð¾Ð»Ð½Ñй пеÑÐµÐ±Ð¾Ñ Ð¸ пÑовеÑÐºÑ ÑÑловий огÑаниÑений Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии, ÑÑÐ¾Ð±Ñ Ð¿Ð¾ÑÑÑоиÑÑ Ð¿Ð»Ð°Ð½ вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, ÑÑо влеÑÑÑ Ð·Ð°Ð¼ÐµÐ´Ð»ÐµÐ½Ð¸Ðµ запÑоÑов к ÑаблиÑам Ñ Ð±Ð¾Ð»ÑÑим колиÑеÑÑвом ÑекÑий. РаÑÑиÑение pg_pathman иÑполÑзÑÐµÑ Ð¾Ð¿ÑимизиÑованнÑе алгоÑиÑÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÑнкÑии ÑекÑиониÑованиÑ, ÑÑиÑÑваÑÑие внÑÑÑеннÑÑ ÑÑÑÑкÑÑÑÑ ÑекÑиониÑованнÑÑ
ÑаблиÑ, ÑÑо позволÑÐµÑ Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð»ÑÑÑей пÑоизводиÑелÑноÑÑи. Ðолее подÑобно деÑали ÑеализаÑии pg_pathman опиÑÐ°Ð½Ñ Ð² ÐодÑазделе F.38.4.
F.38.2.1. ÐÑÐ±Ð¾Ñ ÑÑÑаÑегии ÑекÑиониÑованиÑ
РаÑÑиÑение pg_pathman поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑледÑÑÑие ÑÑÑаÑегии ÑекÑиониÑованиÑ:
Ðо Ñ ÐµÑÑ â ÑÑÑоки ÑопоÑÑавлÑÑÑÑÑ Ñ ÑекÑиÑми Ñ Ð¸ÑполÑзованием ÑнивеÑÑалÑной ÑÑнкÑии Ñ ÐµÑиÑованиÑ. ÐÑбеÑиÑе ÑÑÑ ÑÑÑаÑегиÑ, еÑли в болÑÑинÑÑве запÑоÑов бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾Ð¸Ñк ÑоÑного ÑооÑвеÑÑÑвиÑ.
Ðо диапазонам â ÑÑÑоки ÑопоÑÑавлÑÑÑÑÑ Ñ ÑекÑиÑми по диапазонам клÑÑа ÑекÑиониÑованиÑ, назнаÑаемÑм каждой ÑекÑии. ÐÑбеÑиÑе ÑÑÑ ÑÑÑаÑегиÑ, еÑли ваÑа база даннÑÑ ÑодеÑÐ¶Ð¸Ñ ÑиÑловÑе даннÑе, коÑоÑÑе, ÑкоÑее вÑего, бÑдÑÑ Ð¿ÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑÐµÑ ÐºÐ°Ðº знаÑÐµÐ½Ð¸Ñ Ð² инÑеÑÐ²Ð°Ð»Ð°Ñ . ÐапÑимеÑ, Ð²Ð°Ñ Ð¼Ð¾Ð³ÑÑ Ð¸Ð½ÑеÑеÑоваÑÑ Ð¸ÑÑоÑиÑеÑкие даннÑе по годам или ÑезÑлÑÑаÑÑ ÑкÑпеÑименÑов в опÑеделÑннÑÑ ÑиÑловÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°Ñ . ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²ÑигÑÑÑа в пÑоизводиÑелÑноÑÑи
pg_pathmanиÑполÑзÑÐµÑ Ð°Ð»Ð³Ð¾ÑиÑм бинаÑного поиÑка.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ pg_pathman пеÑеноÑÐ¸Ñ Ð²Ñе даннÑе из ÑодиÑелÑÑкой ÑаблиÑÑ Ð² ÑоздаваемÑе ÑекÑии ÑÑÐ°Ð·Ñ (пÑоизводиÑÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑÑÑÑее ÑекÑиониÑование). ÐÑи Ñаком подÑ
оде Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе измениÑÑ ÑÑÑÑкÑÑÑÑ ÑаблиÑÑ Ð² одной ÑÑанзакÑии, но еÑли обÑÑм даннÑÑ
велик, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к пÑиоÑÑановке ÑабоÑÑ. ÐÑли важно, ÑÑÐ¾Ð±Ñ ÑабоÑа не пÑеÑÑвалаÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вÑполниÑÑ Ð¿Ð°ÑаллелÑное ÑекÑиониÑование. Ð ÑÑом ÑлÑÑае pg_pathman запиÑÑÐ²Ð°ÐµÑ Ð²Ñе новÑе даннÑе в ÑозданнÑе ÑекÑии, но ÑоÑ
ÑанÑÐµÑ Ð¸ÑÑ
однÑе даннÑе в ÑодиÑелÑÑкой ÑаблиÑе, пока Ð²Ñ Ñвно не пеÑенеÑÑÑе иÑ
. ÐÑо позволÑÐµÑ ÑекÑиониÑоваÑÑ Ð±Ð¾Ð»ÑÑие Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, не пÑеÑÑÐ²Ð°Ñ ÑабоÑÑ, Ñак как Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе вÑбÑаÑÑ Ñдобное вÑÐµÐ¼Ñ Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ
и пеÑеноÑиÑÑ Ð¸Ñ
неболÑÑими поÑÑиÑми, не блокиÑÑÑ Ð´ÑÑгие ÑÑанзакÑии. ÐодÑобнее паÑаллелÑное ÑекÑиониÑование опиÑано в ÐодÑазделе F.38.2.2.
F.38.2.1.1. ÐÑганизаÑÐ¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ Ñ ÐµÑÑ
ЧÑÐ¾Ð±Ñ Ð²ÑполниÑÑ ÑекÑиониÑование по Ñ
еÑÑ Ñ Ð¿Ñименением pg_pathman, воÑполÑзÑйÑеÑÑ ÑÑнкÑией create_hash_partitions():
create_hash_partitions(parent_relid REGCLASS,
expression TEXT,
partitions_count INTEGER,
partition_data BOOLEAN DEFAULT TRUE,
partition_names TEXT[] DEFAULT NULL,
tablespaces TEXT[] DEFAULT NULL)ÐодÑÐ»Ñ pg_pathman ÑоздаÑÑ Ñказанное ÑиÑло ÑекÑий, иÑполÑзÑÑ Ñ
еÑ-ÑÑнкÑиÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе Ñакже ÑказаÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑекÑий и ÑаблиÑнÑÑ
пÑоÑÑÑанÑÑв, задав паÑамеÑÑÑ partition_names и tablespaces, ÑооÑвеÑÑÑвенно.
ÐоÑле Ñого как ÑаблиÑа Ñазделена на ÑекÑии, ÑдалÑÑÑ Ð¸Ð»Ð¸ добавлÑÑÑ ÑекÑии в ней нелÑзÑ. Ðднако пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи опÑеделÑннÑÑ ÑекÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ замениÑÑ Ð´ÑÑгой ÑаблиÑей:
replace_hash_partition(old_partition REGCLASS,
new_partition REGCLASS,
lock_parent BOOL DEFAULT TRUE);ÐÑли паÑамеÑÑ lock_parent Ñавен true, никакие запÑоÑÑ INSERT/UPDATE/ALTER TABLE в ÑодиÑелÑÑкой ÑаблиÑе не ÑазÑеÑаÑÑÑÑ.
ÐÑли Ð²Ñ Ð¾Ð¿ÑÑÑиÑе необÑзаÑелÑнÑй паÑамеÑÑ partition_data или зададиÑе Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ знаÑение true, вÑе даннÑе из ÑодиÑелÑÑкой ÑаблиÑÑ Ð±ÑдÑÑ Ð¿ÐµÑенеÑÐµÐ½Ñ Ð² ÑекÑии. ÐодÑÐ»Ñ pg_pathman заблокиÑÑÐµÑ ÑÑÑ ÑаблиÑÑ Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑÑанзакÑий до завеÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеноÑа даннÑÑ
. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿ÑиоÑÑановки ÑабоÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаÑÑ Ð² паÑамеÑÑе partition_data знаÑение false и заÑем вÑзваÑÑ ÑÑнкÑÐ¸Ñ partition_table_concurrently() Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ
без блокиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´ÑÑгиÑ
запÑоÑов. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.38.2.2.
F.38.2.1.2. ÐÑганизаÑÐ¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам
ÐодÑÐ»Ñ pg_pathman пÑедоÑÑавлÑÐµÑ ÑÑнкÑÐ¸Ñ create_range_partitions() Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам. ÐÑа ÑÑнкÑÐ¸Ñ ÑоздаÑÑ ÑекÑии, иÑÑ
Ð¾Ð´Ñ Ð¸Ð· заданного инÑеÑвала и наÑалÑного знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа ÑекÑиониÑованиÑ. ÐовÑе ÑекÑии бÑдÑÑ ÑоздаваÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑи добавлении даннÑÑ
, не попадаÑÑиÑ
в Ñанее оÑ
ваÑеннÑй инÑеÑвал.
create_range_partitions(parent_relid REGCLASS,
expression TEXT,
start_value ANYELEMENT,
p_interval ANYELEMENT | INTERVAL,
p_count INTEGER DEFAULT NULL,
partition_data BOOLEAN DEFAULT TRUE)ÐодÑÐ»Ñ pg_pathman ÑоздаÑÑ ÑекÑии в завиÑимоÑÑи Ð¾Ñ Ð¿ÐµÑеданнÑÑ
паÑамеÑÑов. ÐÑли необÑзаÑелÑнÑй паÑамеÑÑ p_count опÑÑен, pg_pathman вÑÑиÑлÑÐµÑ ÑÑебÑемое ÑиÑло ÑекÑий, иÑÑ
Ð¾Ð´Ñ Ð¸Ð· заданного наÑалÑного знаÑÐµÐ½Ð¸Ñ Ð¸ инÑеÑвала. ÐÑли заÑем бÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе вне Ñанее заданного диапазона, pg_pathman ÑоздаÑÑ Ð½Ð¾Ð²Ñе ÑекÑии авÑомаÑиÑеÑки, ÑоÑ
ÑанÑÑ ÑказаннÑй инÑеÑвал. ÐÑи Ñаком подÑ
оде вÑе ÑекÑии оказÑваÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑазмеÑа, ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑпоÑобÑÑвоваÑÑ ÑÑкоÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов и ÑпÑоÑÐµÐ½Ð¸Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñми.
Также Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе задаÑÑ Ð¼Ð°ÑÑив, опÑеделÑÑÑий гÑаниÑÑ ÑоздаваемÑÑ
ÑекÑий, в паÑамеÑÑе bounds:
create_range_partitions(parent_relid REGCLASS,
expression TEXT,
bounds ANYARRAY,
partition_names TEXT[] DEFAULT NULL,
tablespaces TEXT[] DEFAULT NULL,
partition_data BOOLEAN DEFAULT TRUE)ÐÑли ÑÑебÑеÑÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе Ñакже иÑполÑзоваÑÑ ÑÑнкÑии ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑекÑиÑми и добавлÑÑÑ ÑекÑии вÑÑÑнÑÑ. ÐапÑимеÑ, еÑли Ð¼ÐµÐ¶Ð´Ñ ÑозданнÑми ÑекÑиÑми обÑазовалÑÑ Ð¿ÑомежÑÑок, pg_pathman не ÑÐ¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ ÐµÐ³Ð¾ новой ÑекÑией в авÑомаÑиÑеÑком Ñежиме.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñе даннÑе из ÑодиÑелÑÑкой ÑаблиÑÑ Ð±ÑдÑÑ Ð¿ÐµÑенеÑÐµÐ½Ñ Ð² Ñказанное колиÑеÑÑво ÑекÑий. ÐодÑÐ»Ñ pg_pathman заблокиÑÑÐµÑ ÑÑÑ ÑаблиÑÑ Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑÑанзакÑий до завеÑÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеноÑа даннÑÑ
. ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿ÑиоÑÑановки ÑабоÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаÑÑ Ð² паÑамеÑÑе partition_data знаÑение false и заÑем вÑзваÑÑ ÑÑнкÑÐ¸Ñ partition_table_concurrently() Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ
без блокиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´ÑÑгиÑ
запÑоÑов. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.38.2.2.
F.38.2.2. ÐÑÑÑеÑÑвление неблокиÑÑÑÑего пеÑеноÑа даннÑÑ
ÐÑли важно не допÑÑÑиÑÑ Ð¿ÑеÑÑÐ²Ð°Ð½Ð¸Ñ ÑабоÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑоизвеÑÑи ÑекÑиониÑование в паÑаллелÑном Ñежиме, ÑÑÑановив Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа partition_data знаÑение false. Ð ÑÑом ÑлÑÑае pg_pathman ÑоздаÑÑ Ð¿ÑÑÑÑе ÑекÑии и оÑÑÐ°Ð²Ð¸Ñ Ð²Ñе иÑÑ
однÑе даннÑе в ÑодиÑелÑÑкой ÑаблиÑе. ÐÑи ÑÑом вÑе новÑе запиÑи бÑдÑÑ Ð¿Ð¾Ð¿Ð°Ð´Ð°ÑÑ Ð² ÑозданнÑе ÑекÑии. Ðозднее Ð²Ñ ÑможеÑе пеÑемеÑÑиÑÑ Ð²Ñе наÑалÑнÑе даннÑе в ÑооÑвеÑÑÑвÑÑÑие ÑекÑии, не блокиÑÑÑ Ð´ÑÑгие запÑоÑÑ, воÑполÑзовавÑиÑÑ ÑÑнкÑией partition_table_concurrently():
partition_table_concurrently(relation REGCLASS,
batch_size INTEGER DEFAULT 1000,
sleep_time FLOAT8 DEFAULT 1.0)ÐдеÑÑ:
relationâ ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа.batch_sizeâ колиÑеÑÑво ÑÑÑок, коÑоÑое должно копиÑоваÑÑÑÑ Ð¸Ð· ÑодиÑелÑÑкой ÑаблиÑÑ Ð² ÑекÑии за один Ñаз. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð»Ñбое Ñелое знаÑение Ð¾Ñ 1 до 10000.sleep_timeâ инÑеÑвал вÑемени Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ð¿ÑÑками пеÑеноÑа даннÑÑ , в ÑекÑÐ½Ð´Ð°Ñ .
ÐодÑÐ»Ñ pg_pathman запÑÑÐºÐ°ÐµÑ ÑоновÑй ÑабоÑий пÑоÑеÑÑ Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ
из ÑодиÑелÑÑкой ÑаблиÑÑ Ð² ÑекÑии маленÑкими поÑÑиÑми, ÑÐ°Ð·Ð¼ÐµÑ ÐºÐ¾ÑоÑÑÑ
задаÑÑÑÑ Ð¿Ð°ÑамеÑÑом batch_size. ÐÑли одна или неÑколÑко ÑÑÑок в поÑÑии оказалиÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸ÑÐ¾Ð²Ð°Ð½Ñ Ð´ÑÑгими запÑоÑами, pg_pathman ждÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ðµ вÑÐµÐ¼Ñ (sleep_time) и повÑоÑÑÐµÑ Ð¿Ð¾Ð¿ÑÑÐºÑ (до 60 Ñаз). Ðа пÑоÑеÑÑом пеÑеноÑа даннÑÑ
можно наблÑдаÑÑ Ð² пÑедÑÑавлении pathman_concurrent_part_tasks, показÑваÑÑем колиÑеÑÑво ÑÑÑок, обÑабоÑаннÑÑ
на даннÑй моменÑ:
[user]postgres: select * from pathman_concurrent_part_tasks ; userid | pid | dbid | relid | processed | status --------+-------+-------+-------+-----------+--------- user | 20012 | 12413 | test | 334000 | working (1 row)
ÐÑли поÑÑебÑеÑÑÑ Ð¾ÑÑановиÑÑ Ð¿ÐµÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе в лÑбое вÑÐµÐ¼Ñ Ð²ÑполниÑÑ ÑÑнкÑÐ¸Ñ stop_concurrent_part_task():
SELECT stop_concurrent_part_task(relation REGCLASS);
pg_pathman завеÑÑÐ¸Ñ Ð¿ÐµÑÐµÐ½Ð¾Ñ ÑекÑÑей поÑÑии и пÑекÑаÑÐ¸Ñ Ð¿ÑоÑеÑÑ Ð¿ÐµÑеноÑа.
ÐодÑказка
Ðогда pg_pathman пеÑенеÑÑÑ Ð²Ñе даннÑе из ÑодиÑелÑÑкой ÑаблиÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑклÑÑиÑÑ ÐµÑ Ð¸Ð· плана запÑоÑа. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ ÑÑнкÑии set_enable_parent().
F.38.2.3. СекÑиониÑование по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð²ÑÑажениÑ
ÐÐ»Ñ ÑÑÑаÑегий ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ Ð¸ Ñ
еÑÑ pg_pathman поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑекÑиониÑование по вÑÑажениÑ, возвÑаÑаÑÑÐµÐ¼Ñ Ð¾Ð´Ð½Ð¾ ÑкалÑÑное знаÑение. ÐÑÑажением ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑлка на ÑÑÐ¾Ð»Ð±ÐµÑ ÑаблиÑÑ Ð¸Ð»Ð¸ вÑÑиÑление клÑÑа ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¸ÑполÑзованием знаÑений одного или неÑколÑкиÑ
ÑÑолбÑов.
ÐодÑказка
ÐÑли Ð²Ð°Ñ Ð¸Ð½ÑеÑеÑÑÐµÑ ÑекÑиониÑование ÑаблиÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑÑежа, обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.38.2.4.
ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð¿Ð¾ вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑйÑе ÑÑнкÑии ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ pg_pathman. ÐÑÑажение ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ ÑооÑвеÑÑÑвоваÑÑ ÑледÑÑÑим ÑÑловиÑм:
РвÑÑажении должен ÑигÑÑиÑоваÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один ÑÑÐ¾Ð»Ð±ÐµÑ ÑекÑиониÑÑемой ÑаблиÑÑ.
ÐÑе ÑигÑÑиÑÑÑÑие в нÑм ÑÑолбÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ ÑвойÑÑво
NOT NULL.РвÑÑажении нелÑÐ·Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑиÑÑемнÑм аÑÑибÑÑам, Ñаким как
oid,xmin,xmaxи Ñ. д.РвÑÑажение нелÑÐ·Ñ Ð²ÐºÐ»ÑÑаÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑÑ.
ÐÑе ÑÑнкÑии, иÑполÑзÑемÑе вÑÑажением, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ñ ÐºÐ°Ðº
IMMUTABLE.
Так как вÑÑажение Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð·Ð½Ð°Ñение пÑакÑиÑеÑки лÑбого Ñипа, возвÑаÑаемое знаÑение нÑжно пÑивеÑÑи к ÑипÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑого вÑполнÑеÑÑÑ ÑекÑиониÑование.
ÐÐ»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑекÑии необÑ
одимо иÑполÑзоваÑÑ Ð² ÑоÑноÑÑи Ñо вÑÑажение, по коÑоÑÐ¾Ð¼Ñ Ð²Ñполнено ÑекÑиониÑование. РпÑоÑивном ÑлÑÑае pg_pathman не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑимизиÑоваÑÑ Ð·Ð°Ð¿ÑоÑ. ÐÑоÑмоÑÑеÑÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²ÑеÑ
ÑекÑиониÑованнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в ÑаблиÑе pathman_config.
F.38.2.3.1. ÐÑимеÑÑ
ÐÑедположим, ÑÑо Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑаблиÑа test, ÑодеÑжаÑÐ°Ñ Ð½ÐµÐºÐ¾ÑоÑÑе даннÑе jsonb:
CREATE TABLE test(col jsonb NOT NULL);
INSERT INTO test
SELECT format('{"key": %s, "date": "%s", "value": "%s"}',
i, current_date, md5(i::text))::jsonb
FROM generate_series(1, 10000 * 10) as g(i);ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑой ÑаблиÑÑ Ð¿Ð¾ диапазонам знаÑÐµÐ½Ð¸Ñ key, вам нÑжно извлеÑÑ ÑÑо знаÑение из обÑекÑа jsonb и пÑеобÑазоваÑÑ ÐµÐ³Ð¾ в ÑиÑловой Ñип, напÑимеÑ, в bigint:
SELECT create_range_partitions('test', '(col->>''key'')::bigint', 1, 10000, 10);Ð ÑезÑлÑÑаÑе pg_pathman ÑÐ°Ð·Ð´ÐµÐ»Ð¸Ñ ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð½Ð° деÑÑÑÑ ÑекÑий и помеÑÑÐ¸Ñ Ð² каждÑÑ 10000 ÑÑÑок:
SELECT * FROM pathman_partition_list; parent | partition | parttype | expr | range_min | range_max --------+-----------+----------+---------------------------------+-----------+----------- test | test_1 | 2 | ((col ->> 'key'::text))::bigint | 1 | 10001 test | test_2 | 2 | ((col ->> 'key'::text))::bigint | 10001 | 20001 test | test_3 | 2 | ((col ->> 'key'::text))::bigint | 20001 | 30001 test | test_4 | 2 | ((col ->> 'key'::text))::bigint | 30001 | 40001 test | test_5 | 2 | ((col ->> 'key'::text))::bigint | 40001 | 50001 test | test_6 | 2 | ((col ->> 'key'::text))::bigint | 50001 | 60001 test | test_7 | 2 | ((col ->> 'key'::text))::bigint | 60001 | 70001 test | test_8 | 2 | ((col ->> 'key'::text))::bigint | 70001 | 80001 test | test_9 | 2 | ((col ->> 'key'::text))::bigint | 80001 | 90001 test | test_10 | 2 | ((col ->> 'key'::text))::bigint | 90001 | 100001 (10 rows)
F.38.2.4. СекÑиониÑование по ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ
ÐÑполÑзÑÑ pg_pathman, Ð²Ñ Ñакже можеÑе ÑеализоваÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð¾Ðµ ÑекÑиониÑование по ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ. СоÑÑавной клÑÑ Ð¾Ð±ÑазÑеÑÑÑ Ð¸Ð· двÑÑ
или неÑколÑкиÑ
ÑазделÑннÑÑ
запÑÑÑми ÑлеменÑов, коÑоÑÑми могÑÑ Ð±ÑÑÑ ÑÑÑлки на ÑÑолбÑÑ Ð¸Ð»Ð¸ вÑÑажениÑ, извлекаÑÑие знаÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑаблиÑÑ. ÐÑÑажениÑ, опÑеделÑÑÑие ÑоÑÑавной клÑÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдовлеÑвоÑÑÑÑ ÑÑловиÑм, пеÑеÑиÑленнÑм в ÐодÑазделе F.38.2.3.
ХоÑÑ pg_pathman не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð°Ð²ÑомаÑиÑеÑкое Ñоздание ÑекÑий Ñ ÑоÑÑавнÑм клÑÑом, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе добавлÑÑÑ ÑекÑии, иÑполÑзÑÑ ÑÑнкÑÐ¸Ñ add_range_partition(). ÐбÑÑно ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ñак:
ÐклÑÑиÑе авÑомаÑиÑеÑкое наименование ÑекÑий Ð´Ð»Ñ Ð²Ð°Ñей ÑаблиÑÑ, вÑзвав ÑÑнкÑиÑ
create_naming_sequence().СоздайÑе ÑоÑÑавной клÑÑ ÑекÑиониÑованиÑ.
ÐаÑегиÑÑÑиÑÑйÑе ÑаблиÑÑ, коÑоÑÑÑ Ð²Ñ Ð±ÑдеÑе ÑекÑиониÑоваÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ
pg_pathman, воÑполÑзовавÑиÑÑ ÑÑнкÑиейadd_to_pathman_config().ÐобавÑÑе ÑекÑии на оÑнове ÑоÑÑавного клÑÑа ÑекÑиониÑованиÑ, вÑзвав ÑÑнкÑиÑ
add_range_partition().
F.38.2.4.1. ÐÑимеÑÑ
ÐÑедположим, ÑÑо Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑаблиÑа test, ÑодеÑжаÑÐ°Ñ Ð½ÐµÐºÐ¾ÑоÑÑе даннÑе Ñ Ð´Ð°Ñами:
CREATE TABLE test (logdate date NOT NULL, comment text);
ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÐ°ÐºÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾ меÑÑÑам и годам вам нÑжно ÑоздаÑÑ ÑоÑÑавной клÑÑ:
CREATE TYPE test_key AS (year float8, month float8);
ÐÐ»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð°Ð²ÑомаÑиÑеÑкого Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ ÑекÑий вÑполниÑе ÑÑнкÑÐ¸Ñ create_naming_sequence(), пеÑедав в каÑеÑÑве аÑгÑменÑа Ð¸Ð¼Ñ ÑаблиÑÑ:
SELECT create_naming_sequence('test');ÐаÑегиÑÑÑиÑÑйÑе ÑаблиÑÑ test в pg_pathman, Ñказав клÑÑ ÑекÑиониÑованиÑ, коÑоÑÑй Ð²Ñ Ð½Ð°Ð¼ÐµÑÐµÐ½Ñ Ð¸ÑполÑзоваÑÑ:
SELECT add_to_pathman_config('test',
'( extract(year from logdate),
extract(month from logdate) )::test_key',
NULL);СоздайÑе ÑекÑиÑ, вклÑÑаÑÑÑÑ Ð²Ñе даннÑе в инÑеÑвале деÑÑÑи леÑ, наÑÐ¸Ð½Ð°Ñ Ñ ÑнваÑÑ ÑекÑÑего кода:
SELECT add_range_partition('test',
(extract(year from current_date), 1)::test_key,
(extract(year from current_date + '10 years'::interval), 1)::test_key);F.38.2.5. РеализаÑÐ¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑÑовневого ÑекÑиониÑованиÑ
pg_pathman поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ÑÑовневое ÑекÑиониÑование Ð´Ð»Ñ ÑÑÑаÑегий ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ по Ñ
еÑÑ, и по диапазонам. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÑÑи ÑÑÑаÑегии в лÑбом ÑоÑеÑании: ÑаблиÑа, ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ Ñ
еÑам или диапазонам, заÑем Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑекÑиониÑована и по диапазонам, и по Ñ
еÑÑ.
ЧÑÐ¾Ð±Ñ ÑазбиÑÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑекÑÐ¸Ñ Ð½Ð° неÑколÑко доÑеÑниÑ
, иÑполÑзÑйÑе обÑÑнÑе ÑÑнкÑии ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ pg_pathman, как опиÑано в ÐодÑазделе F.38.2.1, пеÑÐµÐ´Ð°Ð²Ð°Ñ Ð¸Ð¼Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑекÑии в паÑамеÑÑе parent_relid. ТоÑнÑе имена ÑекÑий Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑзнаÑÑ Ð¸Ð· пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ pathman_partition_list.
ÐÑи ÑеализаÑии диапазонного ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð²Ð½ÑÑÑенним диапазоннÑм ÑекÑиониÑованием можно вÑбÑаÑÑ Ð´Ð»Ñ Ð²Ð½ÑÑÑеннего ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð±Ð¾ дÑÑгое вÑÑажение, либо Ñо же, ÑÑо задано Ð´Ð»Ñ ÑодиÑелÑÑкой ÑаблиÑÑ. РпеÑвом ÑлÑÑае, еÑли вÑбÑаннÑй диапазон болÑÑе диапазона ÑодиÑелÑÑкой ÑаблиÑÑ, бÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑолÑко Ñе доÑеÑние ÑекÑии, диапазон коÑоÑÑÑ Ð¿ÐµÑеÑекаеÑÑÑ Ñ ÑодиÑелÑÑким. ÐÑÑгие доÑеÑние ÑекÑии оÑÑанÑÑÑÑ Ð¿ÑÑÑÑми, еÑли ÑолÑко не пÑоизойдÑÑ Ð¾Ð±Ñединение Ð¸Ñ ÑодиÑелÑÑкой ÑекÑии Ñ ÑоÑедними, в ÑезÑлÑÑаÑе коÑоÑого Ñ Ð¾ÑÑ Ð±Ñ ÑаÑÑиÑно бÑÐ´ÐµÑ Ð¾Ñ Ð²Ð°Ñен Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½.
F.38.2.5.1. ÐÑимеÑÑ
ÐÑедположим, ÑÑо Ñ Ð²Ð°Ñ ÐµÑÑÑ ÑаблиÑа journal, ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾ меÑÑÑам:
-- Ñоздание пÑÑÑой ÑаблиÑÑ
CREATE TABLE journal (
id SERIAL,
dt TIMESTAMP NOT NULL,
level INTEGER,
msg TEXT);
-- добавление в ÑаблиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ
даннÑÑ
INSERT INTO journal (dt, level, msg)
SELECT g, random() * 6, md5(g::text)
FROM generate_series('2015-01-01'::date, '2015-12-31'::date, '1 minute') as g;
-- ÑекÑиониÑование ÑаблиÑÑ Ð¿Ð¾ диапазонам
SELECT create_range_partitions('journal', 'dt', '2015-01-01'::date, '1 month'::interval);ÐÑли в какой-Ñо Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÑановиÑÑÑ Ð²Ñгоднее имеÑÑ Ð¼ÐµÐ½ÑÑие ÑекÑии, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе дополниÑелÑно ÑазбиÑÑ ÑÑÑеÑÑвÑÑÑие по диапазонам или по ÑекÑиÑм. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ ÑазбиÑÑ ÑекÑÐ¸Ñ journal_1 на менÑÑие по днÑм, вÑполниÑе:
SELECT create_range_partitions('journal_1', 'dt', '2015-01-01'::date, '1 day'::interval);ÐодобнÑм обÑазом Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе ÑекÑии Ñ ÑекÑиониÑованием по Ñ
еÑÑ. ÐапÑимеÑ, Ñак можно ÑазбиÑÑ ÑекÑÐ¸Ñ journal_2 на пÑÑÑ ÑекÑий, иÑполÑзÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ id в каÑеÑÑве клÑÑа ÑекÑиониÑованиÑ:
SELECT create_hash_partitions('journal_2', 'id', '5');F.38.2.6. УпÑавление ÑекÑиÑми
pg_pathman пÑедоÑÑавлÑÐµÑ Ð½Ð°Ð±Ð¾Ñ ÑÑнкÑий Ð´Ð»Ñ Ð¿ÑоÑÑого ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑекÑиÑми. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ F.38.5.3.4.
F.38.3. ÐÑимеÑÑ
F.38.3.1. ÐбÑие ÑекомендаÑии
Так можно полÑÑиÑÑ ÑÑолбеÑ
partition, ÑодеÑжаÑий имена нижележаÑÐ¸Ñ ÑекÑий, воÑполÑзовавÑиÑÑ ÑиÑÑемнÑм аÑÑибÑÑомtableoid:SELECT tableoid::regclass AS partition, * FROM partitioned_table;
ÐеÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо индекÑÑ Ð² ÑодиÑелÑÑкой ÑаблиÑе не оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ (Ñак как пÑедполагаеÑÑÑ, ÑÑо она пÑÑÑа), они вÑполнÑÑÑ ÑÐ¾Ð»Ñ Ð¿ÑоÑоÑипов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов в ÑекÑиÑÑ . ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ индекÑа в ÑодиÑелÑÑкой ÑаблиÑе
pg_pathmanÑоздаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñй Ð¸Ð½Ð´ÐµÐºÑ Ð² каждой ÑекÑии.ÐолÑÑиÑÑ ÑпиÑок вÑÐµÑ ÑекÑÑÐ¸Ñ Ð·Ð°Ð´Ð°Ñ Ð¿Ð°ÑаллелÑного ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ в пÑедÑÑавлении
pathman_concurrent_part_tasks:SELECT * FROM pathman_concurrent_part_tasks; userid | pid | dbid | relid | processed | status --------+------+-------+-------+-----------+--------- user | 7367 | 16384 | test | 472000 | working (1 row)
ÐÑедÑÑавление
pathman_partition_listв ÑоÑеÑании Ñdrop_range_partition()Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑий более гибким обÑазом по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ Ð¾Ð±ÑÑнÑмDROP TABLE:SELECT drop_range_partition(partition, false) /* пеÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ Ð² ÑодиÑелÑÑкÑÑ ÑаблиÑÑ */ FROM pathman_partition_list WHERE parent = 'part_test'::regclass AND range_min::int < 500; NOTICE: 1 rows copied from part_test_11 NOTICE: 100 rows copied from part_test_1 NOTICE: 100 rows copied from part_test_2 drop_range_partition ---------------------- dummy_test_11 dummy_test_1 dummy_test_2 (3 rows)
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ ÑÑоÑонние ÑаблиÑÑ ÑекÑиÑми Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии
attach_range_partition(). Ð ÑезÑлÑÑаÑе ÑÑÑоки, добавлÑемÑе в ÑодиÑелÑÑкÑÑ ÑаблиÑÑ, бÑдÑÑ Ð¿ÐµÑенапÑавлÑÑÑÑÑ Ð² ÑÑи ÑÑоÑонние ÑекÑии Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼PartitionFilter. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ðµ ÑÑÑок в Ñакие ÑекÑии ÑазÑеÑаеÑÑÑ ÑолÑко пÑи иÑполÑзовании обÑÑÑки ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑpostgres_fdw. ÐÑо поведение ÑпÑавлÑеÑÑÑ Ð¿ÐµÑеменнойpg_pathman.insert_into_fdw. ÐÐ»Ñ ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð¿Ñава ÑÑпеÑполÑзоваÑелÑ.
F.38.3.2. СекÑиониÑование по Ñ ÐµÑÑ
РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑаблиÑÑ Ð¿Ð¾ Ñ ÐµÑÑ. ÐÐ»Ñ Ð½Ð°Ñала Ñоздадим ÑаблиÑÑ Ñ ÑелоÑиÑленнÑм ÑÑолбÑом:
CREATE TABLE items ( id SERIAL PRIMARY KEY, name TEXT, code BIGINT); INSERT INTO items (id, name, code) SELECT g, md5(g::text), random() * 100000 FROM generate_series(1, 100000) as g;
ТепеÑÑ Ð²Ñполним ÑÑнкÑÐ¸Ñ create_hash_partitions() Ñ Ð¿Ð¾Ð´Ñ
одÑÑими аÑгÑменÑами:
SELECT create_hash_partitions('items', 'id', 100);ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ ÑоздаÑÑ Ð½Ð¾Ð²Ñе ÑекÑии и пеÑемеÑÑÐ¸Ñ Ð² Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñе из ÑодиÑелÑÑкой ÑаблиÑÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа, вÑполнÑÑÑего ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ клÑÑÑ ÑекÑиониÑованиÑ:
SELECT * FROM items WHERE id = 1234; id | name | code ------+----------------------------------+------ 1234 | 81dc9bdb52d04dc20036dbd8313ed055 | 1855 (1 row) EXPLAIN SELECT * FROM items WHERE id = 1234; QUERY PLAN ------------------------------------------------------------------------------------ Append (cost=0.28..8.29 rows=0 width=0) -> Index Scan using items_34_pkey on items_34 (cost=0.28..8.29 rows=0 width=0) Index Cond: (id = 1234)
ÐамеÑÑÑе, Ñзел Append ÑодеÑÐ¶Ð¸Ñ ÑолÑко одно доÑеÑнее ÑканиÑование, ÑооÑвеÑÑÑвÑÑÑее пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE.
Ðажно
ÐбÑаÑиÑе внимание на ÑÐ¾Ñ ÑакÑ, ÑÑо pg_pathman иÑклÑÑÐ°ÐµÑ ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð¸Ð· плана запÑоÑа.
ЧÑÐ¾Ð±Ñ Ð¾Ð±ÑаÑиÑÑÑÑ Ðº ÑодиÑелÑÑкой ÑаблиÑе, иÑполÑзÑйÑе модиÑикаÑÐ¾Ñ ONLY:
EXPLAIN SELECT * FROM ONLY items; QUERY PLAN ------------------------------------------------------ Seq Scan on items (cost=0.00..0.00 rows=1 width=45)
F.38.3.3. СекÑиониÑование по диапазонам
РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам. ÐавайÑе Ñоздадим ÑаблиÑÑ, ÑодеÑжаÑÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¶ÑÑнала:
CREATE TABLE journal (
id SERIAL,
dt TIMESTAMP NOT NULL,
level INTEGER,
msg TEXT);
-- подобнÑй Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñакже Ñоздан Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии
CREATE INDEX ON journal(dt);
-- генеÑиÑÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе даннÑе
INSERT INTO journal (dt, level, msg)
SELECT g, random() * 6, md5(g::text)
FROM generate_series('2015-01-01'::date, '2015-12-31'::date, '1 minute') as g;ÐÑполним ÑÑнкÑÐ¸Ñ create_range_partitions(), ÑÑÐ¾Ð±Ñ ÑоздаÑÑ ÑекÑии, коÑоÑÑе бÑдÑÑ ÑодеÑжаÑÑ Ð´Ð°Ð½Ð½Ñе за один денÑ:
SELECT create_range_partitions('journal', 'dt', '2015-01-01'::date, '1 day'::interval);ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ ÑоздаÑÑ 364 ÑекÑии и пеÑемеÑÑÐ¸Ñ Ð² Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñе из ÑодиÑелÑÑкой ÑаблиÑÑ.
ÐовÑе ÑекÑии добавлÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑÑиггеÑом INSERT, но ÑÑо можно ÑделаÑÑ Ð¸ вÑÑÑнÑÑ, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑÐ¸Ñ ÑÑнкÑий:
-- добавление новой ÑекÑии Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм диапазоном
SELECT add_range_partition('journal', '2016-01-01'::date, '2016-01-07'::date);
-- добавление новой ÑекÑии Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼ по ÑмолÑаниÑ
SELECT append_range_partition('journal');ÐеÑÐ²Ð°Ñ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм диапазоном. ÐÑоÑÐ°Ñ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ ÑекÑÐ¸Ñ Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð¼, заданнÑм пÑи пеÑвонаÑалÑном ÑекÑиониÑовании, и добавлÑÐµÑ ÐµÑ Ð² ÐºÐ¾Ð½ÐµÑ ÑпиÑка ÑекÑий. Также можно пÑиÑоединиÑÑ ÑÑÑеÑÑвÑÑÑÑÑ ÑаблиÑÑ Ð² каÑеÑÑве ÑекÑии. ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ подклÑÑиÑÑ ÑаблиÑÑ Ð°ÑÑ Ð¸Ð²Ð° (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð°Ð¶Ðµ ÑÑоÑоннÑÑ ÑаблиÑа Ñ Ð´ÑÑгого ÑеÑвеÑа) Ñ Ð¸ÑÑоÑиÑеÑкими даннÑми:
CREATE FOREIGN TABLE journal_archive (
id INTEGER NOT NULL,
dt TIMESTAMP NOT NULL,
level INTEGER,
msg TEXT)
SERVER archive_server;
SELECT attach_range_partition('journal', 'journal_archive', '2014-01-01'::date, '2015-01-01'::date);Ðажно
ÐÑиÑоединÑÐ½Ð½Ð°Ñ ÑаблиÑа должна ÑодеÑжаÑÑ Ñакие же ÑÑолбÑÑ, ÑÑо и ÑекÑиониÑÑемаÑ, за иÑклÑÑением ÑдалÑннÑÑ
. ÐÑи ÑÑолбÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ñе же ÑипÑ, пÑавила ÑоÑÑиÑовки и Ñ
аÑакÑеÑиÑÑики NOT NULL, ÑÑо и иÑÑ
однÑе.
ÐÐ»Ñ ÑлиÑÐ½Ð¸Ñ Ð´Ð²ÑÑ
ÑоÑедниÑ
ÑекÑий иÑполÑзÑйÑе ÑÑнкÑÐ¸Ñ merge_range_partitions():
SELECT merge_range_partitions('journal_archive', 'journal_1');ЧÑÐ¾Ð±Ñ ÑазделиÑÑ ÑекÑÐ¸Ñ Ð¿Ð¾ знаÑениÑ, воÑполÑзÑйÑеÑÑ ÑÑнкÑией split_range_partition():
SELECT split_range_partition('journal_366', '2016-01-03'::date);ЧÑÐ¾Ð±Ñ Ð¾ÑÑоединиÑÑ ÑекÑиÑ, воÑполÑзÑйÑеÑÑ ÑÑнкÑией detach_range_partition():
SELECT detach_range_partition('journal_archive');ÐÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа, вÑполнÑÑÑего ÑилÑÑÑаÑÐ¸Ñ Ð¿Ð¾ клÑÑÑ ÑекÑиониÑованиÑ:
SELECT * FROM journal WHERE dt >= '2015-06-01' AND dt < '2015-06-03'; id | dt | level | msg --------+---------------------+-------+---------------------------------- 217441 | 2015-06-01 00:00:00 | 2 | 15053892d993ce19f580a128f87e3dbf 217442 | 2015-06-01 00:01:00 | 1 | 3a7c46f18a952d62ce5418ac2056010c 217443 | 2015-06-01 00:02:00 | 0 | 92c8de8f82faf0b139a3d99f2792311d ... (2880 rows) EXPLAIN SELECT * FROM journal WHERE dt >= '2015-06-01' AND dt < '2015-06-03'; QUERY PLAN ------------------------------------------------------------------ Append (cost=0.00..58.80 rows=0 width=0) -> Seq Scan on journal_152 (cost=0.00..29.40 rows=0 width=0) -> Seq Scan on journal_153 (cost=0.00..29.40 rows=0 width=0) (3 rows)
F.38.4. ÐнÑÑÑеннее ÑÑÑÑойÑÑво
РаÑÑиÑение pg_pathman ÑоÑ
ÑанÑÐµÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑаблиÑе pathman_config; ÐºÐ°Ð¶Ð´Ð°Ñ ÐµÑ ÑÑÑока ÑодеÑÐ¶Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑекÑиониÑованной ÑаблиÑÑ (название оÑноÑениÑ, ÑÑÐ¾Ð»Ð±ÐµÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñип ÑекÑиониÑованиÑ). Ðа ÑÑапе иниÑиализаÑии модÑÐ»Ñ pg_pathman кеÑиÑÑÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð´Ð¾ÑеÑниÑ
ÑекÑий в обÑей памÑÑи, а заÑем она Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð¿Ñи поÑÑÑоении плана. Ðогда наÑÐ¸Ð½Ð°ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ SELECT, pg_pathman пÑоÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾ деÑÐµÐ²Ñ ÑÑловий в поиÑке вÑÑажений вида:
VARIABLE OP CONST
где VARIABLE â ÑÑо клÑÑ ÑекÑиониÑованиÑ, OP â опеÑаÑÐ¾Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ (поддеÑживаÑÑÑÑ =, <, <=, >, >=), CONST â ÑкалÑÑное знаÑение. ÐапÑимеÑ:
WHERE id = 150
ÐаÑем, ÑÑиÑÑÐ²Ð°Ñ ÑÑÑаÑÐµÐ³Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ опеÑаÑÐ¾Ñ ÑÑловиÑ, pg_pathman иÑÐµÑ ÑооÑвеÑÑÑвÑÑÑие ÑекÑии и ÑÑÑÐ¾Ð¸Ñ Ð¿Ð»Ð°Ð½.
F.38.4.1. ÐополниÑелÑнÑе ÑÐ·Ð»Ñ Ð¿Ð»Ð°Ð½Ð°
pg_pathman пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко неÑÑандаÑÑнÑÑ
Ñзлов плана, позволÑÑÑиÑ
ÑокÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑполнениÑ, а именно:
RuntimeAppend(пеÑеопÑеделÑÐµÑ Ñзел планаAppend)RuntimeMergeAppend(пеÑеопÑеделÑÐµÑ Ñзел планаMergeAppend)PartitionFilter(вÑполнÑÐµÑ ÑÐ¾Ð»Ñ ÑÑиггеÑов INSERT)PartitionRouterÑеализÑÐµÑ Ð¼ÐµÐ¶ÑекÑионнÑе UPDATE вмеÑÑо ÑÑиггеÑов
PartitionFilter дейÑÑвÑÐµÑ ÐºÐ°Ðº пÑокÑи-Ñзел Ð´Ð»Ñ Ð´Ð¾ÑеÑниÑ
Ñзлов INSERT, Ñо еÑÑÑ Ð¾Ð½ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑенапÑавлÑÑÑ Ð²ÑÑ
однÑе коÑÑежи в ÑооÑвеÑÑÑвÑÑÑие ÑекÑии:
EXPLAIN (COSTS OFF)
INSERT INTO partitioned_table
SELECT generate_series(1, 10), random();
QUERY PLAN
-----------------------------------------
Insert on partitioned_table
-> Custom Scan (PartitionFilter)
-> Subquery Scan on "*SELECT*"
-> Result
(4 rows)Узел PartitionRouter пÑедÑÑавлÑÐµÑ Ñобой еÑÑ Ð¾Ð´Ð¸Ð½ пÑомежÑÑоÑнÑй Ñзел, иÑполÑзÑемÑй вмеÑÑе Ñ PartitionFilter Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶ÑекÑионнÑÑ
опеÑаÑий UPDATE, имеÑÑиÑ
меÑÑо, напÑимеÑ, пÑи изменении одного из ÑÑолбÑов клÑÑа ÑекÑиониÑованиÑ.
Ðажно
Узел PartitionRouter пÑеобÑазÑÐµÑ Ð¼ÐµÐ¶ÑекÑионнÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE в DELETE + INSERT. Ð Postgres Pro до веÑÑии 11 ÑÑа опеÑаÑÐ¸Ñ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°Ñна, Ñак как pg_pathman не Ð¸Ð¼ÐµÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи опÑеделиÑÑ, бÑла ли изменÑÐ½Ð½Ð°Ñ ÑÑÑока Ñдалена или пеÑемеÑена в дÑÑгÑÑ ÑекÑиÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ñзел PartitionRouter оÑклÑÑÑн во избежание нежелаÑелÑнÑÑ
побоÑнÑÑ
ÑÑÑекÑов. ЧÑÐ¾Ð±Ñ Ð²ÐºÐ»ÑÑиÑÑ ÐµÐ³Ð¾, задайÑе Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа pg_pathman.enable_partitionrouter знаÑение on.
EXPLAIN (COSTS OFF)
UPDATE partitioned_table
SET value = value + 1 WHERE value = 2;
QUERY PLAN
---------------------------------------------------
Update on partitioned_table_0
-> Custom Scan (PartitionRouter)
-> Custom Scan (PartitionFilter)
-> Seq Scan on partitioned_table_0
Filter: (value = 2)
(5 rows)RuntimeAppend и RuntimeMergeAppend имеÑÑ Ð¼Ð½Ð¾Ð³Ð¾ обÑего: они оказÑваÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñми, когда ÑÑловие WHERE пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð²Ð¸Ð´:
VARIABLE OP PARAM
ÐодобнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñже не могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑимизиÑÐ¾Ð²Ð°Ð½Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, Ñак как знаÑение паÑамеÑÑа оказÑваеÑÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑм до ÑÑадии вÑполнениÑ. РеÑиÑÑ ÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾, вклÑÑив пÑоÑедÑÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° ÑÑÐ»Ð¾Ð²Ð¸Ñ WHERE в пеÑвонаÑалÑнÑй код Ñзла Append, Ñаким обÑазом позволÑÑ ÐµÐ¼Ñ Ð²ÑбиÑаÑÑ ÑолÑко нÑжнÑе ваÑианÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· вÑего набоÑа планиÑÑемÑÑ
ÑканиÑований. ÐÑо по ÑÑÑи ÑводиÑÑÑ Ðº ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÑÑандаÑÑного Ñзла, ÑпоÑобного вÑполнÑÑÑ Ñакие пÑовеÑки.
ÐÑÑÑ Ð¿Ð¾ менÑÑе меÑе неÑколÑко ÑиÑÑаÑий, коÑоÑÑе демонÑÑÑиÑÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ÑÑÑ ÑÐ°ÐºÐ¸Ñ Ñзлов:
/* ÑоздаÑÑ ÑаблиÑÑ, коÑоÑÑÑ Ð¼Ñ Ð±Ñдем ÑекÑиониÑоваÑÑ */
CREATE TABLE partitioned_table(id INT NOT NULL, payload REAL);
/* вÑÑавиÑÑ Ð¿ÑоизволÑнÑе даннÑе */
INSERT INTO partitioned_table
SELECT generate_series(1, 1000), random();
/* вÑполниÑÑ ÑекÑиониÑование */
SELECT create_hash_partitions('partitioned_table', 'id', 100);
/* ÑоздаÑÑ Ð¾Ð±ÑÑнÑÑ ÑаблиÑÑ */
CREATE TABLE some_table AS SELECT generate_series(1, 100) AS VAL;
id = (select ... limit 1)EXPLAIN (COSTS OFF, ANALYZE) SELECT * FROM partitioned_table WHERE id = (SELECT * FROM some_table LIMIT 1); QUERY PLAN ---------------------------------------------------------------------------------------------------- Custom Scan (RuntimeAppend) (actual time=0.030..0.033 rows=1 loops=1) InitPlan 1 (returns $0) -> Limit (actual time=0.011..0.011 rows=1 loops=1) -> Seq Scan on some_table (actual time=0.010..0.010 rows=1 loops=1) -> Seq Scan on partitioned_table_70 partitioned_table (actual time=0.004..0.006 rows=1 loops=1) Filter: (id = $0) Rows Removed by Filter: 9 Planning time: 1.131 ms Execution time: 0.075 ms (9 rows) /* оÑклÑÑиÑÑ Ñзел RuntimeAppend */ SET pg_pathman.enable_runtimeappend = f; EXPLAIN (COSTS OFF, ANALYZE) SELECT * FROM partitioned_table WHERE id = (SELECT * FROM some_table LIMIT 1); QUERY PLAN ---------------------------------------------------------------------------------- Append (actual time=0.196..0.274 rows=1 loops=1) InitPlan 1 (returns $0) -> Limit (actual time=0.005..0.005 rows=1 loops=1) -> Seq Scan on some_table (actual time=0.003..0.003 rows=1 loops=1) -> Seq Scan on partitioned_table_0 (actual time=0.014..0.014 rows=0 loops=1) Filter: (id = $0) Rows Removed by Filter: 6 -> Seq Scan on partitioned_table_1 (actual time=0.003..0.003 rows=0 loops=1) Filter: (id = $0) Rows Removed by Filter: 5 ... /* more plans follow */ Planning time: 1.140 ms Execution time: 0.855 ms (306 rows)id = ANY (select ...)EXPLAIN (COSTS OFF, ANALYZE) SELECT * FROM partitioned_table WHERE id = any (SELECT * FROM some_table limit 4); QUERY PLAN ----------------------------------------------------------------------------------------------------------- Nested Loop (actual time=0.025..0.060 rows=4 loops=1) -> Limit (actual time=0.009..0.011 rows=4 loops=1) -> Seq Scan on some_table (actual time=0.008..0.010 rows=4 loops=1) -> Custom Scan (RuntimeAppend) (actual time=0.002..0.004 rows=1 loops=4) -> Seq Scan on partitioned_table_70 partitioned_table (actual time=0.001..0.001 rows=10 loops=1) -> Seq Scan on partitioned_table_26 partitioned_table (actual time=0.002..0.003 rows=9 loops=1) -> Seq Scan on partitioned_table_27 partitioned_table (actual time=0.001..0.002 rows=20 loops=1) -> Seq Scan on partitioned_table_63 partitioned_table (actual time=0.001..0.002 rows=9 loops=1) Planning time: 0.771 ms Execution time: 0.101 ms (10 rows) /* оÑклÑÑиÑÑ Ñзел RuntimeAppend */ SET pg_pathman.enable_runtimeappend = f; EXPLAIN (COSTS OFF, ANALYZE) SELECT * FROM partitioned_table WHERE id = any (SELECT * FROM some_table limit 4); QUERY PLAN ----------------------------------------------------------------------------------------- Nested Loop Semi Join (actual time=0.531..1.526 rows=4 loops=1) Join Filter: (partitioned_table.id = some_table.val) Rows Removed by Join Filter: 3990 -> Append (actual time=0.190..0.470 rows=1000 loops=1) -> Seq Scan on partitioned_table (actual time=0.187..0.187 rows=0 loops=1) -> Seq Scan on partitioned_table_0 (actual time=0.002..0.004 rows=6 loops=1) -> Seq Scan on partitioned_table_1 (actual time=0.001..0.001 rows=5 loops=1) -> Seq Scan on partitioned_table_2 (actual time=0.002..0.004 rows=14 loops=1) ... /* 96 scans follow */ -> Materialize (actual time=0.000..0.000 rows=4 loops=1000) -> Limit (actual time=0.005..0.006 rows=4 loops=1) -> Seq Scan on some_table (actual time=0.003..0.004 rows=4 loops=1) Planning time: 2.169 ms Execution time: 2.059 ms (110 rows)NestLoop(вложеннÑй Ñикл) Ñ ÑекÑиониÑованной ÑаблиÑей, коÑоÑÐ°Ñ Ð¾Ð¿ÑÑена здеÑÑ, Ñак как бÑла показана вÑÑе.
УзнаÑÑ Ð±Ð¾Ð»ÑÑе о неÑÑандаÑÑнÑÑ ÑÐ·Ð»Ð°Ñ Ð¿Ð»Ð°Ð½Ð° Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе в блоге ÐлекÑандÑа ÐоÑоÑкова.
F.38.5. СпÑавка
F.38.5.1. ÐеÑеменнÑе GUC
ÐÐ»Ñ Ð²ÐºÐ»ÑÑениÑ/оÑклÑÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÑÐ»Ñ pg_pathman и оÑделÑнÑÑ
Ñзлов плана пÑедназнаÑÐµÐ½Ñ Ð½ÐµÑколÑко пеÑеменнÑÑ
GUC:
pg_pathman.enableâ вклÑÑÐ°ÐµÑ (оÑклÑÑаеÑ) модÑлÑpg_pathman.Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.enable_runtimeappendâ вклÑÑÐ°ÐµÑ Ð½ÐµÑÑандаÑÑнÑй ÑзелRuntimeAppend.Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.enable_runtimemergeappendâ вклÑÑÐ°ÐµÑ Ð½ÐµÑÑандаÑÑнÑй ÑзелRuntimeMergeAppend.Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.enable_partitionfilterâ вклÑÑÐ°ÐµÑ Ð½ÐµÑÑандаÑÑнÑй ÑзелPartitionFilter, вÑполнÑÑÑий межÑекÑионнÑе опеÑаÑииINSERT.Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.enable_partitionrouterâ вклÑÑÐ°ÐµÑ Ð½ÐµÑÑандаÑÑнÑй ÑзелPartitionRouter, вÑполнÑÑÑий межÑекÑионнÑе опеÑаÑииUPDATE.Ðо ÑмолÑаниÑ:
offpg_pathman.enable_auto_partitionâ вклÑÑÐ°ÐµÑ Ð°Ð²ÑомаÑиÑеÑкое Ñоздание ÑекÑий (в ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа).Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.enable_bounds_cacheâ вклÑÑаеÑ/оÑклÑÑÐ°ÐµÑ ÐºÐµÑ Ð³ÑаниÑ.Ðо ÑмолÑаниÑ:
on(вкл.)pg_pathman.insert_into_fdwâ ÑазÑеÑÐ°ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð¿ÐµÑаÑииINSERTÑ ÑазлиÑнÑми обÑÑÑками ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐозможнÑе знаÑениÑ:disabled(Ñакое иÑполÑзование запÑеÑено),postgres(ÑазÑеÑено Ð´Ð»Ñ Ð¾Ð±ÑÑÑки postgres) иany_fdw(ÑазÑеÑено Ð´Ð»Ñ Ð»ÑбÑÑ Ð¾Ð±ÑÑÑок).Ðо ÑмолÑаниÑ:
postgrespg_pathman.override_copyâ вклÑÑаеÑ/оÑклÑÑÐ°ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°Ñ Ð¾Ð¿ÐµÑаÑоÑаCOPY.Ðо ÑмолÑаниÑ:
on(вкл.)
F.38.5.2. ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑаблиÑÑ
F.38.5.2.1. pathman_config
Ð ÑÑой ÑаблиÑе Ñ ÑаниÑÑÑ ÑпиÑок ÑекÑиониÑованнÑÑ ÑаблиÑ. ÐÑо оÑновное Ñ ÑанилиÑе конÑигÑÑаÑии.
CREATE TABLE IF NOT EXISTS pathman_config (
partrel REGCLASS NOT NULL PRIMARY KEY,
attname TEXT NOT NULL,
parttype INTEGER NOT NULL,
range_interval TEXT);F.38.5.2.2. pathman_config_params
Ð ÑÑой ÑаблиÑе Ñ
ÑанÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе паÑамеÑÑÑ, пеÑеопÑеделÑÑÑие ÑÑандаÑÑное поведение pg_pathman.
CREATE TABLE IF NOT EXISTS pathman_config_params (
partrel REGCLASS NOT NULL PRIMARY KEY,
enable_parent BOOLEAN NOT NULL DEFAULT TRUE,
auto BOOLEAN NOT NULL DEFAULT TRUE,
init_callback REGPROCEDURE NOT NULL DEFAULT 0,
spawn_using_bgw BOOLEAN NOT NULL DEFAULT FALSE);F.38.5.2.3. pathman_concurrent_part_tasks
Ð ÑÑом пÑедÑÑавлении показÑваÑÑÑÑ Ð²Ñе ÑабоÑаÑÑие в даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð·Ð°Ð´Ð°Ñи паÑаллелÑного ÑекÑиониÑованиÑ.
-- вÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво
CREATE OR REPLACE FUNCTION show_concurrent_part_tasks()
RETURNS TABLE (
userid REGROLE,
pid INT,
dbid OID,
relid REGCLASS,
processed INT,
status TEXT)
AS 'pg_pathman', 'show_concurrent_part_tasks_internal'
LANGUAGE C STRICT;
CREATE OR REPLACE VIEW pathman_concurrent_part_tasks
AS SELECT * FROM show_concurrent_part_tasks();F.38.5.2.4. pathman_partition_list
Ð ÑÑом пÑедÑÑавлении показÑваÑÑÑÑ Ð²Ñе ÑÑÑеÑÑвÑÑÑие ÑазделÑ, а Ñакже Ð¸Ñ ÑодиÑели и гÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² (NULL Ð´Ð»Ñ Ñ ÐµÑ-ÑекÑий).
-- вÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, возвÑаÑаÑÑÐ°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво
CREATE OR REPLACE FUNCTION show_partition_list()
RETURNS TABLE (
parent REGCLASS,
partition REGCLASS,
parttype INT4,
expr TEXT,
range_min TEXT,
range_max TEXT)
AS 'pg_pathman', 'show_partition_list_internal'
LANGUAGE C STRICT;
CREATE OR REPLACE VIEW pathman_partition_list
AS SELECT * FROM show_partition_list();F.38.5.3. ФÑнкÑии
F.38.5.3.1. ФÑнкÑии Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑий
create_hash_partitions(parent_relid REGCLASS,
expression TEXT,
partitions_count INTEGER,
partition_data BOOLEAN DEFAULT TRUE,
partition_names TEXT[] DEFAULT NULL,
tablespaces TEXT[] DEFAULT NULL)ÐÑполнÑÐµÑ ÑекÑиониÑование по Ñ
еÑÑ Ð´Ð»Ñ ÑаблиÑÑ relation по ÑелоÑиÑÐ»ÐµÐ½Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ expression. ÐаÑамеÑÑ partitions_count задаÑÑ ÑиÑло ÑоздаваемÑÑ
ÑекÑий; он не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн впоÑледÑÑвии. ÐÑли паÑамеÑÑ partition_data Ñавен true, вÑе даннÑе бÑдÑÑ Ð°Ð²ÑомаÑиÑеÑки пеÑеноÑиÑÑÑÑ Ð¸Ð· ÑодиÑелÑÑкой ÑаблиÑÑ Ð² ÑекÑии. ÐамеÑÑÑе, ÑÑо пеÑÐµÐ½Ð¾Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð½ÐµÐºÐ¾ÑоÑое вÑемÑ, и ÑаблиÑа бÑÐ´ÐµÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñована до завеÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии. ÐÑли вам нÑжно пеÑенеÑÑи даннÑе без блокиÑовки, воÑполÑзÑйÑеÑÑ ÑÑнкÑией partition_table_concurrently(). ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии вÑзÑваеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑии, еÑли он бÑл ÑÑÑановлен заÑанее (Ñм. set_init_callback()).
create_range_partitions(relation REGCLASS,
expression TEXT,
start_value ANYELEMENT,
p_interval ANYELEMENT,
p_count INTEGER DEFAULT NULL,
partition_data BOOLEAN DEFAULT TRUE)
create_range_partitions(relation REGCLASS,
expression TEXT,
start_value ANYELEMENT,
p_interval INTERVAL,
p_count INTEGER DEFAULT NULL,
partition_data BOOLEAN DEFAULT TRUE)
create_range_partitions(relation REGCLASS,
expression TEXT,
bounds ANYARRAY,
partition_names TEXT[] DEFAULT NULL,
tablespaces TEXT[] DEFAULT NULL,
partition_data BOOLEAN DEFAULT TRUE)ÐÑполнÑÐµÑ ÑекÑиониÑование по диапазонам ÑаблиÑÑ relation по клÑÑÑ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ expression. ÐÑгÑÐ¼ÐµÐ½Ñ start_value задаÑÑ Ð½Ð°ÑалÑное знаÑение, p_interval задаÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð°Ð²ÑомаÑиÑеÑки ÑоздаваемÑÑ
ÑекÑий или ÑекÑий, ÑоздаваемÑÑ
ÑÑнкÑиÑми append_range_partition() или prepend_range_partition(). ÐÑли в p_interval пеÑедаÑÑÑÑ NULL, авÑомаÑиÑеÑкое Ñоздание ÑекÑий оÑклÑÑаеÑÑÑ. Ð p_count задаÑÑÑÑ ÑиÑло заÑанее ÑоздаваемÑÑ
ÑекÑий (еÑли p_count не задано, pg_pathman пÑÑаеÑÑÑ Ð¾Ð¿ÑеделиÑÑ ÑиÑло ÑекÑий по знаÑÐµÐ½Ð¸Ñ expression). ÐаÑÑив bounds опÑеделÑÐµÑ Ð³ÑаниÑÑ ÑекÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑозданÑ. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив можно поÑÑÑоиÑÑ, воÑполÑзовавÑиÑÑ ÑÑнкÑией generate_range_bounds(). ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑекÑии вÑзÑваеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑии, еÑли он бÑл ÑÑÑановлен заÑанее.
F.38.5.3.2. ФÑнкÑии Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ
partition_table_concurrently(relation REGCLASS,
batch_size INTEGER DEFAULT 1000,
sleep_time FLOAT8 DEFAULT 1.0)ÐапÑÑÐºÐ°ÐµÑ ÑоновÑй ÑабоÑий пÑоÑеÑÑ Ð´Ð»Ñ Ð¿ÐµÑеноÑа даннÑÑ Ð¸Ð· ÑодиÑелÑÑкой ÑаблиÑÑ Ð² ÑекÑии. ÐÑÐ¾Ñ ÑабоÑий пÑоÑеÑÑ ÐºÐ¾Ð¿Ð¸ÑÑÐµÑ Ð´Ð°Ð½Ð½Ñе в коÑоÑÐºÐ¸Ñ ÑÑанзакÑиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑими блоками (до 10000 ÑÑÑок в ÑÑанзакÑии) и поÑÑÐ¾Ð¼Ñ Ð½Ðµ оказÑÐ²Ð°ÐµÑ Ð·Ð½Ð°ÑиÑелÑного влиÑÐ½Ð¸Ñ Ð½Ð° ÑабоÑÑ Ð¿Ð¾Ð»ÑзоваÑелей.
stop_concurrent_part_task(relation REGCLASS)
ÐÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑоновÑй ÑабоÑий пÑоÑеÑÑ, вÑполнÑÑÑий задаÑÑ Ð¿Ð°ÑаллелÑного ÑекÑиониÑованиÑ. ÐамеÑание: ÑабоÑий пÑоÑеÑÑ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ð¿Ð¾Ñле Ñого, как заканÑÐ¸Ð²Ð°ÐµÑ Ð¿ÐµÑемеÑение ÑекÑÑей поÑÑии даннÑÑ .
F.38.5.3.3. ТÑиггеÑÑ
ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑий INSERT и межÑекÑионнÑÑ
UPDATE ÑÑиггеÑÑ Ð±Ð¾Ð»ÐµÐµ не ÑÑебÑÑÑÑÑ. ÐÑи ÑÑом полÑзоваÑелÑÑкие ÑÑиггеÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ:
Ðаждое добавление ÑÑÑоки пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑнÑÑ ÑÑнкÑий BEFORE/AFTER INSERT Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑей ÑекÑии.
Ðаждое изменение ÑÑÑоки пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑнÑÑ ÑÑнкÑий BEFORE/AFTER UPDATE Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑей ÑекÑии.
Ðаждое пеÑемеÑение ÑÑÑоки (межÑекÑионное изменение) пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑиггеÑнÑÑ ÑÑнкÑий BEFORE UPDATE + BEFORE/AFTER DELETE + BEFORE/AFTER INSERT Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ ÑекÑий.
F.38.5.3.4. ФÑнкÑии Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑекÑиÑми
replace_hash_partition(old_partition REGCLASS,
new_partition REGCLASS,
lock_parent BOOLEAN DEFAULT TRUE)ÐаменÑÐµÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÑекÑÐ¸Ñ ÑаблиÑÑ, ÑекÑиониÑованной по Ñ
еÑÑ, дÑÑгой ÑаблиÑей. ÐÑли lock_parent Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение true, опеÑаÑии INSERT/UPDATE/ALTER TABLE в ÑодиÑелÑÑкой ÑаблиÑе не допÑÑкаÑÑÑÑ.
split_range_partition(partition_relid REGCLASS,
split_value ANYELEMENT,
partition_name TEXT DEFAULT NULL,
tablespace TEXT DEFAULT NULL)Ð Ð°Ð·Ð±Ð¸Ð²Ð°ÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑÐ¸Ñ partition на две по знаÑÐµÐ½Ð¸Ñ value. ÐÐ»Ñ Ñоздаваемой ÑекÑии вÑзÑваеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑии, еÑли он задан.
merge_range_partitions(variadic partitions REGCLASS[])
ÐбÑединÑÐµÑ Ð½ÐµÑколÑко ÑоÑÐµÐ´Ð½Ð¸Ñ ÑекÑий пÑи ÑекÑиониÑовании по диапазонам. СекÑии авÑомаÑиÑеÑки ÑпоÑÑдоÑиваÑÑÑÑ Ð¿Ð¾ ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð². ÐÑе даннÑе бÑдÑÑ ÑобÑÐ°Ð½Ñ Ð² пеÑвой ÑекÑии, а оÑÑалÑнÑе ÑекÑии бÑдÑÑ ÑдаленÑ. ÐÑли оÑÑаÑÑаÑÑÑ ÑекÑÐ¸Ñ ÑодеÑÐ¶Ð¸Ñ Ð´Ð¾ÑеÑние ÑекÑии, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ Ð¿Ñи обÑединении даннÑÑ Ð¼Ð¾Ð³ÑÑ ÑоздаваÑÑÑÑ Ð½Ð¾Ð²Ñе доÑеÑние ÑекÑии ÑоглаÑно ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑекÑиониÑованиÑ.
append_range_partition(parent_relid REGCLASS,
partition_name TEXT DEFAULT NULL,
tablespace TEXT DEFAULT NULL)ÐобавлÑÐµÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑÐ¸Ñ Ñ Ð¸Ð½ÑеÑвалом pathman_config.range_interval в ÐºÐ¾Ð½ÐµÑ ÑпиÑка ÑекÑий.
prepend_range_partition(parent_relid REGCLASS,
partition_name TEXT DEFAULT NULL,
tablespace TEXT DEFAULT NULL)ÐобавлÑÐµÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑÐ¸Ñ Ñ Ð¸Ð½ÑеÑвалом pathman_config.range_interval в наÑало ÑпиÑка ÑекÑий.
add_range_partition(parent_relid REGCLASS,
start_value ANYELEMENT,
end_value ANYELEMENT,
partition_name TEXT DEFAULT NULL,
tablespace TEXT DEFAULT NULL)ÐобавлÑÐµÑ Ð½Ð¾Ð²ÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑÐ¸Ñ Ð´Ð»Ñ ÑаблиÑÑ relation Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми гÑаниÑами диапазона. ÐÑли в каÑеÑÑве start_value или end_value пеÑедаÑÑÑÑ NULL, ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð³ÑаниÑа диапазона бÑÐ´ÐµÑ Ð±ÐµÑконеÑной.
drop_range_partition(partition_relid TEXT, delete_data BOOLEAN DEFAULT TRUE)
УдалÑÐµÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½ÑÑ ÑекÑиÑ, а Ñакже вÑе ÑодеÑжаÑиеÑÑ Ð² ней даннÑе, еÑли ÑÑÑановлен Ñлаг delete_data.
attach_range_partition(parent_relid REGCLASS,
partition_relid REGCLASS,
start_value ANYELEMENT,
end_value ANYELEMENT)ÐÑиÑоединÑÐµÑ ÑекÑÐ¸Ñ Ðº ÑÑÑеÑÑвÑÑÑÐµÐ¼Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ Ñ ÑекÑиониÑованием по диапазонам. СÑÑÑкÑÑÑа пÑиÑоединÑемой ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° в ÑоÑноÑÑи повÑоÑÑÑÑ ÑÑÑÑкÑÑÑÑ ÑодиÑелÑÑкой, вклÑÑÐ°Ñ ÑдалÑннÑе ÑÑолбÑÑ. ÐÑли ÑÑÑановлен, вÑзÑваеÑÑÑ Ð¾Ð±ÑабоÑÑик ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑии (Ñм. ÐодÑаздел F.38.5.2.2).
detach_range_partition(partition_relid REGCLASS)
ÐÑÑоединÑÐµÑ ÑекÑÐ¸Ñ Ð¾Ñ ÑÑÑеÑÑвÑÑÑего оÑноÑÐµÐ½Ð¸Ñ Ñ ÑекÑиониÑованием по диапазонам.
disable_pathman_for(parent_relid REGCLASS)
ÐолноÑÑÑÑ Ð¾ÑклÑÑÐ°ÐµÑ Ð¼ÐµÑ
анизм ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ pg_pathman Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑодиÑелÑÑкой ÑаблиÑÑ Ð¸ ÑдалÑÐµÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð° добавление, еÑли он ÑÑÑеÑÑвÑеÑ. ÐÑи ÑÑом вÑе ÑекÑии и даннÑе оÑÑаÑÑÑÑ Ð±ÐµÐ· изменений.
drop_partitions(parent_relid REGCLASS,
delete_data BOOLEAN DEFAULT FALSE)УдалÑÐµÑ ÑекÑии ÑодиÑелÑÑкой ÑаблиÑÑ (как ÑÑоÑонние, Ñак и локалÑнÑе). ÐÑли паÑамеÑÑ delete_data Ñавен false (ÑÑо знаÑение по ÑмолÑаниÑ), даннÑе ÑнаÑала копиÑÑÑÑÑÑ Ð² ÑодиÑелÑÑкÑÑ ÑаблиÑÑ.
F.38.5.3.5. ÐополниÑелÑнÑе ÑÑнкÑии
pathman_version()
ÐозвÑаÑÐ°ÐµÑ Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии pg_pathman.
set_interval(relation REGCLASS, value ANYELEMENT)
ÐзменÑÐµÑ Ð¸Ð½ÑеÑвал Ð´Ð»Ñ ÑаблиÑÑ, ÑекÑиониÑованной по диапазонам. ÐамеÑÑÑе, ÑÑо ÑÑÐ¾Ñ Ð¸Ð½ÑеÑвал должен бÑÑÑ Ð½ÐµÐ¾ÑÑиÑаÑелÑнÑми и он не должен бÑÑÑ Ð¿ÑÑÑÑм, Ñо еÑÑÑ ÐµÐ³Ð¾ знаÑение должно бÑÑÑ Ð±Ð¾Ð»ÑÑе нÑÐ»Ñ Ð´Ð»Ñ ÑиÑловÑÑ
Ñипов, не менÑÑе 1 микÑоÑекÑÐ½Ð´Ñ Ð´Ð»Ñ Ñипа timestamp и не менÑÑе 1 Ð´Ð½Ñ Ð´Ð»Ñ Ñипа date.
set_enable_parent(relation REGCLASS, value BOOLEAN)
ÐклÑÑаеÑ/иÑклÑÑÐ°ÐµÑ ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð² план запÑоÑа. РоÑигиналÑном планиÑовÑике Postgres Pro ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа вÑегда вклÑÑаеÑÑÑ Ð² план запÑоÑа, даже еÑли она пÑÑÑа, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»ÐµÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе издеÑжки. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑклÑÑиÑÑ ÑодиÑелÑÑкÑÑ ÑаблиÑÑ Ð¸Ð· ÑаÑÑмоÑÑениÑ, еÑли не ÑобиÑаеÑеÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° Ñ
ÑаниÑÑ Ð² ней какие-либо даннÑе. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ð¿Ð°ÑамеÑÑа partition_data, заданного пÑи изнаÑалÑном Ñоздании ÑекÑий ÑÑнкÑией create_range_partitions(). ÐÑли паÑамеÑÑ partition_data имел знаÑение true, знаÑÐ¸Ñ Ð²Ñе даннÑе Ñже бÑли пеÑенеÑÐµÐ½Ñ Ð² ÑекÑии, и ÑодиÑелÑÑÐºÐ°Ñ ÑаблиÑа оÑклÑÑаеÑÑÑ. РпÑоÑивном ÑлÑÑае она вклÑÑена.
set_auto(relation REGCLASS, value BOOLEAN)
ÐклÑÑаеÑ/оÑклÑÑÐ°ÐµÑ Ð°Ð²ÑомаÑиÑеÑкое Ñоздание ÑекÑий (ÑолÑко Ð´Ð»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам). Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑÑÐ¾Ñ Ñежим вклÑÑÑн.
set_init_callback(relation REGCLASS, callback REGPROCEDURE DEFAULT 0)
УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¾Ð±ÑабоÑÑик ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑекÑии, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ пÑиÑоединÑемой или Ñоздаваемой ÑекÑии (по диапазонам или по Ñ
еÑÑ). ÐÑли обÑабоÑÑик Ð¸Ð¼ÐµÐµÑ Ñ
аÑакÑеÑиÑÑÐ¸ÐºÑ SECURITY INVOKER, он вÑполнÑеÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ полÑзоваÑелÑ, коÑоÑÑй вÑполнÑл опеÑаÑоÑ, ÑÑебÑÑÑий ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ ÑекÑии. ÐапÑимеÑ:
INSERT INTO partitioned_table VALUES (-5)
ÐбÑабоÑÑик должен имеÑÑ ÑледÑÑÑÑÑ ÑигнаÑÑÑÑ: part_init_callback(args JSONB) RETURNS VOID. РпаÑамеÑÑе arg пеÑедаÑÑÑÑ Ð½ÐµÑколÑко полей, завиÑÑÑиÑ
Ð¾Ñ Ñипа ÑекÑиониÑованиÑ:
/* ТаблиÑа abc Ñ ÑекÑиониÑованием по диапазонам (поÑомок abc_4) */
{
"parent": "abc",
"parttype": "2",
"partition": "abc_4",
"range_max": "401",
"range_min": "301"
}
/* ТаблиÑа abc Ñ ÑекÑиониÑованием по Ñ
еÑÑ (поÑомок abc_0) */
{
"parent": "abc",
"parttype": "1",
"partition": "abc_0"
}
set_spawn_using_bgw(relation REGCLASS, value BOOLEAN)
ÐклÑÑÐ°ÐµÑ Ð¸ÑполÑзование SpawnPartitionsWorker Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ ÑекÑий в оÑделÑной ÑÑанзакÑии в ÑлÑÑае Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð·Ð° пÑеделами диапазона ÑекÑиониÑованиÑ.
create_naming_sequence(parent_relid REGCLASS)
ÐклÑÑÐ°ÐµÑ Ð°Ð²ÑомаÑиÑеÑкое именование ÑекÑий Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ relation. ÐÑÑ ÑÑнкÑÐ¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимо иÑполÑзоваÑÑ Ð¿Ñи ÑекÑиониÑовании ÑаблиÑÑ Ð¿Ð¾ ÑоÑÑÐ°Ð²Ð½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ.
add_to_pathman_config(parent_relid REGCLASS,
expression TEXT,
range_interval TEXT)
add_to_pathman_config(parent_relid REGCLASS,
expression TEXT)
РегиÑÑÑиÑÑÐµÑ ÑказаннÑÑ ÑаблиÑÑ relation в pg_pathman Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ (expression). ÐÐ»Ñ ÑекÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ диапазонам аÑгÑÐ¼ÐµÐ½Ñ range_interval ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пеÑедаÑÑ Ð² нÑм NULL, еÑли планиÑÑеÑе добавлÑÑÑ ÑекÑии вÑÑÑнÑÑ.
generate_range_bounds(p_start ANYELEMENT,
p_interval INTERVAL,
p_count INTEGER)
generate_range_bounds(p_start ANYELEMENT,
p_interval ANYELEMENT,
p_count INTEGER)СÑÑÐ¾Ð¸Ñ Ð¼Ð°ÑÑив bounds Ñ Ð³ÑаниÑами ÑекÑий, коÑоÑÑе Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑозданÑ. ÐÑÐ¾Ñ Ð¼Ð°ÑÑив можно пеÑедаÑÑ Ð² каÑеÑÑве аÑгÑменÑа ÑÑнкÑии create_range_partitions().
F.38.6. ÐвÑоÑÑ
ÐлÑÐ´Ð°Ñ ÐÑÑин
ÐлекÑÐ°Ð½Ð´Ñ ÐоÑоÑков
ÐмиÑÑий Ðванов