| ÐокÑменÑаÑÐ¸Ñ Ð¿Ð¾ PostgreSQL 9.4.1 | |||
|---|---|---|---|
| ÐÑед. | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | ÐÑиложение E. ÐополниÑелÑно поÑÑавлÑемÑе модÑли | След. |
E.32. postgres_fdw
ÐодÑÐ»Ñ postgres_fdw пÑедоÑÑавлÑÐµÑ Ð¾Ð±ÑÑÑÐºÑ ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ postgres_fdw, иÑполÑзÑÑ ÐºÐ¾ÑоÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ обÑаÑаÑÑÑÑ Ðº даннÑм, Ð½Ð°Ñ Ð¾Ð´ÑÑимÑÑ Ð½Ð° внеÑÐ½Ð¸Ñ ÑеÑвеÑÐ°Ñ PostgreSQL.
ФÑнкÑионалÑноÑÑÑ ÑÑого модÑÐ»Ñ Ð²Ð¾ многом пеÑеÑекаеÑÑÑ Ñ ÑÑнкÑионалÑноÑÑÑÑ ÑÑаÑого модÑÐ»Ñ dblink. Ðднако postgres_fdw пÑедоÑÑавлÑÐµÑ Ð±Ð¾Ð»ÐµÐµ пÑозÑаÑнÑй и ÑÑандаÑÑизиÑованнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑдалÑннÑм ÑаблиÑам и во Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑлÑÑаÑÑ Ð´Ð°ÑÑ Ð»ÑÑÑÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑÑÑÑ Ðº обÑаÑÐµÐ½Ð¸Ñ Ðº ÑдалÑннÑм даннÑм ÑеÑез postgres_fdw:
УÑÑановиÑе ÑаÑÑиÑение postgres_fdw Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE EXTENSION.
СоздайÑе обÑÐµÐºÑ ÑÑоÑоннего ÑеÑвеÑа, иÑполÑзÑÑ CREATE SERVER, коÑоÑÑй бÑÐ´ÐµÑ Ð¿ÑедÑÑавлÑÑÑ ÑдалÑннÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , к коÑоÑой Ð²Ñ Ñ Ð¾ÑиÑе подклÑÑаÑÑÑÑ. УкажиÑе ÑвойÑÑва подклÑÑениÑ, кÑоме user и password, в паÑамеÑÑÐ°Ñ Ð¾Ð±ÑекÑа ÑеÑвеÑа.
СоздайÑе ÑопоÑÑавление полÑзоваÑелей, иÑполÑзÑÑ CREATE USER MAPPING, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ полÑзоваÑÐµÐ»Ñ Ð±Ð°Ð·Ñ, коÑоÑÐ¾Ð¼Ñ Ð½Ñжен доÑÑÑп к ÑдалÑÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ. УкажиÑе Ð¸Ð¼Ñ Ð¸ паÑÐ¾Ð»Ñ ÑдалÑнного полÑзоваÑÐµÐ»Ñ Ð² паÑамеÑÑÐ°Ñ user и password ÑопоÑÑавлениÑ.
СоздайÑе ÑÑоÑоннÑÑ ÑаблиÑÑ, иÑполÑзÑÑ CREATE FOREIGN TABLE, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑдалÑнной ÑаблиÑÑ, к коÑоÑой Ð²Ñ Ñ Ð¾ÑиÑе обÑаÑаÑÑÑÑ. Ðолонки ÑÑоÑонней ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ°Ð¼ Ñелевой ÑдалÑнной ÑаблиÑÑ. Ðднако Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð»Ð¾ÐºÐ°Ð»Ñно имена ÑÐ°Ð±Ð»Ð¸Ñ Ð¸/или колонок, оÑлиÑнÑе Ð¾Ñ ÑдалÑннÑÑ , еÑли ÑкажеÑе коÑÑекÑнÑе ÑдалÑннÑе имена в паÑамеÑÑÐ°Ñ Ð¾Ð±ÑекÑа ÑÑоÑонней ÑаблиÑÑ.
ÐоÑле ÑÑого Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº даннÑм, Ñ ÑанÑÑимÑÑ Ð² нижележаÑей ÑдалÑнной ÑаблиÑе, вам нÑжно ÑолÑко вÑполнÑÑÑ SELECT. ÐÑ Ñакже можеÑе изменÑÑÑ Ð´Ð°Ð½Ð½Ñе в ÑдалÑнной ÑаблиÑе, вÑполнÑÑ INSERT, UPDATE или DELETE. (РазÑмееÑÑÑ, ÑдалÑннÑй полÑзоваÑелÑ, ÑказаннÑй в ÑопоÑÑавлении, должен имеÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе пÑава Ð´Ð»Ñ ÑÑого.)
ÐбÑÑно ÑекомендÑеÑÑÑ Ð¾Ð±ÑÑвлÑÑÑ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ ÑÑоÑонней ÑаблиÑÑ ÑоÑно Ñ Ñеми же Ñипами даннÑÑ Ð¸ пÑавилами ÑоÑÑиÑовки, еÑли они пÑименимÑ, как Ñ ÑелевÑÑ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº ÑдалÑнной ÑаблиÑÑ. ХоÑÑ postgres_fdw в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð´Ð¾Ð²Ð¾Ð»Ñно лоÑлен к пÑеобÑазованиÑм Ñипов даннÑÑ Ð¿Ñи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи, но когда ÑÐ¸Ð¿Ñ Ð¸Ð»Ð¸ пÑавила ÑоÑÑиÑовки не ÑовпадаÑÑ, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñе ÑеманÑиÑеÑкие аномалии, вÑледÑÑвие Ñого, ÑÑо ÑдалÑннÑй ÑеÑÐ²ÐµÑ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE не ÑовÑем Ñак, как локалÑнÑй ÑеÑвеÑ.
ÐамеÑÑÑе, ÑÑо ÑÑоÑоннÑÑ ÑаблиÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑÑвлена Ñ Ð¼ÐµÐ½ÑÑим колиÑеÑÑвом или Ñ Ð´ÑÑгим поÑÑдком колонок, Ñем в нижележаÑей ÑдалÑнной ÑаблиÑе. СопоÑÑавление колонок ÑдалÑнной ÑаблиÑÑ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ð¾ имени, а не по позиÑии.
E.32.1. ÐаÑамеÑÑÑ Ð¾Ð±ÑÑÑки Ð´Ð»Ñ postgres_fdw
E.32.1.1. ÐаÑамеÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ
ÐÐ»Ñ ÑÑоÑоннего ÑеÑвеÑа, наÑÑÑаиваемого Ñ Ð¸ÑполÑзованием обÑÑÑки ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ postgres_fdw, можно задаÑÑ Ñе же паÑамеÑÑÑ, ÑÑо пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ libpq в ÑÑÑÐ¾ÐºÐ°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑениÑ, как опиÑано в ÐодÑазделе 31.1.2, за иÑклÑÑением ÑледÑÑÑÐ¸Ñ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑÑ Ð¿Ð°ÑамеÑÑов:
user и password (Ð¸Ñ ÑледÑÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ Ð² ÑопоÑÑавлениÑÑ Ð¿Ð¾Ð»ÑзоваÑелей)
client_encoding (авÑомаÑиÑеÑки пÑинимаеÑÑÑ Ñавной локалÑной кодиÑовке ÑеÑвеÑа)
fallback_application_name (вÑегда postgres_fdw)
ÐодклÑÑаÑÑÑÑ Ðº ÑÑоÑонним ÑеÑвеÑам без аÑÑенÑиÑикаÑии по паÑÐ¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели, поÑÑÐ¾Ð¼Ñ Ð² ÑопоÑÑавлениÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ Ð¿Ð¾Ð»ÑзоваÑелей вÑегда нÑжно задаваÑÑ Ð¿Ð°ÑÐ¾Ð»Ñ (password).
E.32.1.2. ÐаÑамеÑÑÑ Ð¸Ð¼ÐµÐ½Ð¸ обÑекÑа
ÐÑи паÑамеÑÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑпÑавлÑÑÑ Ñем, как на ÑдалÑннÑй ÑеÑÐ²ÐµÑ PostgreSQL бÑдÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð°, ÑигÑÑиÑÑÑÑие в опеÑаÑоÑÐ°Ñ SQL. ÐаннÑе паÑамеÑÑÑ Ð½ÑжнÑ, когда ÑÑоÑоннÑÑ ÑаблиÑа ÑоздаÑÑÑÑ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, оÑлиÑнÑми Ð¾Ñ Ð¸Ð¼Ñн ÑдалÑнной ÑаблиÑÑ.
- schema_name
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ, ÑказÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑой ÑаблиÑе на ÑдалÑнном ÑеÑвеÑе. ÐÑли даннÑй паÑамеÑÑ Ð¾Ð¿ÑÑкаеÑÑÑ, пÑименÑеÑÑÑ ÑÑ ÐµÐ¼Ð° ÑÑоÑонней ÑаблиÑÑ.
- table_name
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ, ÑказÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ ÑаблиÑÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑой ÑаблиÑе на ÑдалÑнном ÑеÑвеÑе. ÐÑли даннÑй паÑамеÑÑ Ð¾Ð¿ÑÑкаеÑÑÑ, пÑименÑеÑÑÑ Ð¸Ð¼Ñ ÑÑоÑонней ÑаблиÑÑ.
- column_name
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ ÑÑоÑонней ÑаблиÑÑ, ÑказÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸ Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑой колонке на ÑдалÑнном ÑеÑвеÑе. ÐÑли даннÑй паÑамеÑÑ Ð¾Ð¿ÑÑкаеÑÑÑ, пÑименÑеÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ðµ Ð¸Ð¼Ñ ÐºÐ¾Ð»Ð¾Ð½ÐºÐ¸.
E.32.1.3. ÐаÑамеÑÑÑ Ð¾Ñенки ÑÑоимоÑÑи
ÐодÑÐ»Ñ postgres_fdw полÑÑÐ°ÐµÑ ÑдалÑннÑе даннÑе, вÑполнÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð½Ð° ÑдалÑннÑÑ ÑеÑвеÑÐ°Ñ , поÑÑÐ¾Ð¼Ñ Ð² идеале Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð°Ñ ÑÑоимоÑÑÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑоÑонней ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ð° ÑавнÑÑÑÑÑ ÑÑоимоÑÑи вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð° ÑдалÑнном ÑеÑвеÑе плÑÑ Ð¸Ð·Ð´ÐµÑжки ÑеÑевого взаимодейÑÑвиÑ. СамÑй надÑжнÑй ÑпоÑоб полÑÑиÑÑ Ñакие оÑенки â ÑзнаÑÑ ÑÑоимоÑÑÑ Ñ ÑдалÑнного ÑеÑвеÑа и добавиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð½Ð°Ð´Ð±Ð°Ð²ÐºÑ — но Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ Ð·Ð°Ð¿ÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ²Ñгодно пеÑедаваÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑй запÑоÑ, ÑолÑко ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾ÑÐµÐ½ÐºÑ ÑÑоимоÑÑи. ÐоÑÑÐ¾Ð¼Ñ postgres_fdw пÑедоÑÑавлÑÐµÑ ÑледÑÑÑие паÑамеÑÑÑ, позволÑÑÑие ÑпÑавлÑÑÑ Ð²ÑÑиÑлением оÑенки ÑÑоимоÑÑи:
- use_remote_estimate
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ Ð¸Ð»Ð¸ Ð´Ð»Ñ ÑÑоÑоннего ÑеÑвеÑа, опÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ postgres_fdw вÑполнÑÑÑ ÑдалÑнно ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾Ñенок ÑÑоимоÑÑи. ÐаÑамеÑÑ, заданнÑй Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ, пеÑеопÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑ ÑеÑвеÑа, но ÑолÑко Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑаблиÑÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â false (вÑкл.).
- fdw_startup_cost
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÑÑоÑоннего ÑеÑвеÑа, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑиÑловое знаÑение, добавлÑемое к оÑенке ÑÑоимоÑÑи запÑÑка Ð´Ð»Ñ Ð»Ñбого ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑоÑонней ÑаблиÑÑ Ð½Ð° ÑÑом ÑеÑвеÑе. Ðн вÑÑÐ°Ð¶Ð°ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе издеÑжки на ÑÑÑановление подклÑÑениÑ, ÑÐ°Ð·Ð±Ð¾Ñ Ð¸ планиÑование запÑоÑа на ÑдалÑнной ÑÑоÑоне и Ñ. д. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â 100.
- fdw_tuple_cost
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ Ð´Ð»Ñ ÑÑоÑоннего ÑеÑвеÑа, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑиÑловое знаÑение, вÑÑажаÑÑее дополниÑелÑнÑÑ ÑÐµÐ½Ñ ÑÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ коÑÑежа из ÑÑоÑонней ÑаблиÑÑ Ð½Ð° ÑÑом ÑеÑвеÑе. ÐÑо ÑиÑло можно ÑвелиÑиÑÑ Ð¸Ð»Ð¸ ÑменÑÑиÑÑ, оÑÑÐ°Ð¶Ð°Ñ Ð¼ÐµÐ½ÑÑÑÑ Ð¸Ð»Ð¸ болÑÑÑÑ ÑакÑиÑеÑкÑÑ ÑкоÑоÑÑÑ ÑеÑевого взаимодейÑÑÐ²Ð¸Ñ Ñ ÑдалÑннÑм ÑеÑвеÑом. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â 0.01.
Ðогда поведение use_remote_estimate вклÑÑено, postgres_fdw полÑÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑÑÑок и оÑÐµÐ½ÐºÑ ÑÑоимоÑÑи Ñ ÑдалÑнного ÑеÑвеÑа, а заÑем добавлÑÐµÑ Ðº оÑенке ÑÑоимоÑÑи fdw_startup_cost и fdw_tuple_cost. Ðогда поведение use_remote_estimate оÑклÑÑено, postgres_fdw ÑаÑÑÑиÑÑÐ²Ð°ÐµÑ ÑиÑло ÑÑÑок и оÑÐµÐ½ÐºÑ ÑÑоимоÑÑи локалÑно, а заÑем Ñак же добавлÑÐµÑ Ðº ÑÑой оÑенке fdw_startup_cost и fdw_tuple_cost. ÐокалÑÐ½Ð°Ñ Ð¾Ñенка Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑоÑной ÑолÑко пÑи ÑÑловии налиÑÐ¸Ñ Ð»Ð¾ÐºÐ°Ð»Ñной копии ÑÑаÑиÑÑики ÑдалÑннÑÑ ÑаблиÑ. ÐбновиÑÑ ÑÑÑ ÑÑаÑиÑÑÐ¸ÐºÑ Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ANALYZE; пÑи ÑÑом ÑдалÑÐ½Ð½Ð°Ñ ÑаблиÑа бÑÐ´ÐµÑ Ð¿ÑоÑканиÑована, и по ÐµÑ ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ð±ÑдÑÑ Ð²ÑÑиÑлена и ÑÐ¾Ñ Ñанена ÑÑаÑиÑÑика как Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñной ÑаблиÑÑ. ÐокалÑное Ñ Ñанение ÑÑаÑиÑÑики Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ ÑокÑаÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð´ÐµÑжек планиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÑдалÑнной ÑаблиÑÑ — но еÑли ÑдалÑÐ½Ð½Ð°Ñ ÑаблиÑа менÑеÑÑÑ ÑаÑÑо, локалÑÐ½Ð°Ñ ÑÑаÑиÑÑика бÑÐ´ÐµÑ Ð±ÑÑÑÑо ÑÑÑаÑеваÑÑ.
E.32.1.4. ÐаÑамеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð²Ñе ÑÑоÑонние ÑаблиÑÑ, доÑÑÑпнÑе ÑеÑез postgres_fdw, ÑÑиÑаÑÑÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑими изменениÑ. ÐÑо можно пеÑеопÑеделиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего паÑамеÑÑа:
- updatable
ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ postgres_fdw допÑÑкаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑÐ°Ñ Ð¿Ð¾ÑÑедÑÑвом команд INSERT, UPDATE и DELETE. Ðго можно задаÑÑ Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ Ð¸Ð»Ð¸ Ð´Ð»Ñ ÑÑоÑоннего ÑеÑвеÑа. ÐаÑамеÑÑ, опÑеделÑннÑй на ÑÑовне ÑаблиÑÑ, пеÑеопÑеделÑÐµÑ Ð¿Ð°ÑамеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑеÑвеÑа. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â true (Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазÑеÑенÑ).
ÐонеÑно, еÑли ÑдалÑÐ½Ð½Ð°Ñ ÑаблиÑа на Ñамом деле не допÑÑÐºÐ°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, вÑÑ Ñавно пÑоизойдÑÑ Ð¾Ñибка. ÐÑполÑзование ÑÑого паÑамеÑÑа пÑежде вÑего позволÑÐµÑ Ð²ÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð»Ð¾ÐºÐ°Ð»Ñно, не обÑаÑаÑÑÑ Ðº ÑдалÑÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ. ÐамеÑÑÑе, однако, ÑÑо пÑедÑÑавление information_schema бÑÐ´ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑваÑÑ, ÑÑо опÑеделÑÐ½Ð½Ð°Ñ ÑÑоÑоннÑÑ ÑаблиÑа postgres_fdw ÑвлÑеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñемой (или неÑ), ÑоглаÑно знаÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ паÑамеÑÑа, не пÑовеÑÑÑ ÑÑо на ÑдалÑнном ÑеÑвеÑе.
E.32.2. УпÑавление Ñоединением
ÐодÑÐ»Ñ postgres_fdw ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ñоединение Ñо ÑÑоÑонним ÑеÑвеÑом пÑи пеÑвом запÑоÑе, в коÑоÑом ÑÑаÑÑвÑÐµÑ ÑÑоÑоннÑÑ ÑаблиÑа, ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñо ÑÑоÑонним ÑеÑвеÑом. ÐÑо Ñоединение ÑÐ¾Ñ ÑанÑеÑÑÑ Ð¸ повÑоÑно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑÐ¸Ñ Ð·Ð°Ð¿ÑоÑов в Ñом же ÑеанÑе. Ðднако, еÑли Ð´Ð»Ñ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ðº ÑÑоÑÐ¾Ð½Ð½ÐµÐ¼Ñ ÑеÑвеÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвÑÑÑÑÑ ÑазнÑе полÑзоваÑели (ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей), оÑделÑное Ñоединение ÑÑÑанавливаеÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелей.
E.32.3. УпÑавление ÑÑанзакÑиÑми
РпÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа, в коÑоÑом ÑÑаÑÑвÑÑÑ ÐºÐ°ÐºÐ¸Ðµ-либо ÑдалÑннÑе ÑаблиÑÑ Ð½Ð° ÑÑоÑоннем ÑеÑвеÑе, postgres_fdw оÑкÑÑÐ²Ð°ÐµÑ ÑÑанзакÑÐ¸Ñ Ð½Ð° ÑдалÑнном ÑеÑвеÑе, еÑли ÑÐ°ÐºÐ°Ñ ÑÑанзакÑÐ¸Ñ ÐµÑÑ Ð½Ðµ бÑла оÑкÑÑÑа Ð´Ð»Ñ ÑекÑÑей локалÑной ÑÑанзакÑии. ÐÑа ÑдалÑÐ½Ð½Ð°Ñ ÑÑанзакÑÐ¸Ñ ÑикÑиÑÑеÑÑÑ Ð¸Ð»Ð¸ пÑеÑÑваеÑÑÑ, когда ÑикÑиÑÑеÑÑÑ Ð¸Ð»Ð¸ пÑеÑÑваеÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ð°Ñ ÑÑанзакÑиÑ. ÐодобнÑм обÑазом ÑеализÑеÑÑÑ Ð¸ ÑпÑавление ÑоÑками ÑÐ¾Ñ ÑанениÑ.
ÐÐ»Ñ ÑдалÑнной ÑÑанзакÑии вÑбиÑаеÑÑÑ Ñежим изолÑÑии SERIALIZABLE, когда локалÑÐ½Ð°Ñ ÑÑанзакÑÐ¸Ñ Ð¾ÑкÑÑÑа в Ñежиме SERIALIZABLE; в пÑоÑивном ÑлÑÑае пÑименÑеÑÑÑ Ñежим REPEATABLE READ. ÐÑÐ¾Ñ Ð²ÑÐ±Ð¾Ñ Ð³Ð°ÑанÑиÑÑеÑ, ÑÑо еÑли запÑÐ¾Ñ ÑканиÑÑÐµÑ Ð½ÐµÑколÑко ÑÐ°Ð±Ð»Ð¸Ñ Ð½Ð° ÑдалÑнном ÑеÑвеÑе, он бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑоглаÑованнÑе даннÑе одного Ñнимка Ð´Ð»Ñ Ð²ÑÐµÑ ÑканиÑований. Ðак ÑледÑÑвие, поÑледоваÑелÑнÑе запÑоÑÑ Ð² одной ÑÑанзакÑии бÑдÑÑ Ð²Ð¸Ð´ÐµÑÑ Ð¾Ð´Ð½Ð¸ даннÑе ÑдалÑнного ÑеÑвеÑа, даже еÑли на нÑм паÑаллелÑно пÑоиÑÑ Ð¾Ð´ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, вÑзваннÑе дÑÑгими дейÑÑвиÑми. ÐÑо поведение ожидаемо Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñной ÑÑанзакÑии в ÑÐµÐ¶Ð¸Ð¼Ð°Ñ SERIALIZABLE и REPEATABLE READ, но Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñной ÑÑанзакÑии в Ñежиме READ COMMITTED оно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ñм. РбÑдÑÑÐ¸Ñ Ð²ÑпÑÑÐºÐ°Ñ PostgreSQL ÑÑи пÑавила могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ.
E.32.4. ÐпÑимизаÑÐ¸Ñ ÑдалÑннÑÑ Ð·Ð°Ð¿ÑоÑов
ÐодÑÐ»Ñ postgres_fdw пÑÑаеÑÑÑ Ð¾Ð¿ÑимизиÑоваÑÑ ÑдалÑннÑе запÑоÑÑ Ñ ÑелÑÑ ÑокÑаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑма даннÑÑ , полÑÑаемÑÑ Ð¾Ñ ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑеÑвеÑов. ÐÐ»Ñ ÑÑого ÑдалÑÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ Ð½Ð° вÑполнение пеÑедаÑÑÑÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, а колонки, не ÑÑебÑÑÑиеÑÑ Ð² ÑекÑÑем запÑоÑе, Ñ Ð½ÐµÐ³Ð¾ не запÑаÑиваÑÑÑÑ. ЧÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ ÑиÑк некоÑÑекÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов, пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE пеÑедаÑÑÑÑ Ð½Ð° ÑдалÑннÑй ÑеÑвеÑ, ÑолÑко еÑли в Ð½Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ Ð²ÑÑÑоеннÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , опеÑаÑоÑÑ Ð¸ ÑÑнкÑии. ÐÑоме Ñого, опеÑаÑоÑÑ Ð¸ ÑÑнкÑии в ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð¿ÑоÑÐ°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾ÑÑоÑннÑми (IMMUTABLE).
ÐапÑоÑ, ÑакÑиÑеÑки оÑпÑавлÑемÑй ÑдалÑÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ Ð´Ð»Ñ Ð²ÑполнениÑ, можно изÑÑиÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN VERBOSE.
E.32.5. СовмеÑÑимоÑÑÑ Ñ ÑазнÑми веÑÑиÑми
ÐодÑÐ»Ñ postgres_fdw Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ñ ÑдалÑннÑми ÑеÑвеÑами веÑÑий, наÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL 8.3. СпоÑобноÑÑÑ ÑолÑко ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð¾ÑÑÑпна, наÑÐ¸Ð½Ð°Ñ Ñ 8.1. Ðднако, пÑи ÑÑом еÑÑÑ Ð¾Ð³ÑаниÑение, вÑзванное Ñем, ÑÑо postgres_fdw полагаеÑ, ÑÑо поÑÑоÑннÑе вÑÑÑоеннÑе ÑÑнкÑии и опеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно пеÑедаваÑÑÑÑ Ð½Ð° ÑдалÑннÑй ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð²ÑполнениÑ, еÑли они ÑигÑÑиÑÑÑÑ Ð² пÑедложении WHERE Ð´Ð»Ñ ÑÑоÑонней ÑаблиÑÑ. Таким обÑазом, вÑÑÑÐ¾ÐµÐ½Ð½Ð°Ñ ÑÑнкÑиÑ, Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð² более новой веÑÑии, Ñем на ÑдалÑнном ÑеÑвеÑе, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑпÑавлена на вÑполнение, ÑÑо в ÑезÑлÑÑаÑе пÑиведÑÑ Ðº оÑибке "ÑÑнкÑÐ¸Ñ Ð½Ðµ ÑÑÑеÑÑвÑеÑ" или подобной. ÐÑÐºÐ°Ð·Ñ Ñакого Ñипа можно пÑедоÑвÑаÑиÑÑ, пеÑепиÑав запÑоÑ, напÑимеÑ, помеÑÑив ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÑоÑоннÑÑ ÑаблиÑÑ Ð²Ð¾ вложеннÑй SELECT Ñ OFFSET 0 в каÑеÑÑве заÑиÑÑ Ð¾Ñ Ð¾Ð¿ÑимизаÑии, и пÑименив пÑоблемаÑиÑнÑÑ ÑÑнкÑÐ¸Ñ Ð¸Ð»Ð¸ опеÑаÑÐ¾Ñ ÑнаÑÑжи ÑÑого вложенного SELECT.
E.32.6. ÐÑимеÑÑ
Ðиже пÑиведÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑоÑонней ÑаблиÑÑ Ñ Ð¿Ñименением postgres_fdw. СнаÑала ÑÑÑановиÑе ÑаÑÑиÑение:
CREATE EXTENSION postgres_fdw;
ÐаÑем ÑоздайÑе ÑÑоÑонний ÑеÑÐ²ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE SERVER. Рданном пÑимеÑе Ð¼Ñ Ñ Ð¾Ñим подклÑÑиÑÑÑÑ Ðº ÑеÑвеÑÑ PostgreSQL, ÑабоÑаÑÑÐµÐ¼Ñ Ð¿Ð¾ адÑеÑÑ 192.83.123.89, поÑÑ 5432. Ðаза даннÑÑ , к коÑоÑой ÑÑÑанавливаеÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение, на ÑдалÑнном ÑеÑвеÑе назÑваеÑÑÑ foreign_db:
CREATE SERVER foreign_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.83.123.89', port '5432', dbname 'foreign_db');ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñоли, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвована на ÑдалÑнном ÑеÑвеÑе, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE USER MAPPING задаÑÑÑÑ ÑопоÑÑавление полÑзоваÑелей:
CREATE USER MAPPING FOR local_user
SERVER foreign_server
OPTIONS (user 'foreign_user', password 'password');ТепеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаÑÑ ÑÑоÑоннÑÑ ÑаблиÑÑ, пÑименив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE FOREIGN TABLE. Ð ÑÑом пÑимеÑе Ð¼Ñ Ñ Ð¾Ñим обÑаÑиÑÑÑÑ Ðº ÑаблиÑе some_schema.some_table на ÑдалÑнном ÑеÑвеÑе. ÐокалÑнÑм именем ÑÑой ÑаблиÑÑ Ð±ÑÐ´ÐµÑ foreign_table:
CREATE FOREIGN TABLE foreign_table (
id serial NOT NULL,
data text
)
SERVER foreign_server
OPTIONS (schema_name 'some_schema', table_name 'some_table');Ðажно, ÑÑÐ¾Ð±Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ дÑÑгие ÑвойÑÑва колонок, обÑÑвленнÑÑ Ð² CREATE FOREIGN TABLE, ÑооÑвеÑÑÑвовали ÑакÑиÑеÑкой ÑдалÑнной ÑаблиÑе. Также Ð´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð¸Ð¼ÐµÐ½Ð° колонок, еÑли ÑолÑко Ð²Ñ Ð½Ðµ добавиÑе паÑамеÑÑÑ column_name Ð´Ð»Ñ Ð¾ÑделÑнÑÑ ÐºÐ¾Ð»Ð¾Ð½Ð¾Ðº, задаÑÑие Ð¸Ñ ÑеалÑнÑе имена в ÑдалÑнной ÑаблиÑе.
E.32.7. ÐвÑоÑ
ШигеÑÑ Ð¥Ð°Ð½Ð°Ð´Ð° <[email protected]>