1. 程式人生 > 其它 >orcle 與pg資料庫的差別

orcle 與pg資料庫的差別

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;

時間不在於你擁有多少,而在於你怎樣去使用