Alert : PostgreSQL inline Subquery or View 包含volatile functions 阻止谓词推进(Predicate PushDown)

《Oracle、Oceanbase、Kingbase、GaussDB、达梦数据库比较系列(二十七):子查询中的函数投影裁剪》 测试在inline subquery中包含函数列投影时裁剪或叫SLP(select list pruning) ,如果函数的Volate属性是volatile的影响,函数的不稳定性除了影响投影还有join 的view包含该函数时,影响谓词条件的推入等,最近在highgoDB遇到了一个SQL性能问题,其实所有pg系数据库如gaussdb,opengauss,kingbase等都存在。下面演示一下这个问题。

,

Oracle、Oceanbase、Kingbase、GaussDB、达梦数据库比较系列(二十七):子查询中的函数投影裁剪

在有些开发习惯中,如查询分页或统计查询,有些开发是基于明细的查询而外层直接加1层汇聚查询,如select count(*) from (select ….), 但子查询中可能有一些函数或主查询根本不需要的列, 在oracle中的查询转换中如select-project-join或select list pruning, 或VIEW merge SPJ,CVM 都是为了不影响SQL结果一致性,而优化低效的SQL. 但是从oracle迁移到其它数据库中,因为CBO的差异,导致SQL性能大量衰减,需要手动改写SQL, 最近从oracle迁移到pg系国产库,发现一个view中使用了function, 而外部查询根本不关系该列值,就是一个无效的查询列,无意义的函数调用, 需要注意。

,

Alert: not null Defining Integrity Constraints or Check( xx is not null) Constraint 性能差异

最近在迁移oracle到一个基于PostgreSQL系国产数据库时,发现存在一个问题,为了增加数据迁移顺利,把在oracle中在表列上定义的not null约束,全部更改了外部的CHECK not null 约束,这样就可以在建表、导数完成后再增加check约束。虽然这种功能上几乎一样,但是在性能上还是有一些区别,这篇简单的记录。

Migrate Oracle to PostgreSQL (系): start with connect by prior order siblings by

我和我的团队一直在做oracle到国产新创的工程,在oracle数据库中如加载菜单或上下关系的记录时,使用一种start with connect by prior的关键字提供分层查询和遍历方法, 但是对于基于Postgresql的数据库中需要改写,可以借用通用表表达式(CTE)的方法with RECURSIVE(), 同时对于排序时ORDER SIBLINGS BY可以对分层查询分组排序。这里简单的演示。

,

Migrate Oracle to PostgreSQL (系): AS Table OF

在 PostgreSQL 中,PL/pgSQL 不直接支持 TABLE OF 类型,这是 Oracle PL/SQL 中的一种集合类型。不过,PostgreSQL 提供了其他方式来实现类似的功能,例如使用数组、复合类型(composite types)和表值函数(table-valued functions)。最近在一个生产数据库oracle迁移到postgresql替换过程中,遇到了拆分由逗号分隔的字符串返回table的需求

,

Oracle国产化改造迁移时的问题: Varchar data type中的 invalid 字符集字符编码

最近在从orale迁移到Postgresql系的数据库时,迁移工具(Java JDBC)几张表迁移失败,源库和目标都是GBK字符集,但在迁移过程中提示ERROR: character with byte sequence 0xe4 0xb8 0xad in encoding “UTf8” has no equivalent in encoding “GBK”,说明在GBK数据库中有部分列数据的值是UTF8编码,这种以GBK字符集查询会乱码,验证在源库入库时错误,迁移时需要注意。

, ,

Oracle国产化改造迁移时的问题: Date data type中的 invalid date 0000-00-00(zero year )

我和我的团队近2年一直在做迁移oracle到国产库的项目,数据迁移相对于PLSQL对象兼容改写更加容易,一般迁移工具做好源和目标的data type映射基本就可以,但是有一些情况,如《Oracle国产化改造迁移时的问题: Number data type中的 invalid number》记录的那样无效number,有些数据在oracle中可以存储,但迁移到目标库时可能无法存储,最近我们在迁移一套oracle到postgresql系的国产库时,在date数据类型的列出现了无效日期数据0000年。

,

Migrate Oracle to PostgreSQL (系): User and Schema

当Oracle DBA开始接触PostgreSQL系数据库时,总是会对Schema和USER产生一些混淆。在 Oracle 中,Schema和USER是一对一的关系,Schema和USER之间没有真正的区别,在一些基于PG国产数据库可能在创建用户时递归创建了同名schema。在 PostgreSQL 中,情况有所不同:用户创建的所有对象都是在特定Schema(或命名空间)中创建的。其他用户可能有权也可能无权使用此对象,甚至有权在特定schema中创建新对象。与 Oracle 相比,PG Schema概念又有点像Oracle Tablespace。最近一套数据库在迁移PG系国产库时,遇到了synonym的问题,刚好再总结一下schema与user.

, , ,

体验一下GaussDB集中式(本地部署)的Flashback/TIMECAPSULE 闪回功能

Oracle 提供了丰富的闪回功能,帮助用户在数据丢失或错误操作后快速恢复数据。最近,我们注意到 GaussDB 也支持部分闪回功能。在这里,我将记录一下在 GaussDB 中使用 drop、truncate 的闪回功能,以及闪回表和闪回查询的体验。或错误操作后快速恢复数据。

, , ,

聊聊PostgreSQL Visibility Map File?

在上一篇笔记中pg buffer中会记录除了数据外,还有XXXX_vm的Visibility Map, PostgreSQL 中的可见性映射在Vacuum期间起着至关重要的作用。它跟踪哪些表块仅包含可见元组,从而避免在vacuum操作期间扫描这些块。这显著优化了 I/O 操作,因为只处理可能包含死元组的块。同时对于Index only scan 时可见性映射文件也是决定是否需要回表的判断。

如何查看PostgreSQL中的buffer,并清空buffer cache(shared_buffer)

在 PostgreSQL 16 之前原生版本中,除了重新启动实例外,没有其他方法可以清除缓冲区缓存。没有像 Oracle 中 FLUSH BUFFER_CACHE 这样直接用于清空数据库缓存的命令。PostgreSQL 的缓存管理主要依赖于操作系统和自身的共享内存 ,在近期发布的 PostgreSQL 17 中pg_buffercache_evict可以实现,当然,清除缓冲区缓存并不是您通常想要在生产环境中执行的操作,但这对于教育或调试目的来说非常方便

, ,

如何恢复PostgreSQL误删除的表数据?

今天朋友问如果truncate table如何在postgresql中恢复?另外还有drop , delete删除数据类操作,除了使用常规备份恢复,如果在oracle恢复有flashback query, recyclebin, 或在数据文件中的block补覆盖前抽取如基于rowid抽或DUL类工具扫描datafile , 在PostgreSQL开源软件中似乎只有备份恢复,那有没有其他手段呢?

, ,

如何修复损坏的数据库 PostgreSQL?

在PostgreSQL有可能因为硬件(磁盘控制器或某些内存)或bug等未知原因,导致数据文件的page corrupted损坏,只限于少数页面,有没有办法从部分损坏的 Postgres DB 中恢复数据?
psql: FATAL: could not read block 0 in file “base/xxxx/xxxx”: read only 0 of 8192 bytes.

ERROR: invalid page in block xxxxxx of relation base/xxxx/xxxx

,

在PostgreSQL中主键使用 UUIDs vs. bigserial

在关系型数据库中做为主键使用UUID还是整数序列是一直有人讨论的话题,在oracle、Postgresq、MySQL、Sql Server(GUID) 都有类似的对象, 那应该使用整数( serials, sequences)还是 UUID 作为主键?在大数据集时性能上存在一些差异,同时还有一些安全因素。

,

坑: openGauss/GaussDB CM管理文件系统使用率超过85% 进入事务只读

最近,一位使用 openGauss 数据库的客户遇到了一个突发情况:应用程序突然无法处理事务,并在应用日志中报错: ERROR: cannot execute CREATE TABLE in a read-only transaction, 经过分析,发现这是由于数据库的 CM(Cluster Manager)集群管理软件触发了某种保护机制所致。这种情况令人费解,在 Oracle 数据库中即使文件存储空间耗尽也仅在alert log中打印错误信息,或有些OS资源使用高在RAC时会在LMHB日志中提示, 而不是直接将业务置为只读模式,从而广泛影响应用。

,

Migrate oracle to openGauss/oceanbase/达梦/kingbase: md5 function

在十年前简单测试过oracle 9i 的加密解密用法之dbms_obfuscation_toolkit(二),其中有md5单向加密, 最近在oracle迁移到opengauss项目中用到了md5, 这里简单记录替换方案,在pg或og中直接就有md5 function. 在mysql及Mysql系的产品和ocenabse, 达梦一样存在该函数md5。

openGauss ERROR: current user does not have privilege to role XXX 解决方案

在openGauss 数据库中如果存在多个用户如A和B, 希望B用户可以在用户A的同名schema下创建table对象,需要授权给用户B,在oracle中如create any table的系统权限或者是user Proxy 高级用法,在我之前的笔记Oracle 23c 几个开发相关新特性中,在oracle 23c 才引入grant xx ON SCHEMA xx to xx的语法,就是这样的功能在openGauss中有不同的用法。今天在一个项目遇到了这个问题,下面演示一下这个情况。

Migrate oracle to openGauss: dbms_crypto.encrypt /decrypt functions

在oracle迁移opengauss数据库时,可能会遇到在oracle数据库中使用dbms_crypto 加密的数据 ,在目标数据库opengauss有时也不需要完全等同,仅实现加密功能即可,需要我们改写对应的存储过程,或自定义包装function, 也需要合理规划数据迁移的一些方法,比如需要先解密,在目标库重新加密,尤其是加密方法不同,避免迁移源加密数据到目标库后无法解密,当然如果应用层能实现加密功能那是极好的

Migrate oracle to openGauss: cast_to_raw/cast_to_varchar2 & base64_encode/base64_decode functions

我和我们的团队最近在迁移oracle到openGauss(postgresql)时现在有一些存储过程中使用了加密函数,其中有一些涉及到编码的package 如utl_i18、utl_raw、utl_encode,对一些明文数值进行raw或base64编码,这里记录一下oracle到opengauss后对应的函数实现, 基本也适用于postgresql,下一篇会记录加密函数。

,

Oracle迁移openGauss/PostgreSQL注意事项:java代码中的setDouble、setFloat会导致全表扫描

近几年XC的快速推荐,我和我的团队一直在努力做从 Oracle 迁移到国产数据库的工作, 其中国产数据库像基于postgreSQL的kingbase/highgo等,还是opengauss等下游发行版产品,因为得于pg的优化器或对oracle的兼容性,在传统企业也广泛应用,企业应用程序像java开发的颇多,而java代码中对于数字的变量赋值的数据类型有多种,在postgresql/openGauss系的数据库与oracle存在差异,可能会导致PostgreSQL JDBC 驱动程序不像 Oracle JDBC 驱动程序那样转换该数据类型。数据类型不匹配的结果最终在 PostgreSQL系中是全表扫描,而不像oracle中的使用索引,导致SQL性能变差,下面做个演示

,