zoukankan      html  css  js  c++  java
  • 笔记 postgresql oid同步

    以前学习postgresql的笔记

     

    create table 消耗 OID

    • create table my_test_table, 他本身会消耗一个

    • 会在pg_type中插入两条记录_my_test_tablemy_test_table会消耗掉两个oid

    • 如果该表需要toast会生成一个改变的toast表和toast index表消耗另外两个,查看过程如下:

    • create table my_test_table(a int, b char(8192));

    • select oid, relname from pg_class where relname='my_test_table';

    • -- oid = 16384

    • select oid, relname from pg_class where relname like '%16384%';

    • select typname, oid from pg_type where typname like '%my_test_table';

    OID同步过程

    OID同步原因:当创建表、视图、函数等对象时,对象需要分配新的OID。创建对象的OID

    局唯一,因此要在所有的coordinatordatanode上获取一个最大的OID。以create table为例,

    具体流程如下:

    1)首先和所有的dn及除自己以外的co建立连接。

    2)向所有建立连接的节点发送获取OID请求,收到请求的节点,把本节点最大的OID发给coordinator

    3coordinator节点收到其他几点发来的oid,选一个最大的oid,然后调用SetNextAssignObjectId

    函数,使当前co节点下一个要分配的OID为集群中最大的OID

    4)然后才执行create语句,结构体CreateStmt中成员TableOidInfo用来存储获取的最大的

    OID,当前coordiator把查询计划下发到其它节点,其它节点获取到最大OID后调用函数

    heap_create_with_catalog,在自己节点上创建表

    OID同步涉及到的系统表

    pg_class

    pg_namespace --create schema

    pg_constraint

    pg_operator

    pg_ts_parser

    pg_ts_dict

    pg_ts_template

    pg_ts_config

    pg_collation

    pg_am

    pg_extension

    pg_foreign_data_wrapper

    pg_foreign_server

    pg_user_mapping

    pg_type

    pg_enum

    pg_proc

    pg_rewrite

    pg_trigger

    pg_language

    pg_conversion

    pg_cast

    pg_opfamily

    pg_opclass

    pg_tablespace

    OID同步去除

    当前实现可能存在问题是,当有节点或所有节点的OID回绕了,创建对象非常有可能失败。OID同步去除参考

    PG-XL的做法,在查询计划中发送对象名,到节点上再转成本地OID


  • 相关阅读:
    【tensorflow】神经网络的一些基本概念(前向传播、反向传播、损失函数、梯度下降法、学习率)和设计过程
    【opencv+python】图像的基本操作:缩放、剪切、位移、旋转、仿射变换
    【tensorflow】利用神经网络绘制股票价格拟合曲线
    Tuple
    2020-08-17T15:35:54.525+08:00
    FTP协议协议
    centos7常规系统指标监控shell脚本
    AWK传入shell变量举例
    洛谷-P5143 攀爬者
    洛谷-P1104 生日
  • 原文地址:https://www.cnblogs.com/codeblock/p/5526649.html
Copyright © 2011-2022 走看看