(作为对比,简单看了下Oracle 12c的手册。Oracle也可以支持类型定制,但看上去比PG弱。Oracle的自定义数据类型依赖于已有的原生数据类型,自定义 *** 作符的使用方法也比较怪异更像是函数调用,自定义索引类型看上去很复杂没多看)
1. 数据类型
pg_type
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-type.HTML---------------------------------------------------------------- 47.51.pg_type
pg_type存储有关数据类型的信息。基本类型和枚举类型(标量类型)是用CREATE TYPE创建的,域是使用CREATE DOMAIN创建的。 同时还为数据库中每个表自动创建一个复合类型,以表示该表的行结构。还可以用CREATE TYPE AS创建复合类型。
table 47-51.pg_type字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性;必须明确选择) | |
typname | name | 数据类型名 | |
typnamespace | oID | pg_namespace.oID | 包含这个类型的名字空间的OID |
typowner | oID | pg_authid.oID | 该类型的所有者 |
typlen | int2 | 对于定长类型是该类型内部表现形式的字节数目。对于变长类型是负数。 -1 表示一种"变长"类型(有长度字属性的数据), -2 表示这是一个 NulL 结尾的 C 字符串。 | |
typbyval | bool | 判断内部过程传递这个类型的数值时是通过传值还是传引用。 如果该类型不是 1,2,4,8 字节长将只能按引用传递,因此 typbyval 最好是假。 即使可以传值,typbyval 也可以为假。 | |
typtype | char | 对于基础类型是b,对于复合类型是c(比如,一个表的行类型)。对于域类型是d,对于枚举类型是e, 对于伪类型是p,对于范围类型是r。 又见typrelID和typbasetype。 | |
typcategory | char | typcategory是数据类型的任意分类, 该数据类型被触发器用来决定哪种隐式转换应该是"首选"。 参阅@L_419_6@。 | |
typispreferred | bool | 如果类型在它的typcategory里是首选转换目标则为真。 | |
typisdefined | bool | 如果定义了类型则为真,如果是一种尚未定义的类型的占位符则为假。如果为假, 那么除了该类型名称,名字空间,和 OID 之外没有可靠的信息。 | |
typdelim | char | 当分析数组输入时,分隔两个此类型数值的字符。请注意该分隔符是与数组元素数据类型相关联的, 而不是和数组数据类型关联。 | |
typrelID | oID | pg_class.oID | 如果是复合类型(见typtype)那么这个字段指向pg_class中定义该表的行。对于自由存在的复合类型,pg_class记录并不表示一个表, 但是总需要它来查找该类型连接的pg_attribute记录。对于非复合类型为零。 |
typelem | oID | pg_type.oID | 如果不为 0 ,那么它标识pg_type里面的另外一行。 当前类型可以像一个数组产生类型为typelem的值一样当做下标。 一个"真正的"数组类型是变长的(typlen= -1), 但是一些定长的(typlen> 0)类型也拥有非零的typelem(比如name和point)。如果一个定长类型拥有一个typelem, 那么他的内部形式必须是typelem数据类型的某个数目的个数值, 不能有其它数据。变长数组类型有一个该数组子过程定义的头(文件)。 |
typarray | oID | pg_type.oID | 如果typarray非零,那么它在pg_type里定义另外一行,该行是将这个类型作为元素的"真正的"数组类型。 |
typinput | regproc | pg_proc.oID | 输入转换函数(文本格式) |
typoutput | regproc | pg_proc.oID | 输出转换函数(文本格式) |
typreceive | regproc | pg_proc.oID | 输入转换函数(二进制格式),如果没有则为 0 |
typsend | regproc | pg_proc.oID | 输出转换函数(二进制格式),如果没有则为 0 |
typmodin | regproc | pg_proc.oID | 类型修饰符输入函数,如果类型不支持修饰符则为0 |
typmodout | regproc | pg_proc.oID | 类型修饰符输出函数,如果使用标准格式则为0 |
typanalyze | regproc | pg_proc.oID | 自定义的ANALYZE函数,如果使用标准函数,则为 0 |
typalign | char | 当存储此类型的数值时要求的对齐性质。它应用于磁盘存储以及该值在Postgresql内部的大多数形式。如果数值是连续存放的,比如在磁盘上以完全的裸数据的形式存放时, 那么先在此类型的数据前填充空白,这样它就可以按照要求的界限存储。对齐引用是该序列中第一个数据的开头。 可能的值有: c=char对齐,也就是不需要对齐。 s=short对齐(在大多数机器上是 2 字节) i=int对齐(在大多数机器上是 4 字节) d=double对齐(在大多数机器上是 8 字节,但不一定是全部)
| |
typstorage | char | 告诉一个变长类型(那些有typlen= -1的) 说该类型是否准备好应付非常规值,以及对这种类型的属性的缺省策略是什么。可能的值有 p:数值总是以简单方式存储 e: 数值可以存储在一个"次要"关系中(如果该关系有这么一个, 参阅pg_class.reltoastrelID) m: 数值可以以内联的压缩方式存储 x: 数值可以以内联的压缩方式或者在"次要"表里存储。 请注意m域也可以移到从属表里存储,但只是最后的解决方法 (e和x域先移走)。 | |
typnotnull | bool | 代表在某类型上的一个 NOTNulL 约束。目前只用于域。 | |
typbasetype | oID | pg_type.oID | 如果这是一个域(参阅typtype), 那么标识作为这个类型的基础的类型。如果不是域则为零。 |
typtypmod | int4 | 域使用typtypmod记录要作用到它们的基础类型上的typmod(如果基础类型不使用typmod则为 -1)。如果这种类型不是域,那么为 -1 。 | |
typndims | int4 | 如果是一个域数组,那么typndims是数组维数的数值(也就是说,typbasetype是一个数组类型)。非域非数组类型为零。 | |
typcollation | oID | pg_collation.oID | 指定类型的排序规则。如果类型不支持排序,则为0。一个支持排序的基础类型将有DEFAulT_ColLATION_OID。一个可排序类型的域可以有一些其他排序OID, 如果为该域指定了一个的话。 |
typdefaultbin | pg_node_tree | 如果为非 NulL ,那么它是该类型缺省表达式的nodetoString()表现形式。 目前这个字段只用于域。 | |
typdefault | text | 如果某类型没有相关缺省值,那么typdefault是 NulL 。如果typdefaultbin不是 NulL ,那么typdefault必须包含一个typdefaultbin代表的缺省表达式的人类可读的版本。如果typdefaultbin为 NulL 但typdefault不是,那么typdefault是该类型缺省值的外部表现形式, 可以把它交给该类型的输入转换器生成一个常量。 | |
typacl | aclitem[] | 访问权限;参阅GRANT和REVOKE获取细节。 |
@L_419_6@列出了系统定义的typcategory的值。 任何未来添加到这个列表的也是大写的ASCII字母。所有其他ASCII字符为用户定义的范畴保留。
table 47-52.typcategory代码
代码 | 种类 |
---|---|
A | 数组类型 |
B | 布尔类型 |
C | 复合类型 |
D | 日期/时间类型 |
E | 枚举类型 |
G | 几何类型 |
I | 网络地址类型 |
N | 数值类型 |
P | 伪类型 |
R | 范围类型 |
S | 字符串类型 |
T | 时间间隔类型 |
U | 用户定义类型 |
V | 位串类型 |
X | 未知类型 |
----------------------------------------------------------------
比较关键是4个输入输出函数:typinput,typoutput,typreceive,typsend。PG通过这4个函数读写数据,所以扩展数据类型时,只要按要求实现好这4个函数,可以自由定义数据的内部存储格式。
例: Jsonb类型
postgres=# select oID,* from pg_type where typname='Jsonb';-[ RECORD 1 ]--+-----------oID | 3802typname | Jsonbtypnamespace | 11typowner | 10typlen | -1typbyval | ftyptype | btypcategory | Utypispreferred | ftypisdefined | ttypdelim |,typrelID | 0typelem | 0typarray | 3807typinput | Jsonb_intypoutput | Jsonb_outtypreceive | Jsonb_recvtypsend | Jsonb_sendtypmodin | -typmodout | -typanalyze | -typalign | itypstorage | xtypnotnull | ftypbasetype | 0typtypmod | -1typndims | 0typcollation | 0typdefaultbin | typdefault | typacl |
创建新的数据类型的sql:
CREATE TYPE --定义一个新数据类型
详细用法参考手册:http://58.58.27.50:8079/doc/HTML/9.3.1_zh/sql-createtype.HTML
2. *** 作符 pg_operator
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-operator.HTML
---------------------------------------------------------------- 47.33.pg_operator
pg_operator存储有关 *** 作符的信息。参阅 CREATE OPERATOR 和 节33.12 获取这些 *** 作符参数的细节。
table 47-33.pg_operator字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性;必须明确选择) | |
oprname | name | *** 作符的名字 | |
oprnamespace | oID | pg_namespace.oID | 包含此 *** 作符的名字空间的 OID |
oprowner | oID | pg_authid.oID | *** 作符所有者 |
oprkind | char | b= infix = 中缀("两边"),l= 前缀("左边"),r= 后缀("右边") | |
oprcanmerge | bool | 这个 *** 作符支持合并连接 | |
oprcanhash | bool | 这个 *** 作符支持 Hash 连接 | |
oprleft | oID | pg_type.oID | 左 *** 作数的类型 |
oprright | oID | pg_type.oID | 右 *** 作数的类型 |
oprresult | oID | pg_type.oID | 结果类型 |
oprcom | oID | pg_operator.oID | 此 *** 作符的交换符,如果存在的话 |
oprnegate | oID | pg_operator.oID | 此 *** 作符的反转器,如果存在的话 |
oprcode | regproc | pg_proc.oID | 实现这个 *** 作符的函数 |
oprrest | regproc | pg_proc.oID | 此 *** 作符的约束选择性计算函数 |
oprjoin | regproc | pg_proc.oID | 此 *** 作符的连接选择性计算函数 |
未用的字段包含零。比如,oprleft对于前缀 *** 作符而言是零。
----------------------------------------------------------------
例: Jsonb的@> *** 作符
postgres=# select oID,* from pg_operator where oprleft=3802 and oprname='@>';-[ RECORD 1 ]+---------------oID | 3246oprname | @>oprnamespace | 11oprowner | 10oprkind | boprcanmerge | foprcanhash | foprleft | 3802oprright | 3802oprresult | 16oprcom | 3250oprnegate | 0oprcode | Jsonb_containsoprrest | contseloprjoin | contjoinsel
创建新的 *** 作符的sql:
CREATE OPERATOR --定义一个新 *** 作符
3. 索引扩展 索引扩展相关的系统表有5个,它们通过oID相互关联。关于PG的扩展索引,有几个比较重要的概念要先说明一下。
索引访问方法
索引访问方法代表了索引算法, 目前PG提供了5种 索引访问方法,btree,hash,gist,gin和spgist。 其中 gist 和 spgist可以 支持多种多维数据的索引 算法。比如基于gist的R-tree,RD-tree,基于spgist的quad-trees,k-d trees和 radix trees。索引访问方法相关的信息存储在系统表pg_am中。
*** 作符类
一个索引方法的过程并不直接知道任何该索引方法将要 *** 作的数据类型的信息。 而是 *** 作符类 表明索引方法在 *** 作特定数据类型的时候需要使用的 *** 作集合。这么说比较抽象,实际一点,create index的using子句中可以指定的索引字段数据类型的某个 *** 作符类作为具体的索引实现(不指定的话,使用该数据类型的默认 *** 作符类)。索引访问方法相关的信息存储在系统表pg_am中。 *** 作符类相关的信息存储在系统表pg_opclass中。
索引方法策略
索引方法策略是 *** 作符在 *** 作符类环境里的内部表示。比如,B-tree索引的”等于“ *** 作对应的策略号为3。因为Postgresql允许用户定义 *** 作符,Postgresql 无法仅通过查看 *** 作符的名字(比如<或>=)就明白它进行的比较是什么,所以索引方法定义了一套"策略",它可以看作一般性的 *** 作符。比如,你可以把你的数据类型的等于 *** 作符的名字定义成"="也可以定义成"==",只要把它的策略号设定为3,B-tree就可以知道它的语义是"等于"了。 *** 作符类包含的 *** 作符集合和索引方法策略号的对应关系存储在系统表 pg_amop 中 。
索引方法支持函数
有时候,策略的信息还不足以让系统决定如何使用某个索引。在实际中, 索引方法需要附加的一些过程来保证正常工作。例如, B-tree 索引方法必须能够比较两个键字以决定其中一个是大于、等于、还是小于另外一个。与策略号相似,索引方法通过“支持号”识别支持函数。 *** 作符类包含的支持函数集合和支持号的对应关系存储在系统表 pg_amproc 中 。
*** 作符族
一个 *** 作符类代表一种数据类型,而一个 *** 作符族则可以包含一个或多个 *** 作符类,它们代表一类相似的数据类型,比如int2,int4和int8。这样可以在 *** 作符族上定义一些交叉数据类型 *** 作符(比如int4和int8的比较)。 *** 作符族相关的信息都存储在系统表pg_opfamily中,并且pg_opclass,pg_amop和pg_amproc通过pg_opfamily的oID聚集成一个整体。
为了说明这索引扩展相关的几个系统表的关系,后面的例子采用下面的 *** 作符类(族)gist__int_ops2进行说明。
下面这个例子,为int4数组创建一个 *** 作符 类gist__int_ops2(pg_opclass),并且由于没有指定 *** 作符族,所以创建一个同名的 *** 作符族 gist__int_ops ( pg_opfamily ) 。OPERATOR相关的定义会存到 pg_amop ,FUNCTION相关的定义会存到 pg_amproc 。
CREATE OPERATOR CLASS gist__int_ops2FOR TYPE _int4 USING gist AS OPERATOR 3 &&,OPERATOR 6 = (anyarray,anyarray),OPERATOR 7 @>,OPERATOR 8 <@,OPERATOR 13 @,OPERATOR 14 ~,OPERATOR 20 @@ (_int4,query_int),FUNCTION 1 g_int_consistent (internal,_int4,int,oID,internal),FUNCTION 2 g_int_union (internal,FUNCTION 3 g_int_compress (internal),FUNCTION 4 g_int_decompress (internal),FUNCTION 5 g_int_penalty (internal,internal,FUNCTION 6 g_int_picksplit (internal,FUNCTION 7 g_int_same (_int4,internal);
pg_am http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-am.HTML
----------------------------------------------------------------
47.3.pg_am
pg_am存储有关索引访问方法的信息。系统支持的每种索引访问方法都有一行。 这个表的内容在Chapter 54详细讨论。
table 47-3.pg_am字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性; 必须明确选择) | |
amname | name | 访问方法的名字 | |
amstrategIEs | int2 | 这个访问方法的 *** 作符策略个数,或者如果访问方法没有一个固定的 *** 作符策略集则为0。 | |
amsupport | int2 | 这个访问方法的支持过程个数 | |
amcanorder | bool | 这种访问方式是否支持通过索引字段值的命令扫描排序? | |
amcanorderbyop | bool | 这种访问方式是否支持通过索引字段上 *** 作符的结果的命令扫描排序? | |
amcanbackward | bool | 这种访问方式是否支持向后扫描? | |
amcanunique | bool | 这种访问方式是否支持唯一索引? | |
amcanmulticol | bool | 这种访问方式是否支持多字段索引? | |
amoptionalkey | bool | 这种访问方式是否支持第一个索引字段上没有任何约束的扫描? | |
amsearcharray | bool | 这种访问方式是否支持ScalararrayOpExpr搜索? | |
amsearchnulls | bool | 这种访问方式是否支持IS NulL/NOT NulL搜索? | |
amstorage | bool | 允许索引存储的数据类型与列的数据类型不同? | |
amclusterable | bool | 允许在一个这种类型的索引上群集? | |
ampredlocks | bool | 允许这种类型的一个索引管理细粒度的谓词锁定? | |
amkeytype | oID | pg_type.oID | 存储在索引里的数据的类型,如果不是一个固定的类型则为0 |
aminsert | regproc | pg_proc.oID | "插入这个行"函数 |
ambeginscan | regproc | pg_proc.oID | "准备索引扫描"函数 |
amgettuple | regproc | pg_proc.oID | "下一个有效行"函数,如果没有则为0 |
amgetbitmap | regproc | pg_proc.oID | "抓取所有有效行"函数,如果没有则为0 |
amrescan | regproc | pg_proc.oID | "(重新)开始索引扫描"函数 |
amendscan | regproc | pg_proc.oID | "索引扫描后清理"函数 |
ammarkpos | regproc | pg_proc.oID | "标记当前扫描位置"函数 |
amrestrpos | regproc | pg_proc.oID | "恢复已标记的扫描位置"函数 |
ambuild | regproc | pg_proc.oID | "建立新索引"函数 |
ambuildempty | regproc | pg_proc.oID | "建立空索引"函数 |
ambulkdelete | regproc | pg_proc.oID | 批量删除函数 |
amvacuumcleanup | regproc | pg_proc.oID | VACUUM后的清理函数 |
amcanreturn | regproc | pg_proc.oID | 检查是否索引支持唯一索引扫描的函数,如果没有则为0 |
amcostestimate | regproc | pg_proc.oID | 估计一个索引扫描开销的函数 |
amoptions | regproc | pg_proc.oID | 为一个索引分析和确认reloptions的函数 |
目前PG提供了5种索引访问方法。PG没有提供扩展索引访问方法的SQL语句,但通过往pg_am中插入记录也不是不可以扩展出新的索引访问方法。
postgres=# select oID,amname,amstrategIEs,amsupport from pg_am; oID | amname | amstrategIEs | amsupport ------+--------+--------------+----------- 403 | btree | 5 | 2 405 | hash | 1 | 1 783 | gist | 0 | 8 2742 | gin | 0 | 6 4000 | spgist | 0 | 5(5 rows)
pg_opfamily
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-opfamily.HTML
----------------------------------------------------------------
47.34.pg_opfamily
pg_opfamily表定义 *** 作符族。每个 *** 作符族是一个 *** 作符和相关支持例程的集合, 其中的例程实现为一个特定的索引访问方式指定的语义。另外,族中的 *** 作符都是"兼容的", 通过由访问方式指定的方法。 *** 作符族的概念允许交叉数据类型 *** 作符和索引一起使用, 并且合理的使用访问方式的语义的知识。
*** 作符族在Section 35.14里面描述。
table 47-34.pg_opfamily字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性; 必须明确选择) | |
opfmethod | oID | pg_am.oID | *** 作符族使用的索引方法 |
opfname | name | 这个 *** 作符族的名字 | |
opfnamespace | oID | pg_namespace.oID | 这个 *** 作符的名字空间 |
opfowner | oID | pg_authid.oID | *** 作符族的所有者 |
定义一个 *** 作符族的大多数信息不在它的pg_opfamily行里面, 而是在相关的行pg_amop,pg_amproc和pg_opclass里。
----------------------------------------------------------------例:查询 *** 作符族gist__int_ops2
postgres=# select oID,* from pg_opfamily where opfname = 'gist__int_ops2'; oID | opfmethod | opfname | opfnamespace | opfowner -------+-----------+----------------+--------------+---------- 32904 | 783 | gist__int_ops2 | 2200 | 10(1 row)
创建新的 *** 作符族的sql:
CREATE OPERATOR FAMILY--定义一个新 *** 作符族
pg_opclass
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-opclass.HTML
----------------------------------------------------------------
47.32.pg_opclass
pg_opclass定义索引访问方法 *** 作符类。 每个 *** 作符类为一种特定数据类型和一种特定索引访问方法定义索引字段的语义。 一个 *** 作符类本质上指定一个特定的 *** 作符族适用于一个特定的可索引的字段数据类型。 索引的字段实际可用的族中的 *** 作符集是接受字段的数据类型作为它们的左边的输入的那个。
*** 作符类在Section 35.14里有比较详细的描述。
table 47-32.pg_opclass字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性;必须明确选择) | |
opcmethod | oID | pg_am.oID | *** 作符类所服务的索引访问方法 |
opcname | name | 这个 *** 作符类的名字 | |
opcnamespace | oID | pg_namespace.oID | 这个 *** 作符类的名字空间 |
opcowner | oID | pg_authid.oID | *** 作符类属主 |
opcfamily | oID | pg_opfamily.oID | 包含该 *** 作符类的 *** 作符族 |
opcintype | oID | pg_type.oID | *** 作符类索引的数据类型 |
opcdefault | bool | 如果 *** 作符类是opcintype的缺省,则为真 | |
opckeytype | oID | pg_type.oID | 索引数据的类型,如果和opcintype相同则为零 |
一个 *** 作符类的opcmethod必须匹配包含它的 *** 作符族的opfmethod。 同样,对于任意给定的opcmethod和opcintype的组合, 不能有超过一个pg_opclass行有opcdefault为真。
----------------------------------------------------------------例:查询 *** 作符族gist__int_ops2包含的 *** 作符类
postgres=# select oID,* from pg_opclass where opcfamily=32904; oID | opcmethod | opcname | opcnamespace | opcowner | opcfamily | opcintype | opcdefault | opckeytype -------+-----------+----------------+--------------+----------+-----------+-----------+------------+------------ 32905 | 783 | gist__int_ops2 | 2200 | 10 | 32904 | 1007 | f | 0(1 row)
创建新的 *** 作符类的sql:
CREATE OPERATOR CLASS--定义一个新 *** 作符类
pg_amop
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-amop.HTML
----------------------------------------------------------------
47.4.pg_amop
pg_amop表存储有关和访问方法 *** 作符族关联的信息。 如果一个 *** 作符是一个 *** 作符族中的成员,那么在这个表中会占据一行。 一个族成员是一个search *** 作符或一个ordering *** 作符。 一个 *** 作符可以在多个族中出现,但是不能在一个族中的多个搜索位置或多个排序位置中出现。 (尽管不太可能,但这是允许的,一个 *** 作符可以被搜索和排序目的使用。)
table 47-4.pg_amop字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性;必须明确选择) | |
amopfamily | oID | pg_opfamily.oID | 这个项的 *** 作符族 |
amoplefttype | oID | pg_type.oID | *** 作符的左输入类型 |
amoprighttype | oID | pg_type.oID | *** 作符的右输入类型 |
amopstrategy | int2 | *** 作符策略数 | |
amoppurpose | char | *** 作符目的,s为搜索或o为排序 | |
amopopr | oID | pg_operator.oID | 该 *** 作符的OID |
amopmethod | oID | pg_am.oID | 索引访问方式 *** 作符族 |
amopsortfamily | oID | pg_opfamily.oID | 如果是一个排序 *** 作符,则为这个项排序所依据的btree *** 作符族; 如果是一个搜索 *** 作符,则为0 |
"搜索" *** 作符表明这个 *** 作符族的一个索引可以被搜索,找到所有满足WHEREindexed_columnoperatorconstant的行。 显然,这样的 *** 作符必须返回布尔值,并且它的左输入类型必须匹配索引的字段数据类型。
"排序" *** 作符表明这个 *** 作符族的一个索引可以被扫描,返回以ORDER BYindexed_columnoperatorconstant顺序表示的行。这样的 *** 作符可以返回任意可排序的数据类型,它的左输入类型也必须匹配索引的字段数据类型。ORDER BY的确切的语义是由amopsortfamily字段指定的, 该字段必须为 *** 作符的返回类型引用一个btree *** 作符族。
Note:目前,假设排序 *** 作符的排序顺序是被族缺省引用的,也就是ASC NulLS LAST。 这可以通过添加附加的行来明确声明排序选项来释放。
一个项的amopmethod必须匹配它包含的 *** 作符族的opfmethod(包括amopmethod是故意违反性能原因的表结构的规范化)。同样,amoplefttype和amoprighttype必须匹配引用的pg_operator的oprleft和oprright。
----------------------------------------------------------------例: 查询 *** 作符族gist__int_ops2 包含的所有 *** 作符
postgres=# select oID,(select oprname from pg_operator where oID=amopopr),* from pg_amop where amopfamily=32904; oID | oprname | amopfamily | amoplefttype | amoprighttype | amopstrategy | amoppurpose | amopopr | amopmethod | amopsortfamily -------+---------+------------+--------------+---------------+--------------+-------------+---------+------------+---------------- 32906 | && | 32904 | 1007 | 1007 | 3 | s | 32809 | 783 | 0 32908 | @> | 32904 | 1007 | 1007 | 7 | s | 32811 | 783 | 0 32909 | <@ | 32904 | 1007 | 1007 | 8 | s | 32810 | 783 | 0 32910 | @ | 32904 | 1007 | 1007 | 13 | s | 32813 | 783 | 0 32911 | ~ | 32904 | 1007 | 1007 | 14 | s | 32812 | 783 | 0 32912 | @@ | 32904 | 1007 | 32793 | 20 | s | 32801 | 783 | 0 32907 | = | 32904 | 2277 | 2277 | 6 | s | 1070 | 783 | 0(7 rows)
pg_amproc
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalog-pg-amproc.HTML
----------------------------------------------------------------
47.5.pg_amproc
pg_amproc存储有关与访问方法 *** 作符族相关联的支持过程的信息。 每个属于某个 *** 作符族的支持过程都占有一行。
table 47-5.pg_amproc字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
oID | oID | 行标识符(隐藏属性; 必须明确选择) | |
amprocfamily | oID | pg_opfamily.oID | 该项的 *** 作符族 |
amproclefttype | oID | pg_type.oID | 相关 *** 作符的左输入数据类型 |
amprocrighttype | oID | pg_type.oID | 相关 *** 作符的右输入数据类型 |
amprocnum | int2 | 支持过程编号 | |
amproc | regproc | pg_proc.oID | 过程的 OID |
amproclefttype和amprocrighttype字段的习惯解释, 他们标识一个特定支持过程支持的 *** 作符的左和右输入类型。对于某些访问方式, 他们匹配支持过程本身的输入数据类型,对其他的则不这样。有一个对索引的"缺省"支持过程的概念,amproclefttype和amprocrighttype都等于索引 *** 作符类的opcintype。
----------------------------------------------------------------例: 查询 *** 作符族gist__int_ops2 包含的所有支持函数
postgres=# select oID,* from pg_amproc where amprocfamily=32904; oID | amprocfamily | amproclefttype | amprocrighttype | amprocnum | amproc -------+--------------+----------------+-----------------+-----------+------------------ 32913 | 32904 | 1007 | 1007 | 1 | g_int_consistent 32914 | 32904 | 1007 | 1007 | 2 | g_int_union 32915 | 32904 | 1007 | 1007 | 3 | g_int_compress 32916 | 32904 | 1007 | 1007 | 4 | g_int_decompress 32917 | 32904 | 1007 | 1007 | 5 | g_int_penalty 32918 | 32904 | 1007 | 1007 | 6 | g_int_picksplit 32919 | 32904 | 1007 | 1007 | 7 | g_int_same(7 rows
4. 参考 http://58.58.27.50:8079/doc/HTML/9.3.1_zh/xindex.HTML
http://blog.chinaunix.net/uID-20726500-ID-4884626.HTML
http://58.58.27.50:8079/doc/HTML/9.3.1_zh/catalogs.HTML
原文:http://blog.chinaunix.net/uid-20726500-id-4926919.html
总结以上是内存溢出为你收集整理的PostgreSQL的类型扩展相关的几个系统表(包含pg的 *** 作符类和 *** 作符族等)全部内容,希望文章能够帮你解决PostgreSQL的类型扩展相关的几个系统表(包含pg的 *** 作符类和 *** 作符族等)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)