8.19. ÐденÑиÑикаÑоÑÑ Ð¾Ð±ÑекÑов #
ÐденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа (Object Identifier, OID) иÑполÑзÑеÑÑÑ Ð²Ð½ÑÑÑи Postgres Pro в каÑеÑÑве пеÑвиÑного клÑÑа ÑазлиÑнÑÑ
ÑиÑÑемнÑÑ
ÑаблиÑ. ÐденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа пÑедÑÑавлÑеÑÑÑ Ð² Ñипе oid. Также ÑÑÑеÑÑвÑÑÑ ÑазлиÑнÑе ÑипÑ-пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ Ð´Ð»Ñ oid, Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ reg. ÐÐ±Ð·Ð¾Ñ ÑÑиÑ
Ñипов пÑиведÑн в ТаблиÑе 8.26.ÑÑÑноÑÑÑ
РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ñип oid Ñеализован как ÑеÑÑÑÑÑ
байÑное Ñелое ÑиÑло без знака. Таким обÑазом, знаÑение ÑÑого Ñипа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑно болÑÑим Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи в базе даннÑÑ
или даже в оÑделÑнÑÑ
болÑÑиÑ
ÑаблиÑаÑ
.
ÐÐ»Ñ Ñамого Ñипа oid помимо ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²Ñего неÑколÑко опеÑаÑоÑов. Ðднако его можно пÑивеÑÑи к ÑÐµÐ»Ð¾Ð¼Ñ Ð¸ заÑем задейÑÑвоваÑÑ Ð² обÑÑнÑÑ
ÑелоÑиÑленнÑÑ
вÑÑиÑлениÑÑ
. (ÐÑи ÑÑом ÑледÑÐµÑ Ð¾Ð¿Ð°ÑаÑÑÑÑ Ð¿ÑÑаниÑÑ Ñо знаковÑми/беззнаковÑми знаÑениÑми.)
ТипÑ-пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ OID Ñами по Ñебе не вводÑÑ Ð½Ð¾Ð²ÑÑ
опеÑаÑий и оÑлиÑаÑÑÑÑ ÑолÑко ÑпеÑиализиÑованнÑми ÑÑнкÑиÑми ввода-вÑвода. ÐÑи ÑÑнкÑии могÑÑ Ð¿ÑинимаÑÑ Ð¸ вÑводиÑÑ Ð½Ðµ пÑоÑÑо ÑиÑловÑе знаÑениÑ, как Ñип oid, а ÑимволиÑеÑкие имена ÑиÑÑемнÑÑ
обÑекÑов. ÐÑи ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑпÑоÑÑиÑÑ Ð¿Ð¾Ð¸Ñк обÑекÑов по знаÑениÑм OID. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²ÑбÑаÑÑ Ð¸Ð· pg_attribute ÑÑÑоки, оÑноÑÑÑиеÑÑ Ðº ÑаблиÑе mytable, можно напиÑаÑÑ:
SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;
вмеÑÑо:
SELECT * FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');
ХоÑÑ Ð²ÑоÑой ваÑÐ¸Ð°Ð½Ñ Ð²ÑглÑÐ´Ð¸Ñ Ð½Ðµ Ñаким Ñж плоÑ
им, но ÑÑо лиÑÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑой запÑоÑ. ÐÑли же поÑÑебÑеÑÑÑ Ð²ÑбÑаÑÑ Ð¿ÑавилÑнÑй OID, когда ÑаблиÑа mytable еÑÑÑ Ð² неÑколÑкиÑ
ÑÑ
емаÑ
, вложеннÑй подзапÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð³Ð¾Ñаздо Ñложнее. ÐÑеобÑазоваÑÐµÐ»Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ñипа regclass наÑ
Ð¾Ð´Ð¸Ñ ÑаблиÑÑ ÑоглаÑно Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ Ð¿ÑÑи поиÑка ÑÑ
ем, Ñак ÑÑо он Ð´ÐµÐ»Ð°ÐµÑ Â«Ð²ÑÑ Ð¿ÑавилÑно» авÑомаÑиÑеÑки. ÐналогиÑно, пÑÐ¸Ð²ÐµÐ´Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ ÑаблиÑÑ Ðº ÑÐ¸Ð¿Ñ regclass, можно полÑÑиÑÑ ÑимволиÑеÑкое пÑедÑÑавление ÑиÑлового кода.
ТаблиÑа 8.26. ÐденÑиÑикаÑоÑÑ Ð¾Ð±ÑекÑов
| ÐÐ¼Ñ | СÑÑлки | ÐпиÑание | ÐÑÐ¸Ð¼ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ |
|---|---|---|---|
oid | any | ÑиÑловой иденÑиÑикаÑÐ¾Ñ Ð¾Ð±ÑекÑа | 564182 |
regclass | pg_class | Ð¸Ð¼Ñ Ð¾ÑноÑÐµÐ½Ð¸Ñ | pg_type |
regcollation | pg_collation | Ð¸Ð¼Ñ Ð¿Ñавила ÑоÑÑиÑовки | "POSIX" |
regconfig | pg_ts_config | конÑигÑÑаÑÐ¸Ñ ÑекÑÑового поиÑка | english |
regdictionary | pg_ts_dict | ÑловаÑÑ ÑекÑÑового поиÑка | simple |
regnamespace | pg_namespace | пÑоÑÑÑанÑÑво имÑн | pg_catalog |
regoper | pg_operator | Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа | + |
regoperator | pg_operator | опеÑаÑÐ¾Ñ Ñ Ñипами аÑгÑменÑов | *(integer,âinteger) или -(NONE,âinteger) |
regproc | pg_proc | Ð¸Ð¼Ñ ÑÑнкÑии | sum |
regprocedure | pg_proc | ÑÑнкÑÐ¸Ñ Ñ Ñипами аÑгÑменÑов | sum(int4) |
regprofile | pg_profile | Ð¸Ð¼Ñ Ð¿ÑоÑÐ¸Ð»Ñ | default |
regrole | pg_authid | Ð¸Ð¼Ñ Ñоли | smithee |
regtype | pg_type | Ð¸Ð¼Ñ Ñипа даннÑÑ | integer |
ÐÑе ÑÐ¸Ð¿Ñ Ð¿Ñевдонимов OID Ð´Ð»Ñ Ð¾Ð±ÑекÑов, ÑгÑÑппиÑованнÑÑ
в пÑоÑÑÑанÑÑво имÑн, пÑинимаÑÑ Ð¸Ð¼ÐµÐ½Ð°, дополненнÑе именем ÑÑ
емÑ, и вÑводÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñо ÑÑ
емой, еÑли даннÑй обÑÐµÐºÑ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð½Ð°Ð¹Ñи в ÑекÑÑем пÑÑи поиÑка без имени ÑÑ
емÑ. ÐапÑимеÑ, myschema.mytable ÑвлÑеÑÑÑ Ð¿ÑиемлемÑм вÑ
однÑм знаÑением Ð´Ð»Ñ regclass (еÑли ÑÑÑеÑÑвÑÐµÑ ÑÐ°ÐºÐ°Ñ ÑаблиÑа). ÐÑо знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð²ÑводиÑÑÑÑ ÐºÐ°Ðº myschema.mytable или пÑоÑÑо mytable, в завиÑимоÑÑи Ð¾Ñ ÑекÑÑего пÑÑи поиÑка. Ð¢Ð¸Ð¿Ñ regproc и regoper пÑинимаÑÑ ÑолÑко ÑникалÑнÑе вводимÑе имена (не пеÑегÑÑженнÑе), ÑÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¸Ñ
пÑименимоÑÑÑ; в болÑÑинÑÑве ÑлÑÑаев лÑÑÑе иÑполÑзоваÑÑ regprocedure или regoperator. ÐÐ»Ñ Ñипа regoperator в запиÑи ÑнаÑного опеÑаÑоÑа неиÑполÑзÑемÑй опеÑанд заменÑеÑÑÑ Ñловом NONE.
ФÑнкÑии ввода Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñипов допÑÑкаÑÑ Ð¿ÑÐ¾Ð±ÐµÐ»Ñ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñами и пÑиводÑÑ Ð±ÑÐºÐ²Ñ Ð²ÐµÑÑ
него ÑегиÑÑÑа к нижнемÑ, за иÑклÑÑением ÑÑÑоки в двойнÑÑ
кавÑÑкаÑ
; ÑÑо Ñделано Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿Ñавила запиÑи бÑли поÑ
ожи на пÑинÑÑÑе Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи имÑн обÑекÑов в SQL. РнаобоÑоÑ, ÑÑнкÑии вÑвода бÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð´Ð²Ð¾Ð¹Ð½Ñе кавÑÑки, еÑли ÑÑо необÑ
одимо, ÑÑÐ¾Ð±Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ ÑÑÑока бÑла допÑÑÑимÑм иденÑиÑикаÑоÑом SQL. ÐапÑимеÑ, OID ÑÑнкÑии Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Foo (Ñ F в веÑÑ
нем ÑегиÑÑÑе), пÑинимаÑÑей два ÑелоÑиÑленнÑÑ
аÑгÑменÑа, можно ввеÑÑи как ' "Foo" ( int, integer ) '::regprocedure. РезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ ÐºÐ°Ðº "Foo"(integer,integer). Ð Ð¸Ð¼Ñ ÑÑнкÑии, и имена Ñипов аÑгÑменÑов Ñакже могÑÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ ÑÑ
емой.
Ðногие вÑÑÑоеннÑе ÑÑнкÑии Postgres Pro пÑинимаÑÑ OID ÑаблиÑÑ Ð¸Ð»Ð¸ дÑÑгого Ñипа обÑекÑа ÐРи Ð´Ð»Ñ ÑдобÑÑва обÑÑвлÑÑÑÑÑ ÐºÐ°Ðº пÑинимаÑÑие regclass (или ÑооÑвеÑÑÑвÑÑÑий Ñип-пÑевдоним OID). ÐÑо ознаÑаеÑ, ÑÑо вам не нÑжно иÑкаÑÑ OID обÑекÑа вÑÑÑнÑÑ, а можно пÑоÑÑо ввеÑÑи его Ð¸Ð¼Ñ Ð² виде ÑÑÑоки. ÐапÑимеÑ, ÑÑнкÑÐ¸Ñ nextval (regclass) пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ OID оÑноÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи, поÑÑÐ¾Ð¼Ñ ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзваÑÑ Ñак:
nextval('foo') обÑаÑаеÑÑÑ Ðº поÑледоваÑелÑноÑÑи foo
nextval('FOO') Ñо же Ñамое
nextval('"Foo"') обÑаÑаеÑÑÑ Ðº поÑледоваÑелÑноÑÑи Foo
nextval('myschema.foo') обÑаÑаеÑÑÑ Ðº myschema.foo
nextval('"myschema".foo') Ñо же Ñамое
nextval('foo') иÑÐµÑ foo в пÑÑи поиÑкаÐÑимеÑание
Ðогда аÑгÑÐ¼ÐµÐ½Ñ Ñакой ÑÑнкÑии запиÑÑваеÑÑÑ ÐºÐ°Ðº ÑекÑÑÐ¾Ð²Ð°Ñ ÑÑÑока в ÑиÑÑом виде, она ÑÑановиÑÑÑ ÐºÐ¾Ð½ÑÑанÑой Ñипа regclass. Так как ÑакÑиÑеÑки ÑÑо бÑÐ´ÐµÑ Ð¿ÑоÑÑо знаÑение OID, оно бÑÐ´ÐµÑ Ð¿ÑивÑзано к изнаÑалÑно иденÑиÑиÑиÑованной поÑледоваÑелÑноÑÑи, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеименована, пеÑенеÑена в дÑÑгÑÑ ÑÑ
ÐµÐ¼Ñ Ð¸ Ñ. д. Такое «Ñаннее ÑвÑзÑвание» обÑÑно желаÑелÑно Ð´Ð»Ñ ÑÑÑлок на поÑледоваÑелÑноÑÑи в знаÑениÑÑ
ÑÑолбÑов по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ пÑедÑÑавлениÑÑ
. Ðо иногда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ Ð² «позднем ÑвÑзÑвании», когда ÑÑÑлки на поÑледоваÑелÑноÑÑи ÑаÑпознаÑÑÑÑ Ð² пÑоÑеÑÑе вÑполнениÑ. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ñакое поведение, нÑжно пÑинÑдиÑелÑно измениÑÑ Ñип конÑÑанÑÑ Ñ regclass на text:
nextval('foo'::text) foo ÑаÑпознаÑÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐÐ»Ñ Ð¿Ð¾Ð¸Ñка во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ ÑÑнкÑÐ¸Ñ to_regclass() и подобнÑе. См. ТаблиÑÑ 9.74.
ÐÑÑгой пÑакÑиÑеÑкий пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ regclass â поиÑк OID ÑаблиÑÑ, оÑобÑажÑнной в пÑедÑÑавлениÑÑ
information_schema, коÑоÑÑе не пÑедоÑÑавлÑÑÑ Ñакие OID напÑÑмÑÑ. ÐапÑимеÑ, можно вÑзваÑÑ ÑÑнкÑÐ¸Ñ pg_relation_size(), Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑÑебÑеÑÑÑ OID ÑаблиÑÑ. С ÑÑÑÑом ÑказаннÑÑ
вÑÑе пÑавил, далее пÑедÑÑавлен коÑÑекÑнÑй ÑпоÑоб вÑзова данной ÑÑнкÑии
SELECT table_schema, table_name,
pg_relation_size((quote_ident(table_schema) || '.' ||
quote_ident(table_name))::regclass)
FROM information_schema.tables
WHERE .... ФÑнкÑÐ¸Ñ quote_ident() заклÑÑÐ¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð² двойнÑе кавÑÑки, когда ÑÑо необÑ
одимо. Ðолее пÑоÑÑÑм ÑпоÑобом кажеÑÑÑ
SELECT pg_relation_size(table_name) FROM information_schema.tables WHERE ...
но иÑполÑзоваÑÑ ÐµÐ³Ð¾ не ÑекомендÑеÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо он не ÑÑабоÑÐ°ÐµÑ Ð´Ð»Ñ ÑаблиÑ, коÑоÑÑе не Ð²Ñ Ð¾Ð´ÑÑ Ð² заданнÑй пÑÑÑ Ð¿Ð¾Ð¸Ñка или имена коÑоÑÑÑ Ð½Ñжно заклÑÑаÑÑ Ð² кавÑÑки.
ÐополниÑелÑнÑм ÑвойÑÑвом болÑÑинÑÑва Ñипов пÑевдонимов OID ÑвлÑеÑÑÑ Ð¾Ð±Ñазование завиÑимоÑÑей. Ðогда в ÑоÑ
ÑанÑнном вÑÑажении ÑигÑÑиÑÑÐµÑ ÐºÐ¾Ð½ÑÑанÑа одного из ÑÑиÑ
Ñипов (напÑимеÑ, в пÑедÑÑавлении или в знаÑении ÑÑолбÑа по ÑмолÑаниÑ), ÑÑо ÑоздаÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ Ð¾Ñ Ñелевого обÑекÑа. ÐапÑимеÑ, еÑли знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ Ð²ÑÑажением nextval('my_seq'::regclass), Postgres Pro понимаеÑ, ÑÑо ÑÑо вÑÑажение завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи my_seq, и не Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ ÑдалиÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ ÑанÑÑе, Ñем бÑÐ´ÐµÑ Ñдалено ÑÑо вÑÑажение. ÐлÑÑеÑнаÑÐ¸Ð²Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑ nextval('my_seq'::text) не ÑоздаÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑÑ. (ÐÑклÑÑениÑми ÑвлÑÑÑÑÑ ÑÐ¸Ð¿Ñ regprofile и regrole. ÐонÑÑанÑÑ ÑÑиÑ
Ñипов в ÑакиÑ
вÑÑажениÑÑ
не допÑÑкаÑÑÑÑ.)
ÐÑÑÑ ÐµÑÑ Ð¾Ð´Ð¸Ð½ Ñип ÑиÑÑемнÑÑ
иденÑиÑикаÑоÑов, xid, пÑедÑÑавлÑÑÑий иденÑиÑикаÑÐ¾Ñ ÑÑанзакÑии (ÑокÑаÑÑнно xact). ÐÑÐ¾Ñ Ñип имеÑÑ ÑиÑÑемнÑе ÑÑолбÑÑ xmin и xmax. ÐденÑиÑикаÑоÑÑ ÑÑанзакÑий опÑеделÑÑÑÑÑ 32-биÑнÑми ÑиÑлами. РнекоÑоÑÑÑ
конÑекÑÑаÑ
иÑполÑзÑеÑÑÑ 64-биÑнÑй ваÑÐ¸Ð°Ð½Ñ xid8. РоÑлиÑие Ð¾Ñ xid, знаÑÐµÐ½Ð¸Ñ xid8 ÑвелиÑиваÑÑÑÑ ÑÑÑого моноÑонно и никогда не повÑоÑÑÑÑÑÑ Ð½Ð° пÑоÑÑжении вÑего ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑеÑа баз даннÑÑ
. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 64.1.
ТÑеÑий Ñип иденÑиÑикаÑоÑов, иÑполÑзÑемÑÑ
в ÑиÑÑеме, â cid, иденÑиÑикаÑÐ¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ (command identifier). ÐÑÐ¾Ñ Ñип даннÑÑ
имеÑÑ ÑиÑÑемнÑе ÑÑолбÑÑ cmin и cmax. ÐденÑиÑикаÑоÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´ â ÑÑо Ñоже 32-биÑнÑе ÑиÑла.
РнаконеÑ, поÑледний Ñип ÑиÑÑемнÑÑ
иденÑиÑикаÑоÑов â tid, иденÑиÑикаÑÐ¾Ñ ÑÑÑоки/коÑÑежа (tuple identifier). ÐÑÐ¾Ñ Ñип даннÑÑ
Ð¸Ð¼ÐµÐµÑ ÑиÑÑемнÑй ÑÑÐ¾Ð»Ð±ÐµÑ ctid. ÐденÑиÑикаÑÐ¾Ñ ÐºÐ¾ÑÑежа пÑедÑÑавлÑÐµÑ Ñобой паÑÑ (из номеÑа блока и индекÑа коÑÑежа в блоке), иденÑиÑиÑиÑÑÑÑÑÑ ÑизиÑеÑкое ÑаÑположение ÑÑÑоки в ÑаблиÑе.
(ÐодÑобнее о ÑиÑÑемнÑÑ ÑÑолбÑÐ°Ñ ÑаÑÑказÑваеÑÑÑ Ð² Разделе 5.6.)