PostgreSQL常用操作(持续更新)

6 篇文章 0 订阅
3 篇文章 0 订阅


PostgreSQL 13.1 手册

一、 管理操作

1.数据库对象Size查询
名称返回类型描述
pg_total_relation_size(regclass)bigint指定表OID或表名使用的总磁盘空间,包括所有索引和TOAST数据。
pg_table_size(regclass)bigint指定表OID或表名使用的磁盘空间,除去索引(但是包含TOAST,自由空间映射和可视映射)
pg_indexes_size(regclass)bigint关联指定表OID或表名的表索引的使用总磁盘空间
pg_database_size(name)bigint指定名称的数据库使用的磁盘空间
pg_size_pretty(bigint)text把字节计算的大小转换成一个人类易读的大小(使用KB 、MB 、GB 、TB)
2.恢释放磁盘空间

VACUUM regclass; --释放具体的表(不会给操作系统,不会减少磁盘使用量)
VACUUM FULL regclass;–立即释放磁盘空间给操作系统(可能锁表)
在这里插入图片描述

3.数据库锁表
  • 查找所有活动的被锁的表
select pid, state, usename, query, query_start
from pg_stat_activity
where pid in (
select pid from pg_locks l
join pg_class t on l.relation = t.oid
and t.relkind = 'r');
  • 查找锁表的pid
select pid from pg_locks l join pg_class t on l.relation = t.oid where t.relkind = 'r' and t.relname = 'lockedtable';
  • 解锁
SELECT pg_cancel_backend(pid);
4.查询所有表字段信息
SELECT
    c.relname 表名称,
    a.attname AS 字段名称,
    col_description(a.attrelid,a.attnum) AS 注释,
    format_type ( a.atttypid, a.atttypmod ) AS 类型,
    CASE WHEN a.attnotnull='f' THEN '否' ELSE '是' END AS 是否必填,
    a.attnum 序号
FROM
    pg_class c
		left join pg_attribute a on a.attrelid = c.oid 
WHERE
    a.attnum > 0
    ORDER BY c.relname,a.attnum;

5.根据主键名或约束名查询所在的表
SELECT conname AS constraint_name, pg_get_constraintdef(con.oid) AS constraint_definition, relname AS table_name
FROM pg_constraint con
JOIN pg_class cls ON (cls.oid = con.conrelid AND cls.relkind = 'r') -- 只选择关系类型为 "r"(表)的对象
WHERE conname = '<constraint_name>';

二、常用函数

1.字符串函数
  • 多行转一行 string_agg(text,text)
    查询字段只能是字符型 结果用“,”隔开
SELECT a.id, a.db_name, string_agg(b.username, ',') FROM tbl_company a, tbl_user b WHERE a.id = b.company_id group by a.id;
  • 一行拆分为多行 regexp_split_to_table(string, pattern)
  • 查找子字符串的位置 position(substring in string)
    position(‘om’ in ‘Thomas’) ——> 3
  • 连接字符串,忽略null concat_ws(pattern,string1,string2,......)
2.数据填充函数 generate_series(…)

例:

SELECT T::DATE 时间轴  FROM generate_series ( '2022-10-25' :: DATE, '2022-11-03' :: DATE, '1 days' ) AS T

2.序列生成函数 generate_series(.....)

3.加密|解密函数
  • AES加密
    encrypt(‘’::bytea, key,‘aes’)::varchar
  • AES解密
    convert_from(decrypt(‘’::bytea,key,‘aes’),‘SQL_ASCII’)

三、 常用查询

1.树形查询
WITH RECURSIVE a AS ( 
	select xx,1 as level from table1 where id = '123' 
	union all 
	select d.xx,a.level +1 from table1 d join a on d.pid = a.id
) select * from a
2.PARTITION 数据分组编号
select row_number() OVER(PARTITION by [分区字段] order by [排序字段]) 序号 from 表名

–示例,对成绩单中每个学生的成绩进行分组排序
select row_number() OVER(PARTITION by studentID order by core) 序号,name,core from schoolreport;

3.判断内容是否为数字
select 'Service' ~ '^[0-9\.]+$'

true-为数字

四、 表管理

1.创建带条件的唯一索引

注意:where 条件的字段是约束的一部分

create unique index UN_tablename on tablename(name, phone,enable) where enable = '0';

五、调试

  • 存储过程/函数中打印
raise notice '**%**',param; --param为占位符所在的变量

六 、调优

使用 EXPLAIN ANALYZE ....待分析的SQL…查看执行时间及循环次数
再找出耗时较多的SQL进行修改

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 PostgreSQL 中,有几种不同的时间数据类型,它们之间有一些区别: - `timestamp`:存储日期和时间,带有时区信息。精度可以是毫秒,微秒或纳秒。 - `timestamptz`:与 `timestamp` 类似,但存储的是本地时间,并自动转换为 UTC 时间。 - `date`:存储日期,不包含时间和时区信息。 - `time`:存储时间,不包含日期和时区信息。精度可以是毫秒,微秒或纳秒。 - `interval`:存储时间间隔,可以表示两个时间点之间的差值。 你可以根据你的需要选择适当的时间数据类型。 ### 回答2: 在PostgreSQL中,有几种不同的时间数据类型,包括date、time、timestamp和interval。 1. date: date数据类型用于存储一个日期值,只能表示年、月、日。它没有时区信息,仅包含年、月、日,适用于存储和处理与特定日期有关的数据。 2. time: time数据类型用于存储一个时间值,只能表示时、分、秒。它没有日期和时区信息,适用于存储和处理与时间有关的数据,比如某个事件发生的具体时刻。 3. timestamp: timestamp数据类型用于存储日期和时间,包括年、月、日、时、分、秒。它可以包含时区信息,可以精确到微秒级别。timestamp适用于存储和处理时间戳记录,比如记录数据创建或修改的时间。 4. interval: interval数据类型用于存储两个时间戳之间的时间间隔。它可以表示年、月、周、天、小时、分钟、秒等时间单位之间的差异。interval适用于处理时间差异的计算和比较,例如计算事件持续的时间或计算两个事件之间的间隔。 这些不同的时间数据类型适用于不同的场景和需求。根据具体的应用需求,选择合适的时间数据类型可以确保存储和处理时间相关数据时精确、高效和准确。 ### 回答3: 在PostgreSQL中,有几种不同的时间数据类型,每种类型都有其自己的特点和用途。 1. TIMESTAMP:这是最常用的时间数据类型之一。它存储了日期和时间,并且可以精确到纳秒。TIMESTAMP类型可以用来表示任何日期和时间,包括过去、当前和未来。它适用于大多数时间操作和计算。 2. DATE:DATE类型仅存储日期,不包含时间信息。它是以年、月、日的形式表示的,适用于仅需要日期而不需要时间的场景。 DATE类型适合于存储生日、合同签署日期等。 3. TIME:TIME类型仅存储时间,不包含日期信息。它以小时、分钟、秒和可选的微秒表示。 TIME类型适合于存储只需时间信息而不需要日期的场景,比如记录事件发生的具体时间。 4. INTERVAL:INTERVAL类型表示时间的间隔或持续时间。它可以表示一段时间,例如几小时、几天、几年。 INTERVAL类型常用于计算时间差、运算和比较。 除了上述常见的时间数据类型,PostgreSQL还提供了其他一些特定的时间类型,如TIMETZ、TIMESTAMPZ、TIME WITH TIME ZONE等。这些类型与时区相关,可以存储和计算带有时区信息的时间。 在选择时间数据类型时,应根据具体应用场景和需求来选择合适的类型。如果需要同时存储日期和时间,使用TIMESTAMP类型;如果只需要日期或时间,选择DATE或TIME类型;如果需要计算时间差或持续时间,使用INTERVAL类型。另外,如果需要带有时区信息的时间,可以使用相关的时区类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值