pg數據庫
1. 基本語法差異
1.1. 基本數據類型差異
2. 高級語法差異
2.1. 事務差異
Oracle 中,通過 commit/rollback來實現事務提交或回滾。
結構類似於: begin select ... update ... delete ... commit; exception when others then rollback; end;
PostgreSQL 實際上把每個 SQL 語句當做在一個事務中執行來看待。 如果你沒有發出BEGIN命令,那么每個獨立的語句都被一個隱含的BEGIN 和(如果成功的話)COMMIT包圍。一組包圍在BEGIN和COMMIT 之間的語句有時候被稱做事務塊。 例如:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice'; SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00 WHERE name = 'Bob';
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT;
2.2. 函數繼承與重載
Oracle不支持 繼承和重載特性,pgsql支持繼承和函數重載;
2.3. 類型轉換
pgsql 中的類型轉換 “::” 符,Oracle 不支持。
2.4. 子查詢
子查詢,pgsql要求更嚴格,必須具有別名才可以;
4. 兼容性設置
4.1. 字符串連接兼容性解決方案 Postgresql中沒有concat函數,且由於 ||無法使用,需要通過在public schema中創建concat函數來解決。
create or replace function concat(text, text) returns text as
$body$ select coalesce($1,'') || coalesce($2,'')$body$ language 'sql' volatile;
alter function concat(text, text) owner to postgres;
4.2. 虛表 dual 問題
Postgresql中沒有 dual 虛擬表,為保證兼容性,需創建偽視圖(view)代替
create or replace view dual as
select NULL::"unknown" where 1=1; alter table dual owner to postgres;
grant all on table dual to postgres; grant select on table dual to public;
4.3. 數據分頁問題
-- Oracle
select * from ( select * from ( select * from t1 order by col1, col2 )
where rownum <=50 order by col3, col4 ) where rowmun <=20 order by col5, col6;
-- postgresql
select * from (select * from (select * from t1 order by col1, col2) ta order by col3,
col4 limit 50) tb order by col5, col6 limit 20;
樹形查詢
oracle:
select t.dept_id, t.dept_name, t.dept_code, t.par_dept_id,
level from SYS_DEPT t start with t.dept_id = '40288ac45a3c1e8b015a3c28b4ae01d6'
connect by prior t.dept_id = t.par_dept_id order by level, t.dept_code
pg:
WITH RECURSIVE T(ID,NAME,PARENT_ID) AS
( SELECT ID,NAME,PARENT_ID FROM TREE_TEST WHERE ID =13
UNION ALL SELECT T1.ID,T1.NAME,T1.PARENT_ID FROM TREE_TEST T1
JOIN T ON T1.PARENT_ID=T.ID ) SELECT ID,NAME,PARENT_ID FROM T
【運行緩慢】
執行如下命令,查詢單次調用最耗時 SQL TOP 10。
select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 10;
執行如下命令,查詢總最耗時 SQL TOP 10。
select userid::regrole, dbid, query from pg_stat_statements order by total_time desc limit 10;
【IO緩慢】
執行如下命令,查詢單次調用最耗 IO SQL TOP 10。
select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 10;
執行如下命令,查詢總最耗 IO SQL TOP 10。
select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 10;
【響應時間抖動的SQL】
執行如下命令,查詢響應時間抖動最嚴重 SQL。
select userid::regrole, dbid, query from pg_stat_statements order by stddev_time desc limit 10;
【最耗共享內存的SQL】
執行如下命令,查詢最耗共享內存 SQL。
select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 10;
【最耗臨時空間的SQL】
select userid::regrole, dbid, query from pg_stat_statements order by temp_blks_written desc limit 10;