摘要:通过一些自定义的视图或者查询语句,批量识别集群的sequence相关问题

本文分享自华为云社区《GaussDB(DWS)运维 -- sequence常见运维操作》,作者: 譡里个檔。

【DWS的序列概述】

GaussDB(DWS)是一个share nothing架构的产品,seqeunce编号需要通过GTM统一分配。集群规模越大、节点数越多、sequence调用越频繁,sequnce对GTM的压力就越大。对于seqeunce的使用一般有如下建议:

  1. 建议业务中不要大量使用sequence,建议不要超过50个
  2. 如果业务允许,建议使用uuid替换sequence
  3. 使用sequence的时候,需要定义cache值不小于100

【序列相关信息查询】

建议定义如下视图进行查询

CREATE OR REPLACE FUNCTION public.dfm_get_seqence_info
(
OUT namespace text, -- 序列的schema
OUT sequencename text, -- 序列名称
OUT min_value bigint, -- 序列最小值
OUT max_value bigint, -- 序列最大值
OUT start_value bigint, -- 起始值
OUT increment_by bigint, -- 增加步长
OUT cache_value bigint, -- cache值
OUT is_cycled boolean -- 是否可以循环使用
)
RETURNS SETOF record
LANGUAGE plpgsql
NOT FENCED NOT SHIPPABLE
AS $function$
DECLARE
rowObject record;
rowDetail record;
queryObjectStr text;
queryDetailStr text;
BEGIN
--Get all the node names
queryObjectStr := 'SELECT c.oid, relname, n.nspname FROM pg_class c INNER JOIN pg_namespace n on c.relnamespace = n.oid WHERE c.relkind = ''S''';
FOR rowObject IN EXECUTE(queryObjectStr) LOOP
queryDetailStr := 'SELECT start_value, increment_by, max_value, min_value, cache_value, is_cycled FROM ' || quote_ident(rowObject.nspname) || '.' || quote_ident(rowObject.relname);
FOR rowDetail IN EXECUTE(queryDetailStr) LOOP
namespace = rowObject.nspname;
sequencename = rowObject.relname;
start_value = rowDetail.start_value;
increment_by = rowDetail.increment_by;
max_value = rowDetail.max_value;
min_value = rowDetail.min_value;
cache_value = rowDetail.cache_value;
is_cycled = rowDetail.is_cycled;
RETURN next;
END LOOP;
END LOOP;
RETURN;
END; $function$
; CREATE VIEW public.dfm_get_seqence_info AS SELECT * FROM public.dfm_get_seqence_info();

示例

postgres=# CREATE SEQUENCE public.test_seq;
CREATE SEQUENCE
Time: 13.917 ms
postgres=# CREATE TABLE public.test_serial(a bigserial, b int) DISTRIBUTE BY ROUNDROBIN;
NOTICE: CREATE TABLE will create implicit sequence "test_serial_a_seq" for serial column "test_serial.a"
SQLSTATE: 00000
LOCATION: CreateSeqOwnedByTable, parse_utilcmd.cpp:144
CREATE TABLE
Time: 16.572 ms
postgres=# CREATE SEQUENCE public.test_seq_1;
CREATE SEQUENCE
Time: 13.412 ms
postgres=# CREATE TABLE public.test_serial_default(a bigint default nextval('public.test_seq_1'::regclass), b int) DISTRIBUTE BY ROUNDROBIN;
CREATE TABLE
Time: 12.006 ms
postgres=# SELECT * FROM public.dfm_get_seqence_info;
namespace | sequencename | min_value | max_value | start_value | increment_by | cache_value | is_cycled
-----------+-------------------+-----------+---------------------+-------------+--------------+-------------+-----------
public | test_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f
public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f
public | test_seq_1 | 1 | 9223372036854775807 | 1 | 1 | 1 | f
(3 rows)

【序列和表的bind关系查询】

查询sequence和表的bind关系,主要场景有两个

  1. 表的字段类型为bigserial或者serial类型,内置生成一个序列
  2. 表的字段的默认值为序列的序列号

这两个场景在上述里面都有case

postgres=# SELECT
postgres-# pg_get_userbyid(c1.relowner) AS seqowner, -- sequence的用户
postgres-# n1.nspname AS seqschema, -- sequence的schema
postgres-# c1.relname AS seqname, -- -- sequence的名称
postgres-# (pg_sequence_parameters(c1.oid)).minimum_value AS minvalue, -- sequence的最小值
postgres-# (pg_sequence_parameters(c1.oid)).maximum_value AS maxvalue, -- sequence的最大值
postgres-# (pg_sequence_parameters(c1.oid)).increment AS incrementby, -- sequence的步长
postgres-# pg_get_userbyid(c.relowner) AS tableowner, -- 关联的表的owner
postgres-# n.nspname AS tableschema, -- 关联的表的schema
postgres-# c.relname AS tablename,-- 关联的表的名称
postgres-# a.attname, -- -- 关联的表的列的名称
postgres-# d.adsrc as defaultexpression -- 关联的sequence的表达式
postgres-# FROM pg_catalog.pg_class c
postgres-# INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
postgres-# INNER JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
postgres-# INNER JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum
postgres-# INNER JOIN pg_catalog.pg_depend p ON p.objid = d.oid
postgres-# INNER JOIN pg_catalog.pg_class c1 ON c1.oid = p.refobjid
postgres-# INNER JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace
postgres-# WHERE c.relkind = 'r'::"char" AND c.oid > 16384
postgres-# AND n.nspname not in ('pg_toast', 'cstore', 'pg_catalog')
postgres-# AND a.attnum > 0
postgres-# AND p.classid='pg_catalog.pg_attrdef'::regclass
postgres-# AND refclassid = 'pg_catalog.pg_class'::regclass
postgres-# AND p.refobjsubid = 0
postgres-# AND c1.relkind = 'S'::"char"
postgres-# ;
seqowner | seqschema | seqname | minvalue | maxvalue | incrementby | tableowner | tableschema | tablename | attname | defaultexpression
-----------+-----------+-------------------+----------+---------------------+-------------+------------+-------------+---------------------+---------+----------------------------------------
j00565968 | public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial | a | nextval('test_serial_a_seq'::regclass)
j00565968 | public | test_seq_1 | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial_default | a | nextval('test_seq_1'::regclass)
(2 rows)

【替换方案】

实际业务中使用sequence一般有两个场景

  • 保证表数据均匀分布。这种场景可以把sequence字段替换为uuid
postgres=# DROP TABLE public.test_serial;
DROP TABLE
Time: 19.871 ms
postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int) DISTRIBUTE BY HASH(a);
CREATE TABLE
Time: 19.245 ms

或者使用roundrobin分布替换,然后删除sequence相关列

postgres=# ALTER TABLE public.test_serial  DISTRIBUTE BY ROUNDROBIN;
ALTER TABLE
Time: 218.796 ms
postgres=# ALTER TABLE public.test_serial DROP COLUMN a;
ALTER TABLE
Time: 9.509 ms
  • 保证字段数据的唯一性。这种场景可以使用uuid()+主键的方式实现
postgres=# DROP TABLE public.test_serial;
DROP TABLE
Time: 18.786 ms
postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int, primary key(a)) DISTRIBUTE BY HASH(a);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_serial_pkey" for table "test_serial"
CREATE TABLE

注:理论上一个集群内的uuid不会重复,但还是建议表上增加主键约束

点击关注,第一时间了解华为云新鲜技术~

教你识别一些sequence的相关问题的更多相关文章

  1. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  2. 【转】【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    原文地址:http://www.cnblogs.com/baiboy/p/orc3.html 阅读目录 目录 RAC 工作原理和相关组件 ClusterWare 架构 RAC 软件结构 集群注册(OC ...

  3. 使用idea插件识别log文件的相关设置

    最近要读一些spring boot项目产生的log文件,众所周知,idea拥有强大的插件系统.当我打开log文件时,idea自动帮我推荐了ideolog这个插件. 但是当我安装好之后发现系统并不能完全 ...

  4. Python 教你识别淘宝刷单,买到称心如意的商品

    发际线堪忧的小 Q,为了守住头发最后的尊严,深入分析了几十款防脱洗发水的评价,最后综合选了一款他认为最完美的防脱洗发水. 一星期后,他没察觉到任何变化. 一个月后,他用卷尺量了量,发际线竟然后退了 0 ...

  5. Docker网络,手把手教你如何实现容器网络相关知识

    Docker网络 理解Docker0 清空所有环境 测试 三个网络 #问题:docker 是如何处理容器网络访问的? [root@hsStudy /]# docker run -d -P --name ...

  6. Kali Linux渗透测试实战 2.2 操作系统指纹识别

    目录 2.2 操作系统指纹识别 2.2.1 Banner抓取 2.2.2 TCP 和 ICMP 常规指纹识别技术 TCP数据报格式 ICMP首部格式 TTL与TCP窗口大小 FIN探测 BOGUS f ...

  7. 国内外从事CV相关的企业

    提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...

  8. 国内外从事CV相关的企业[转]

    提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005 经常碰到朋友问我国内从事计算机视觉(CV)领域的公司的发展情况,产品情况,甚至找工作等问题,这里,我给出自己收集 ...

  9. C# 30分钟完成百度人脸识别——进阶篇(文末附源码)

    距离上次入门篇时隔两个月才出这进阶篇,小编惭愧,对不住关注我的卡哇伊的小伙伴们,为此小编用这篇博来谢罪. 前面的准备工作我就不说了,注册百度账号api,创建web网站项目,引入动态链接库引入. 不了解 ...

随机推荐

  1. 硬件安全学习–RFID / Hardware security learning – RFID

    RFID基础知识 RFID是什么? RFID代表近距离通讯(Radio Frequency Identification). ------------------------------------- ...

  2. 显式锁之ReentrantLock实现

    下图是Lock接口清单,定义了一些抽象的锁操作.Java本身提供了内部锁机制,那么还需要显示Lock,何用?与内部加锁机制不同,Lock提供了无条件.可轮询.定时.可中断的锁获取操作:所有加锁和解锁的 ...

  3. Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼

    Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...

  4. Vue 源码解读(6)—— 实例方法

    前言 上一篇文章 Vue 源码解读(5)-- 全局 API 详细介绍了 Vue 的各个全局 API 的实现原理,本篇文章将会详细介绍各个实例方法的实现原理. 目标 深入理解以下实例方法的实现原理. v ...

  5. jmeter变量嵌套:__V

    问题复现 ${name_${n}} 下面没有获取到结果 解决方案 __V是用于执行变量名表达式 ${__V(name_${n})} 获取到结果

  6. RFC2544吞吐量测试详细步骤-信而泰Renix软件操作演示

    关键词:RFC1242:RFC2544:吞吐量:吞吐率. 吞吐量概述:吞吐量即吞吐率,这个词首先在RFC1242中被提出,是评估网络设备性能的首要指标,其定义是在设备没有丢帧的情况下的最大的转发速率, ...

  7. 自助BI工具:Tableau和Smartbi的对比(上)

    商业智能(BI)和分析平台长期以来一直是商业的重要组成部分,但由于自助BI工具的兴起,在数据科学家和数据库管理员的支持下,分析的责任已经从IT转移到了商业分析师身上. 因此,BI已经从生成月度报告的记 ...

  8. 【C#反射】动态创建类型实例

    转载自:https://www.cnblogs.com/dytes/archive/2012/06/29/2569488.html .NET中除了构造函数外,还有多种方式可以创建类型的实例.下面总结了 ...

  9. C#中的泛型 / 泛型类 / 数组、ArrayList和List三者的区别

    在C#中数组,ArrayList,List都能够存储一组对象,那么这三者到底有什么样的区别呢. 数组 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. ...

  10. String类型转int类型方法

    System.out.println( "Integer.parseInt(\"5\") =" + Integer.parseInt("5" ...