日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Replica small data to PostgreSQL from Oracle's Big table

發(fā)布時間:2025/3/19 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Replica small data to PostgreSQL from Oracle's Big table 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
有時候會遇到從Oracle同步數(shù)據(jù)到PostgreSQL數(shù)據(jù)庫的需求, 當(dāng)Oracle那邊的表是大表的時候,? 即使同步到PostgreSQL的數(shù)據(jù)量很小也可能很慢. 原因可能是 1. Oracle那邊的執(zhí)行計劃可能不優(yōu). 比如走全表掃描了. 或者走的索引不對.?
2. 條件沒有正確的轉(zhuǎn)換給Oracle, 那就慘了, 數(shù)據(jù)全部取過來然后在PostgreSQL中過濾.
例如我們需要同步的是前一天的數(shù)據(jù), 實際上走分區(qū)的全表掃描可能比走索引快. 但是又不好寫HINT. 那么怎么來解決這種問題呢? 來看個例子 :? 例如我們要從Oracle的tbl表同步前一天的數(shù)據(jù), 這個表做了按月分區(qū). ?一個月大概5000W記錄. 10GB左右. 我們要同步的數(shù)據(jù)條件是cond1 = '1' and cond2 in( '10','15'). 這個取出來每天只有幾百條記錄.? 同步的SQL應(yīng)該是 select a, b, c, createtime from tbl where createtime>=sysdate-1 and createtime<sysdate and?cond1 = '1' and cond2 in( '10','15'). 這個SQL可以走時間索引也可以走cond1和cond2的聯(lián)合索引. 或者走分區(qū)掃描. 幾種執(zhí)行計劃的時間相差比較大.? 走聯(lián)合索引的效率可能是最高的, 不過這個索引不存在, 在ORACLE中也不存在PostgreSQL中這樣的partial索引, 而且建立索引之后會帶來寫入的延遲. 最終決定不建立.
為了避免第二種情況的發(fā)生, 讓PG讀ORACLE的視圖, 而不是直接讀表. 通過限定視圖中的數(shù)據(jù)量來限定PG的最大可能獲取量.
oracle :? digoal user :
create view v_tbl as select a,b,c,createtime from tbl where cond1 = '1' and cond2 in( '10','15') and createtime >= sysdate-7;
這里限定我們要限定的條件, 并且加了一個時間的限定. 然后再到PostgreSQL中創(chuàng)建基于這個視圖的外部表. 注 : 如果你的oracle_fdw支持where語句下發(fā)的話, 可以不用這么麻煩.
postgresql9.1 :? superuser :
cretae role digoal nosuperuser encrypted password 'DIGOAL'; create server digoal foreign data wrapper oracle_fdw options (dbserver '//192.168.xxx.xxx:1521/digoal'); create user mapping for digoal server digoal options (user 'digoal',password 'digoal_oracle');create FOREIGN table digoal.ora_tbl (a varchar(9),b varchar(420),c varchar(45),createtime timestamp(0) without time zone) server digoal options (table 'v_tbl',schema 'digoal',plan_costs 'true');grant select on digoal.ora_tbl to digoal;

digoal user :?
create table tbl (a varchar(9),b varchar(420),c varchar(45),createtime timestamp(0) without time zone); create table sync_record(modifytime timestamp(0) without time zone);
sync_record 用于記錄最后一次同步時間, 防止重復(fù)同步. 下面是同步調(diào)用的函數(shù) :
create or replace function sync_tbl() returns text as $$ declare v_modifytime timestamp(0) without time zone; v_now timestamp(0) without time zone; begin v_now = now(); -- lock表防止同時調(diào)用這個同步過程. 導(dǎo)致重復(fù)同步 lock table sync_record in exclusive mode; perform 1 from sync_record limit 1; if not found then insert into sync_record(modifytime) values(v_now-interval '1 day'); end if; select modifytime into v_modifytime from sync_record limit 1; if v_modifytime < current_date then insert into tbl(a,b,c,createtime) select a,b,c,createtime from ora_tbl where createtime >=date(v_modifytime) and createtime < date(v_now); update sync_record set modifytime=v_now; end if; return 'ok'; exception when others then return 'error'; end; $$ language plpgsql;

digoal=> select * from sync_tbl();sync_tbl_app_charge ---------------------ok (1 row)

總結(jié)

以上是生活随笔為你收集整理的Replica small data to PostgreSQL from Oracle's Big table的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。