Oracle到PostgreSQL数据库的语法迁移手册(建议收藏)

AI摘要

本文详细介绍了如何从Oracle数据库迁移到PostgreSQL,涵盖了虚拟表、字符串和日期函数、SQL语句、操作符和函数参数的强类型限制,以及特定的转换规则,为迁移人员提供实用的SQL迁移参考。

​
Copyright © 2024 PawSQL

概述

异构数据库的迁移(譬如从Oracle迁移到PostgreSQL)工作主要包括三个方面,

  • 数据库对象的迁移,包括库、模式、表、索引、视图、触发器、存储过程等等;
  • 数据内容的迁移,主要指的是数据表中的数据;
  • 数据应用的迁移,主要指的是应用中SQL语句的迁移。

目前对于数据库对象以及数据内容的迁移有很多成熟的工具,而对于应用迁移的工具却很少能够见到。原因是因为DML语句比DDL复杂的多,不同的数据库语法差异也比较大。目前市场上的迁移工具大多使用正则表达式来解析SQL语句,而DML语句的复杂性导致此类工具的解析成功率较低,难以作为一个成熟地商业产品进行推广。

PawSQL团队开发的DML语法转换工具Ora2pg,通过PawSQL强大的SQLParser,能够解析几乎所有的Oracle语法,并将其转换为对应的PostgreSQL语法,支持数据库应用的平滑迁移。

本手册介绍了Oracle和PostgreSQL的语法区别,以及转换映射关系,可以作为迁移人员的SQL迁移参考手册。

本手册描述了PawSQL Ora2pg内部的实现逻辑,PawSQL Ora2pg能够帮助SQL迁移人员自动识别不兼容的语法,并完成语法转换。

虚拟表(dual)

虚拟表dual

Oracle获取一个常量需要通过一个dual,PostgreSQL不需要

编号OraclePostgreSQL
1select 2 from dualselect 2

虚拟列

虚拟列rownum

对于查询返回的每行数据,rownum虚拟列会返回一个数字,第一行的ROWNUM为1,第二行为2,以此类推。

  • rownum在select列表中时重写为row_number() over ()
  • rownum在where子句中时重写为limit… offset…
    | 编号 | Oracle | PostgreSQL |
    | ---- | ------------------------------------------------------------ | ------------------------------------------------------------ |
    | 1 | select rownum from customer; | select row_number() over () as rownum from customer |
    | 2 | select tableoid from customer where rownum < 10 and rownum >= 2; | select tableoid from customer limit 9 OFFSET 2 |
    | 3 | select c_name from customer where rownum < 10 and c_phone = ‘111’; | select customer.c_name from customer where customer.c_phone = ‘111’ limit 9 |
    | 4 | select * from customer where rownum between 1 and 10; | select tableoid from customer limit 10 OFFSET 0 |

虚拟列rowid

Oracle中的rowid虚拟列返回特定行的具体地址,在PostgreSQL中重写为tableoid || '#' || ctid

编号OraclePostgreSQL
1select rowid, c.* from customer c;select tableoid || ‘#’ || ctid, c.* from customer as c

字符串函数

nvl(col, value)

Oracle中的nvl(col, value)用来设置默认值,col为空就设置为value;

在PostgreSQL中重写为coalesce

编号OraclePostgreSQL
1select nvl(c_phone, 1) from customer;select coalesce(customer.c_phone, ‘1’) from customer

nvl2(col, v1, v2)

nvl2对col的null值进行处理,如果col为null,则返回v1, 否则返回v2;

postgre中没有类似的函数,可以重写为case… when…

编号OraclePostgreSQL
1select nvl2(c_phone, 1, 2) from customer;select case when c_phone is null then 1 else 2 end from customer

decode(arg1, arg2, arg3, arg4)

Oracle中的decode(arg1, arg2, arg3, arg4)函数, 表示当 arg1 等于 arg2 时,取 arg3,否则取 arg4。

postgre中没有类似的函数,可以重写为case… when…

编号OraclePostgreSQL
1select decode(c_phone,‘110’, 1 , 2) from customer;select case when c_phone = ‘110’ then 1 else 2 end from customer
2select decode(c_phone,null, 1 , 2) from customer;select case when c_phone is null then 1 else 2 end from customer

substr(str, int, int)

Oracle中的substr用来取一个字符串的子串,PostgreSQL有同名的函数实现类似功能。不同的是Oracle中,第二、第三个参数可以为负数,代表从后面进行计数,PostgreSQL不允许其为负数,需对其进行转换。Oracle中是以0开始计数,PostgreSQL以1开始计数(需确认)。

编号OraclePostgreSQL
1select substr(c_phone, 1 , -2 ) from customer;select substr(c_phone, 1, length(c_phone) - 2) from customer
2select substr(c_phone, -3 , 1 ) from customer;select substr(c_phone, length(c_phone) - 3, 1) from customer

instr(str1, str2)

Oracle中的instr用来取一个字符串的子串位置,当其只有两个参数时,表示子串的第一次出现的位置,和PostgreSQL中对应的函数为strpos。当其有多个参数时,无对应函数。

编号OraclePostgreSQL
1select instr(‘123’, ‘23’)select strpos(‘123’, ‘23’)

replace(srcstr, oldsub[, newsub ])

在Oracle中,replace()函数用于替换字符串, replace(srcstr, oldsub[, newsub ] ),和PostgreSQL中的replace函数用法基本一致。只是需要注意在Oracle中无第三个参数时,代表删除此字符,在PostgreSQL可将第三个参数设置为’'。

编号OraclePostgreSQL
1select replace(‘123’,‘1’);select replace(‘123’,‘1’,‘’);

stragg(str,[str])

Oracle里的stragg函数实现在分组内对列值的拼接,它和listagg类似,但是不可以指定拼接的顺序。在PostgreSQL中,可以使用string_agg函数来替换。其第二个参数可选,默认值为’',在PostgreSQL需补充第二个参数。

编号OraclePostgreSQL
1select listagg(c_name,‘,’) as name from customer group by c_phoneselect string_agg(c_name,‘,’) as name from customer group by c_phone
2select listagg(c_name) as name from customer group by c_phoneselect listagg(c_name,‘’) as name from customer group by c_phone

listagg(str, [str])

Oracle里的listagg函数实现对列值的拼接,它可以在分组内以指定顺序对非分组列进行拼接。在PostgreSQL中,可以使用string_agg函数来实现,需注意语法方面也有区别. 另外,其第二个参数可选,默认值为’',在PostgreSQL需补充第二个参数。

  • 当没有group by子句时,可以使用over(partiton by… order by…)进行替换

  • 当指定group by子句时,它的重写算法比较复杂

    • 如果需要保持拼接的顺序,需要通过子查询来实现(见编号2)
    • 如果不需要保持拼接顺序,可以把它转化为简单的聚集函数(编号3)
编号OraclePostgreSQL
1select listagg(c_name,‘,’) within group(order by c_name) over (partition by c_phone) as name from customer;sselect string_agg(customer.c_name, ‘,’) over (partition by customer.c_phone order by c_custkey) as name from customer
2select listagg(c_name,‘,’) within group(order by c_name) as name from customer group by c_phone;select max(paw_dt.name) as name from (select string_agg(customer.c_name, ‘,’) over (partition by customer.c_phone order by c_name) as name,
customer.c_phone
from customer) as paw_dt
group by c_phone
3select listagg(c_name,‘,’) within group(order by c_name) as name from customer group by c_phoneselect string_agg(c_name,‘,’) as name from customer group by c_phone

日期函数

sysdate/systimestamp

Oracle中的sysdate()/sysdate返回系统当前时间(日期+时分秒),在PostgreSQL中对应now()或是current_timestamp(日期+时分秒+毫秒)。

Oracle中的systimestamp返回系统当前时间戳(日期+时分秒+毫秒),在PostgreSQL中对应now()或是current_timestamp。

编号OraclePostgreSQL
1select sysdateselect current_timestamp
2select sysdate()select now()
3select systimestampselect current_timestamp

to_date(str, fmt)

Oracle中的to_date返回的是时间类型,而在PostgreSQL中to_date是日期类型,所以Oracle中的to_date在PostgreSQL中应该对应to_timestamp

编号OraclePostgreSQL
1select to_date( endTime ,‘yyyy-mm-dd hh24:mi:ss’) from tselect to_timestamp( endTime ,‘yyyy-mm-dd hh24:mi:ss’) from t

trunc(arg1, [arg2])

在Oracle中trunc函数有两种用法

  • 第一种是对数字进行截取, trunc(num,[int]); 是去掉数字num小数位以后的部分,并且不进行四舍五入。这种用法和在PostgreSQL的trunc用法一致,不需要转换

  • trunc函数的第二种用法是对日期进行提取,trunc(date,[fmt])。这种用法在PostgreSQL对应的函数是date_trunc(fmt, date),需注意在PostgreSQL中fmt是第一个参数,且不可省略。

编号OraclePostgreSQL
1select trunc( 111.23,2)select trunc( 111.23,2)
2select trunc(sysdate,‘year’)select date_trunc(‘year’, current_timestamp)
3select trunc(sysdate)select date_trunc(‘dd’, current_timestamp)

add_months(date, int)

Oracle中的add_months 函数主要是对日期函数进行操作,对日期按月增加。在PostgreSQL没有对应的函数,需将其转化为基于日期和interval的运算。

编号OraclePostgreSQL
1select add_months(sysdate, 2)select current_timestamp + 2 * interval ‘1 month’

last_day(date)

Oracle中的last_day返回指定日期所在月份的最后一天; 在PostgreSQL没有对应的函数,需将其转化为基于日期和interval的运算。

编号OraclePostgreSQL
1select add_months(sysdate, 2)select cast(date_trunc(‘MONTH’, current_timestamp) + interval ‘1 MONTH - 1 DAY’ as date)

SQL语句

HAVING子句顺序

Oracle允许HAVING在GROUP BY子句之前或之后。在PostgreSQL中,HAVING子句必须出现在GROUP BY子句后面。

编号OraclePostgreSQL
1select c_name from customer having count(*) > 2 group by c_nameselect c_name from customer group by c_name having count(*) > 2

括号中的表名

Oracle中单表引用允许使用括号括起来,PostgreSQL不允许。

编号OraclePostgreSQL
1SELECT * FROM (CUSTOMER);SELECT * FROM CUSTOMER;

UNIQUE关键字

Oracle中允许使用UNIQUE进行去重,在PostgreSQL中迁移为DISTINCT关键字

编号OraclePostgreSQL
1select unique c_phone from customerselect distinct customer.c_phone from customer

MINUS关键字

Oracle中可以使用minus关键字来取两个结果集的差,在PostgreSQL中需迁移为except.

编号OraclePostgreSQL
1select c_custkey from customer minus select o_custkey from ordersselect c_custkey from customer except select o_custkey from orders

FROM关键字

Oracle的delete语句的FROM关键字可以省略,迁移至PostgreSQL需补充上。

编号OraclePostgreSQL
1delete customer where 1=0;delete from customer where 1 = 0

NOLOGGING关键字

Oracle在执行INSERT语句时,可以通过指定NOLOGGING关键字来减少日志记录,提升操作性能。PostgreSQL不支持此关键字。

编号OraclePostgreSQL
1insert into customer nologging select * from customer_bk;insert into customer select * from customer_bk;

AS关键字

INSERT INTO 后面不需要添加as关键字,insert into ... as select... 修改为insert into... select...

编号OraclePostgreSQL
1insert into t as select c1 from t1insert into t select c1 from t1

FROM子查询的别名

Oracle中在不引起歧义的情况下子查询可以不带别名,而在PostgreSQL中,所有的FROM子查询都必须带有别名

编号OraclePostgreSQL
1select * from (select * from CUSTOMER)select * from (select * from CUSTOMER) as foo

UPDATE语句里的字段名

在PostgreSQL中,Update的时候,更新列不允许添加表名前缀。

编号OraclePostgreSQL
1update customer c set c.c_name = ‘xxx’ where c_custkey = 1;update customer set c_name = ‘xxx’ where c_custkey = 1

左(右)外连接

在Oracle中,外连接可以通过在条件上添加(+)来定义, 连接符(+)跟在哪个条件后面就是哪张表被左连。在PostgreSQL中,需将其重写为标准的外连接语法。

编号OraclePostgreSQL
1select * from customer, orders where c_custkey = o_custkey(+)select * from customer left outer join orders on c_custkey = o_custkey
2select * from customer, orders where c_custkey(+) = o_custkey and c_name(+) = o.o_clerk and o_custkey>100select * fromcustomer right outer join orders on (c_custkey = o_custkey and c_name = o_clerk) where o_custkey > 100

CONNECT BY子句

Oracle中,CONNECT BY 用于存在上下级等层级关系的数据表进行递归查询。语法格式: START WITH condition1 CONNECT BY [ NOCYCLE ] condition2。在PostgreSQL通过Recursive Common Table Expression来实现此功能,主要是把START WITH… CONNECT BY Prior拆成两个部分,查询表一致,但条件不一致,用UNION ALL合并.

编号OraclePostgreSQL
1select id from city_branch start with id=1 connect by prior id=parent_id;with RECURSIVE MIG_CTE as (
select id, 1 as level from city_branch where id = 1
union all
select id, level + 1 from city_branch, MIG_CTE where MIG_CTE.id = parent_id)
select * from MIG_CTE
2select t.branch_level, t.id from city_branch c where (c.branch_level = ‘1’ or t.branch_level = ‘2’) and (t.sign = ‘1’ or t.sign = ‘4’ or t.sign = ‘8’) and t.status = ‘1’ start with c.id = 1 connect by c.id = prior c.parent_id order by c.branch_level descwith RECURSIVE MIG_CTE as
(select t.branch_level, t.id, 1 as level from city_branch as cwhere ((((branch_level = ‘1’ or t.branch_level = ‘2’)and ((t.sign = ‘1’ or t.sign = ‘4’) or t.sign = ‘8’)) and t.status = ‘1’) and c.id = 1)
union all
select t.branch_level, t.id, level + 1 from city_branch as c, MIG_CTE where ((((branch_level = ‘1’ or t.branch_level = ‘2’) and ((t.sign = ‘1’ or t.sign = ‘4’) or t.sign = ‘8’)) and t.status = ‘1’) and c.id = MIG_CTE.parent_id))
select * from MIG_CTE order by MIG_CTE.branch_level desc

操作符的强类型限制

Oracle中不同类型进行基于操作符的运算,会自动转化类型,譬如select 1 + '1' from dual。PostgreSQL是强类型,不同类型的运算会提示类型不匹配,执行select 1 + '1'会报错,需要进行显式的类型转换。

涉及的操作符类型包括:

操作符操作符名称
+加法
-减法
/除法
%取余
*乘法
||字符串拼接

数值运算(+,-,*,/,%)

编号OraclePostgreSQL
1select 1 + ‘1’select 1 + 1
2select 1 + charCol from tblselect 1 + cast(charCol as numeric) from tbl
3select ‘1’ - 1select 1- 1
4select 1 * charCol from tblselect 1 * **cast(charCol as numeric) ** from tbl
5select 1 / charCol from tblselect 1 /cast(charCol as numeric) from tbl
6select charCol % 2 from tblselect cast(charCol as numeric) % 2 from tbl

日期计算(+,-)

编号OraclePostgreSQL
1select sysdate - 1select current_timestamp - interval ‘1’ DAY
2select 1 + sysdate()select interval ‘1’ DAY + now()
3select systimestamp +1select current_timestamp + interval ‘1’ DAY
4select systimestamp - 1select current_timestamp - interval ‘1’ DAY

字符串拼接(||)

编号OraclePostgreSQL
1select 1||1select ‘1’||‘1’
2select 1 || c_custkeyselect 1 || cast(c_custkey as text)

函数参数的强类型限制

Oracle中在函数调用时,参数类型进行会自动转化类型,譬如 select substr(123.12,0,2)是合法的,且返回123。PostgreSQL是强类型, 执行select substr(123.12,0,2)会报错,需要进行显式的类型转换。

substr(arg1, arg2, arg3)

编号OraclePostgreSQL
1select substr(1234.1, 0, 4)select substr(‘1234.1’, 1, 4+1)
2select substr(‘1234.1’, 0, ‘2’)select substr(‘1234.1’, 0, 2)

sum(arg)

编号OraclePostgreSQL
1select sum(‘2’)select sum(2)

avg(arg)

编号OraclePostgreSQL
1select avg(‘2’)select avg(2)

round(arg)

编号OraclePostgreSQL
1select round(‘2’)select round(2)

条件判断中的强类型限制

Oracle中在进行条件判断时,左右表达式的类型进行会自动转化,譬如 where c_phone = 110是合法的。PostgreSQL是强类型, 执行where c_phone = 110会报错,需要进行显式的类型转换。

比较运算(=、>、<、>=、<=、<>)

转换原则,优先转换常量类型;当两个都为数据列时,优先转换左边的。

编号OraclePostgreSQL
1select * from customer where c_phone = 110select * from customer where c_phone = ‘110’
2select * from customer where ‘1’ = c_custkeyselect * from customer where 1 = c_custkey
3select * from customer where c_phone = c_custkeyselect * from customer where cast(c_phone as int) = c_custkey

BETWEEN

转换原则,转换 var0 between var1 and var2 中的 var1, var2。

编号OraclePostgreSQL
1select * from customer where c_custkey between ‘100’ and ‘200’;select * from customer where c_custkey between 100 and 200

IN LIST

转换原则,转换List中的变量。

编号OraclePostgreSQL
1select * from customer where c_phone in (110,120);select * from customer where c_phone in (‘110’, ‘120’)

默认参数

Oracle中有部分函数存在默认参数,而在PostgreSQL其参数是必填项。

to_char(unknown)

编号OraclePostgreSQL
1select to_char(c_custkey) from customerselect cast(c_custkey as text) from customer

to_number(str)

编号OraclePostgreSQL
1select to_number(‘100’)select 100
2select to_number(c_phone) from customer;select cast(c_phone as numeric) from customer

PawSQL往期文章精选

从SQL质量管理体系来看SQL审核(3)- SQL开发规范

从SQL质量管理体系来看SQL审核(2)- SQL质量标准

高级SQL优化 | 你真的了解用UNION替换OR吗?

EverSQL向左,PawSQL向右

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括:

PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。

相关推荐

免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了

PawSQL 社区版(Community Edition)面向个人用户和小规模团队,提供永久免费的私域部署方案,可在本地或私有云中快速启动,无需外部依赖,可实现一键化的 SQL 自动优化与性能验证。该版本支持 MySQL、PostgreSQL 数据库,允许每位个人用户每月享有多达 600 次的优化配额,充分满足日常开发测试需求。

PawSQL的博客 1729

SQLE、SQM和PawSQL:深度评测企业级SQL审核平台

SQL审核是SQL代码投入生产的最后一道关卡,选择正确的SQL审核工具对于确保确保SQL代码质量至关重要。本文深度评测市场上主流的SQL审核工具,Yearning、Archery、Bytebase的审核模块、爱可生的SQLE、云和恩墨的SQM等,在审核规则覆盖度和审核结果正确性方面的表现。评测结果表明,即使用MySQL规则集作为测试对象,PawSQL在这次测试中表现也是最佳。

PawSQL的博客 1607

免费 IDEA/DataGrip SQL优化和审核插件 PawSQL Client

PawSQLClient 0.2.1版为JetBrains IDE带来智能SQL优化与执行前审核功能,解决慢查询索引优化、误执行高危UPDATE/DELETE两大痛点。光标定位即生成可直接使用的索引创建语句与改写方案,并提供性能对比;执行前自动拦截高危语句,支持静态分析不阻塞流程。零配置绑定数据源,离线也可结构分析,匿名免登录,结果直达console面板。兼容多数据库与IDE,免费无配额限制,提升开发效率与安全性。

PawSQL的博客 274

【PawSQL for DBeaver,不仅可以一键完成 SQL 优化,还可以在 SQL 执行前自动拦截高危操作】

PawSQL for DBeaver助力高效数据库开发,两大核心功能:一键智能优化SQL,支持索引推荐与执行计划对比;执行前强制审核,自动拦截高危操作。通过简单安装即可在DBeaver中实现从配置到调优、审核的全流程自动化,约两分钟掌握完整流程,显著提升开发安全与效率。#PawSQL #DBeaver #SQL优化 #SQL审核

PawSQL的博客 284

给 DBeaver 请一位 SQL 体检医生:PawSQL Client

很多事故,其实是「执行前没人拦一下」。一次 UPDATE 少个 WHERE、一条全表扫描的 SELECT、一个没索引的 JOIN——等线上告警响了,代价已经付出去了。有没有办法,把这些风险挡在「执行」之前?PawSQL Client 是 DBeaver 的一个插件。装上它,你的 SQL 编辑器里就多了一道执行前审核:你按下「执行」之前,SQL 先交给 PawSQL 做一次静态规则分析,再按风险决定放行还是让你确认。不用离开 DBeaver,不用额外操作——体检就发生在你最熟悉的编辑器的日常操作里。

PawSQL的博客 296

PawSQL 技术月报 | 2026年07月

PawSQL完成重大架构升级,核心优化包括:1. SQL解析器全面重构,底层架构统一化,提升解析效率与一致性;2. 自增主键规则智能适配分布式/非分布式数据库场景;3. 新增PostgreSQL CREATEEXTENSION语法支持。功能增强涵盖:SELECT*审核范围收紧、DML影响行数预警阈值下调至1000行、批量写入性能优化等。关键修复涉及MERGE语句解析、Oracle分组语法等场景。作为支持20+种数据库的智能SQL审核平台,PawSQL持续提升SQL全生命周期治理能力。(149字)

PawSQL的博客 216

PawSQL 正式登陆微软 Marketplace:智能 SQL 优化,上云更简单

摘要:2026年8月10日,北京图灵睿数科技宣布其数据库性能优化平台PawSQL正式上线Microsoft Marketplace,支持全球客户通过Azure快速部署。PawSQL覆盖SQL全生命周期,提供智能查询优化(Optimizer模块)与自动化运维监控(Patroller模块),帮助提升数据库性能并降低成本。该平台与微软产品深度集成,简化企业采购流程。微软高管表示欢迎,认为PawSQL的加入丰富了Marketplace的生态。图灵睿数专注于SQL优化智能化,PawSQL已兼容20余种主流数据库。

PawSQL的博客 280

PawSQL 技术月报 | 2026年6月

PawSQL在2026年6月迎来重要更新:全面支持TDSQL关键特性(自定义关键字、SEQUENCE和执行计划降级),增强Hive的LATERAL VIEW解析能力,新增STRAIGHT_JOIN检测与重写功能。优化方面扩展了Join消除规则至非主外键场景,改进了字符串类型判定逻辑,并持续提升派生表转换性能。同时修复了SELECT常量解析、字符集判定等多项问题,使SQL审核更精准。作为AI驱动的智能SQL平台,PawSQL已支持20余种数据库,拥有40+查询重写算法和300+审核规则,为全球超2万用户提供从

PawSQL的博客 281

SQL 避坑指南 - Oracle GROUP BY 整型常量的「薛定谔行为」

SQL解析器PawSQL在处理GROUP BY子句时发现了一个关键差异:不同数据库对GROUP BY中整型常量的解析方式不同。Oracle 23c之前将整型常量视为普通值(导致所有行归为一组),23c版本新增GROUP_BY_POSITION_ENABLED参数控制是否按列位置解析;而MySQL/PostgreSQL默认将整数视为列位置指示器。这种差异可能引发跨数据库迁移时的严重问题。建议始终使用列名替代常量或位置序号,PawSQL已新增审核规则,对GROUP BY中使用整数字面量的写法发出警告,以规避兼容

PawSQL的博客 531

【SQL换个写法,Top-N 查询快 10 倍!LATERAL JOIN 深度解析】

SQL查询中滥用派生表可能导致全表扫描等性能问题。本文通过真实案例展示了如何将低效的派生表查询(耗时12秒)通过PawSQL自动重写为LATERAL JOIN(0.2秒),性能提升61倍。文章解析了两种典型优化场景:窗口函数分页查询和分组聚合LIMIT查询,并详细说明了PawSQL的智能重写算法逻辑。该优化方法通过减少不必要的计算,将O(N²)复杂度降为O(N*K)。PawSQL的自动重写功能解决了手动改写的语法兼容性和易错问题,适用于多种主流数据库,为开发者提供高效、安全的SQL优化方案。

PawSQL的博客 598

“加个 DISTINCT 保险一点“——这句话有多危险

SQL开发中DISTINCT关键字的误用分析与正确实践 摘要:本文深入分析了SQL开发中DISTINCT关键字的常见误用问题。首先指出DISTINCT的本质错误在于混淆业务实体与度量指标的去重逻辑,强调去重应基于业务实体而非属性值。文章详细剖析了DISTINCT在多列(特别是浮点类型)场景下的精度陷阱,以及可能掩盖的JOIN逻辑错误、ETL管道问题和表设计缺陷等三大隐患。最后提出了五种正确替代方案:从源头修复重复问题、使用精确数值类型、基于业务主键去重、使用ROW_NUMBER()精确控制去重规则,以及完善

PawSQL的博客 487

【PawSQL × GitLab :提交代码即自动审核,SQL 质量零漏洞】

本文介绍了如何将PawSQL智能SQL审核平台与GitLab集成,实现自动化SQL审核。主要步骤包括:1)在GitLab创建API访问令牌;2)在PawSQL注册GitLab实例;3)配置SQL监控项(选择仓库、分支、审核规则等);4)在GitLab设置Webhook;5)通过代码提交或合并请求触发自动审核。集成后,SQL变更会自动触发审核,结果会回写到GitLab评论中,并提供详细的问题定位和修复建议。该方案支持SaaS和私有化部署的GitLab,覆盖开发全流程的SQL质量管控。

PawSQL的博客 376

【金融生产环境实战:PawSQL驱动openGauss慢查询优化,正确率100%,释放近7成人力成本】

某金融客户引入PawSQL智能优化工具对OpenGauss数据库198条慢查询进行优化,取得显著成效:优化正确率达100%,召回率68.8%,节省2/3人力成本。分析显示,90%优化来自精准索引推荐,20%受益于SQL重写优化。PawSQL通过自动化、高可靠的性能优化方案,助力金融客户实现数据库性能提升与运维效率飞跃,推动SQL优化进入智能化新阶段。

PawSQL的博客 519

同一条SQL,单机秒回,分布式集群卡成PPT——问题究竟出在哪?

本文深入剖析了分布式数据库跨分片JOIN操作的性能问题。首先对比了三种主流架构(分片中间件、存算分离MPP、经典MPP)在处理跨分片JOIN时的不同执行路径,指出数据移动是性能瓶颈的核心原因。文章揭示了三大性能杀手:网络传输爆炸、协调节点单点瓶颈和数据倾斜,并提供了快速诊断清单。通过一个电商平台报表SQL拖垮集群的真实案例,展示了错误分布键设计导致的严重后果。最后强调优化目标是减少数据移动,让JOIN回归本地,为后续解决方案系列文章奠定基础。

PawSQL的博客 914

PawSQL重磅升级:全面支持Oracle PL/SQL脚本解析与SQL优化

PawSQL最新版本突破性地实现了对Oracle PL/SQL存储过程的自动优化功能。该工具通过深度语法解析引擎,能够从复杂PL/SQL脚本中智能抽取SQL语句,并提供索引建议、查询重写、性能审核等全方位优化方案。典型测试案例显示,系统可在一分钟内完成包含9条SQL的存储过程分析,预估性能提升达99999%。该功能特别适用于金融、电信等行业的核心业务系统,支持通过API集成到CI/CD流程,实现SQL变更的自动化审核。PawSQL此次升级填补了存储过程SQL优化的技术空白,为复杂数据库脚本提供了一键式智能优

PawSQL的博客 564

PawSQL平台功能月度更新 | 2026年2月

PawSQL二月迭代聚焦企业级需求升级,完成三大核心改进:1)重构机构树权限体系,通过路径前缀机制和权限码设计,实现跨组织数据隔离与分级管控;2)优化并发执行模型,引入动态负载感知的双约束机制和分块处理,提升高并发场景稳定性;3)完成Coding平台Webhook集成,实现SQL审核与代码审查流程自动化对接。本次迭代着重夯实企业级应用基础能力,为大型客户提供更可靠的权限管理、性能保障和DevOps集成支持。

PawSQL的博客 559

PawSQL 2025 年度总结 - 走向“可信”的智能 SQL 优化

2025年,PawSQL在数据库性能优化领域实现关键跨越。面对行业对SQL质量日益严苛的要求,它不再满足于解决单条SQL问题,而是致力于构建一个可量化、可验证、可落地的企业级优化平台。这一年,PawSQL不仅正从一款好用的工具,进化为值得信赖的SQL质量治理基础设施;更在用户生态上取得质变:个人用户突破20,000人,并在金融、制造等行业实现企业级突破。

PawSQL的博客 1472

智能SQL优化工具 PawSQL 月度更新 | 2026年1月

2026年1月,PawSQL 核心引擎在超大规模 Schema 处理方面取得了突破性进展。我们引入了“按需解析”机制,大幅优化了在线获取元数据的响应速度。同时,针对分布式架构新增了多项审核规则,并显著提升了索引推荐引擎在处理派生表(DT)关联时的精准度。

PawSQL的博客 692

智能SQL优化工具 PawSQL 月度更新 | 2025年11月

2025年11月,PawSQL针对SQL审核/优化工具的下半场竞争需求,推出系列升级。重点包括:1)全面支持TDSQLPostgreSQL国产数据库;2)重构变量解析体系,提升复杂SQL脚本处理能力;3)优化Oracle/MSSQL解析细节,减少误报;4)增强性能分析与规则引擎准确性;5)重构审核执行引擎,支持大规模并发任务处理。这些改进使PawSQL在复杂业务场景下的稳定性、准确性和扩展性显著提升,为金融、政企等国产数据库用户提供更可靠的SQL优化解决方案。

PawSQL的博客 970

让SQL代码一秒变优雅:PawSQL上线免费SQL格式化工具!

PawSQL近期推出一系列免费的在线SQL工具,助力开发者高效处理各类SQL任务。该系列不仅提供SQL格式化、压缩、混淆及指纹生成、Oracle到PostgreSQL、openGauss等数据库的语法转换,还支持MySQL、Oracle等多种数据库的执行计划可视化分析。所有工具均免费在线可用,操作简便,是开发、测试及运维过程中提升效率的得力助手。

PawSQL的博客 1084

企业级SQL审核优化工具 PawSQL(4) — 生态集成

PawSQL构建了一套覆盖开发-测试-上线-巡检全流程的SQL优化闭环生态。通过插件化IDE集成、PR自动化审查、AI智能助手和服务化开放能力,实现SQL性能治理贯穿开发生命周期。该系统支持语法校验、性能建议、自动重写等功能,可在代码提交前识别问题,并与CI/CD流程深度集成。其特色在于将SQL优化从单点工具升级为持续治理体系,通过标准化协议连接开发工具链,让非DBA也能获得专业级优化指导,最终形成可度量、可回溯的团队SQL能力。

PawSQL的博客 878

不仅仅是 AI:PawSQL 如何实现“可信 AI SQL 优化”?

很多人认为,AI 时代的 SQL 优化,就是“让大模型写 SQL/改 SQL”。但在真实的企业级场景里,正确性、可靠性和可验证性比“聪明”更重要。这正是 PawSQL 与纯 AI 产品的根本区别,我们称之为:可信 AI SQL 优化(Trusted AI for SQL Optimization)。

PawSQL的博客 640

智能SQL优化工具 PawSQL 月度更新 | 2025年10月

在过去的十月,PawSQL团队持续深耕SQL优化领域,推出了一系列功能更新和问题修复,显著提升了产品的稳定性、性能和使用体验。本文将为您详细解析这些技术改进。

PawSQL的博客 714

企业级SQL审核优化工具 PawSQL 介绍(3)- 审核工单管理

PawSQL审核平台提供完整的SQL工单管理功能,实现从提交到执行的全流程自动化闭环。支持智能规则匹配、多维度SQL审核(性能/安全/可读性)、可视化风险分析及精准修复建议。平台提供灵活的审批流程配置,支持多角色协作(开发者/审批人/执行人),各环节操作留痕可追溯。通过自动化审核、风险可视化和可配置流程,帮助企业建立规范的SQL上线机制,在保障数据库安全的同时提升开发效率,适用于企业级SQL开发、DevOps变更管理和DBA审核自动化等场景。

PawSQL的博客 1191

企业级SQL审核工具PawSQL介绍(2)- 审核规则体系

PawSQL的审核规则体系针对SQL审核痛点,构建了全面均衡的审核方案。其规则集覆盖对象设计、操作、数据操作等维度,支持传统关系型、分布式及大数据平台等数据库,均保持200条左右规则量。特色包括:对象设计审核关注SQL操作结果;分布式数据库专项规则优化数据分布;HiveSQL专项规则提升大数据作业效率。通过审核模板管理,用户可自定义规则集与阈值,将最佳实践固化为规范。PawSQL致力于为各类数据库提供统一、专业的SQL审核体验,助力企业构建高效可靠的审核流程。

PawSQL的博客 1277

企业级SQL审核工具PawSQL介绍(1) - 六大核心能力

在当前的数据开发中,SQL审核工具已成为越来越多团队的必备利器。然而,市面上大多数产品仍普遍存在几大痛点:审核规则对各类数据库支持不一,难以适配多元环境;解析能力不足,面对复杂SQL时捉襟见肘;更常见的是,工具仅机械“报错”,却无法提供真正可行的优化建议——导致审核流程形同虚设,开发者困于误报与琐碎提示,而真正的性能瓶颈与安全隐患,却可能悄然潜伏。

PawSQL的博客 987

智能SQL审核优化工具 PawSQL 月度更新 | 正确性优先、兼容性与可观测性加强

本期更新以“正确性优先、兼容性与可观测性加强”为主线:针对子查询重写、谓词下推与 SATTC 场景的改进,配合解析器对 DB2 / 非标准字符的友好性提升,使 PawSQL 在复杂、异构 SQL 环境下更稳健。建议团队在升级到最新版时在预生产做回归验证,关注深分页优化的重写效果与有涉及 SSQ 重写的关键查询。

PawSQL的博客 751

PawSQL宣布支持DB2数据库SQL审核和性能优化

PawSQL智能SQL优化工具新增IBM DB2支持,为企业提供全面的SQL优化解决方案。该工具通过自研SQL解析器和灵活架构,实现对DB2的原生支持,提供智能SQL审查、查询重写优化和智能索引推荐三大核心功能。PawSQL支持离线和在线两种工作空间创建模式,适用于企业系统优化、数据库迁移、DevOps集成和慢查询治理等场景。此次更新使PawSQL支持数据库类型进一步扩展,帮助用户提升数据库性能并降低运维成本。PawSQL致力于为多种数据库提供一站式智能优化方案。

PawSQL的博客 594

智能SQL优化工具 PawSQL 月度更新 | 11项重要优化

PawSQL 8月更新实现11项核心优化:增强SQL解析引擎的标量子查询处理能力,新增SQL对象行信息追踪;优化算法改进包括关联子查询处理、索引策略调整及分布式列计算支持;提升Hive语法兼容性,修复SQLServer解析问题;完善变量处理等细节体验。这些升级显著提升了产品在复杂SQL场景下的解析稳定性与优化性能,为开发者提供更专业的数据库性能解决方案。

PawSQL的博客 732

高级SQL优化 | 告别临时表分组!PawSQL智能重写让跨表GROUP BY性能提升超百倍

在数据分析类 SQL 中,GROUP BY 是最常用的SQL功能之一。然而,当分组字段来自多个不同的表时,往往会导致严重的性能问题。多表分组不仅无法有效利用索引,只能执行全量扫描 + 临时表聚合,性能骤降。本文将深入解析PawSQL团队开发的GROUP BY优化算法,该算法能够智能识别跨表分组场景,并通过等值关系分析,将多表分组重写为单表分组,从而显著提升查询性能。

PawSQL的博客 487
上一篇: 从SQL质量管理体系来看SQL审核(4)- 如何设计一个优秀的SQL审核引擎
下一篇: SQL审核 | PawSQL审核引擎的设计目标
PawSQL,企业级SQL优化平台
博客等级 码龄5年 703粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值