




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
阿里數(shù)據(jù)庫團隊PostgreSQL實踐楊洋洋(陽帥)yang_yang8708@163.com阿里巴巴數(shù)據(jù)庫團隊阿里數(shù)據(jù)庫團隊PostgreSQL實踐楊洋洋(陽帥)1提綱IDB產(chǎn)品介紹PostgreSQL實踐原因?qū)嵺`步驟實踐總結(jié)提綱IDB產(chǎn)品介紹2IDB定位HA備份恢復性能壓測自動化調(diào)度數(shù)據(jù)質(zhì)量安全審計監(jiān)控告警安裝配置元數(shù)據(jù)…用戶服務層數(shù)據(jù)庫服務平臺(iDB)資源申請數(shù)據(jù)訪問開發(fā)設計生產(chǎn)變更分庫分表SQL審核流程管控權限管控運維組件層淘寶天貓支付寶余額寶口碑芝麻信用釘釘1688速賣通高德地圖UC阿里云菜鳥物流…AliSQLMongoDBPostgreSQLOceanBase……Oracle基礎技術層SQLServerIDB定位HA備份恢復性能壓測自動化調(diào)度數(shù)據(jù)質(zhì)量安全審計監(jiān)3IDB是數(shù)據(jù)庫團隊自主研發(fā)的一個數(shù)據(jù)庫服務產(chǎn)品,是集團去O的重要實施平臺。先后實現(xiàn)對Oracle,MySQL,Oceanbase,SqlServer,PostgreSQL等數(shù)據(jù)庫的查詢,數(shù)據(jù)變更,結(jié)構(gòu)變更的支持。并且支持分庫分表的操作。IDB是數(shù)據(jù)庫團隊自主研發(fā)的一個數(shù)據(jù)庫服務產(chǎn)品,是集團去O的4阿里數(shù)據(jù)庫團隊PostgreSQL實踐52010年淘寶啟動“去IOE”項目2010年淘寶啟動“去IOE”項目6PostgreSQL實踐原因
IDB幫助集團實現(xiàn)了去O,但是自己還在使用Oracle。2014年底,這臺Oracle服務器已經(jīng)集團僅剩的幾臺服務器之一,需要承擔高昂的License費用。去O勢在必行,用什么來替換它呢?MySQL? 需要對應用和SQL做大量改造。達夢? 功能與Oracle兼容,穩(wěn)定性達不到要求PostgreSQL? 改造成本低,安全穩(wěn)定PostgreSQL實踐原因
IDB幫助集團實現(xiàn)了去O,但是7實踐步驟實踐評估:可行性分析、工作量評估。制定方案:確定遷移的重點和難點,制定遷移方案。應用改造:
SQL改造,代碼改造。數(shù)據(jù)遷移:結(jié)構(gòu)遷移,數(shù)據(jù)遷移?;貧w與測試:功能回歸、性能測試。性能調(diào)優(yōu):針對上線后的性能問題進行分析和優(yōu)化。實踐步驟實踐評估:可行性分析、工作量評估。8SQL改造時間間隔Oracle時間相減得到間隔,單位為天。PG時間相減得到interval值,需要轉(zhuǎn)換為具體的時間值。Oracle中sysdate+intervalxxxxunit(precision)類型的數(shù)據(jù),PG中用now()+‘時間間隔字符串’的方式來實現(xiàn)。Now()+‘1day’Now()+‘14400’::interval別名設置:避免使用關鍵字role,data,label,type,name作別名,或者加上as關鍵字SQL改造時間間隔9SQL改造常量參數(shù)需要進行強制類型轉(zhuǎn)換,否則類型則unknown,框架無法自動解析類型。selectid,‘new’::varcharstatusfromt;這樣才能保證應用程序中獲取到的status數(shù)據(jù)類型為String。不強制轉(zhuǎn)換獲取到的是Object對象,會導致JavaBean或者DO對象的屬性值設置失敗。SQL改造常量參數(shù)需要進行強制類型轉(zhuǎn)換,否則類型則unkno10SQL改造函數(shù)替換:將Oracle部分PG不支持的函數(shù)替換為PG的等價函數(shù)。分組合并:Oracle中wm_concat(xxx)轉(zhuǎn)換成PG中的string_agg(xxx,‘,’)over(partitionbyXoderbyY)來實現(xiàn)。Oracle中的regexp_replace(xxx,reg)在PG需要加上第三個參數(shù)“,”Bitand(A,B)
:替換成運算符&,A&Bsysdate:now,current_timestampNVL:coalesceDECODE:casewhenthenelseendSQL改造函數(shù)替換:將Oracle部分PG不支持的函數(shù)替換為11SQL改造OracleMergeInto插入或者更新的SQL改造PostgreSQL需要聯(lián)合使用with查詢,updatereturning,insert來進行選擇性更新或者插入。SQL改造OracleMergeInto插入或者更新的12withdataas(select#id#::integerid,#name#::varcharname,#status#::varcharstatus),
upsertas(updatemy_userdstsetname=,gmt_modified=now(),status=d.statusfromdatadwhereisnotnullandd.id=dst.idreturningdst.*)
insertintomy_user(id,name,status) selectnextVal('seq_my_user'),,d.status fromdatad wherenotexists(select1frommy_userdstwheredst.id=d.id)withdataas(select#id#::int13SQL改造整數(shù)參數(shù)傳入空字符串的處理使用#id#::numeric時,程序傳遞空字符串’’作為參數(shù),則會出現(xiàn)invalidinputsyntaxfortypenumeric錯誤需要使用to_number(#param#)(EDB)Select*fromtwherestatus=‘new’andpid=to_number(#param#)SQL改造整數(shù)參數(shù)傳入空字符串的處理使用#id#::nu14SQL改造分頁OracleSELECT*from(SELECTrownumASrn,t.*FROMtWHEREcondition ANDrownum<={end})wherern>={start}PGSELECT*fromtwhereconditionoffset{start}limit{pagesize}SQL改造分頁15SQL改造部分數(shù)據(jù)類型轉(zhuǎn)換Oracle布爾值char(1)‘Y’/’N’轉(zhuǎn)換成PG類型booleanClob大字段類型轉(zhuǎn)換成PG類型varchar虛擬列增加實際列或者使用視圖Oracle\u0000字符PG不允許存儲,過濾掉再保存修改字段類型時可以使用USING{表達式}進行字段值轉(zhuǎn)換如altertableuseraltercolumnis_deletedtypebooleanUSINGcaseis_deletedwhen'Y'thentrueelsefalseend;altertableuseraltercolumnis_deletedtypebooleanUSINGis_deleted='Y';SQL改造部分數(shù)據(jù)類型轉(zhuǎn)換16SQL改造遞歸查詢STARTWITH
CONNECTBY轉(zhuǎn)換成WITHRECURSIVE查詢例如select
*from
empstartwith
empno=7connect
by
mgr=prior
empno;轉(zhuǎn)換成PG的遞歸SQL:withrecursiver_empras(selecta.id,,a.pidfromempawhereid=1001unionallselectb.id,,b.pidfromemp
binnerjoinronr.id=b.pid)selectid,namefromrSQL改造遞歸查詢17應用程序改造字段名的大小轉(zhuǎn)換與映射問題。Oracle字段名默認大寫,PG字段名默認小寫。全部大寫大小寫混合區(qū)分大小寫區(qū)分大小寫SQL字段名USER_NAMEUser_Age“User_Id”“use_desc”O(jiān)racle得到的元數(shù)據(jù)USER_NAMEUSER_AGEUser_Iduse_descPG得到的元數(shù)據(jù)user_nameuser_ageUser_Iduse_desc應用程序改造字段名的大小轉(zhuǎn)換與映射問題。全部大寫大小寫混合區(qū)18應用程序改造Oracle與PG元數(shù)據(jù)大小寫差異解決辦法批量修改SQL文件,為字段加入大寫別名(操作性差,工作量大)Selectuser_id“USER_ID”fromtwhere…;批量修改代碼,將程序中獲取數(shù)據(jù)值時將字段名小寫。(操作性差,工作量大)row.getInt(“user_id”)…;應用程序改造Oracle與PG元數(shù)據(jù)大小寫差異解決辦法19應用程序改造OraclePG默認元數(shù)據(jù)大小寫差異解決辦法持久層框架改造,修改數(shù)據(jù)庫字段到JavaBean的映射方法(Mapping)SQL:selectuser_namefromtwhereuser_id=?Oracle元數(shù)據(jù):USER_NAME程序獲取數(shù)據(jù):row.get(“USER_NAME”)PG元數(shù)據(jù):user_name,原來的程序無法獲取到數(shù)據(jù):SQL:user_name->PG:user_name->框架轉(zhuǎn)換:”USER_NAME”->原來的程序正常獲取到數(shù)據(jù)。應用程序改造OraclePG默認元數(shù)據(jù)大小寫差異解決辦法20應用程序改造持久層框架改造改造示例:rsmd=ResultSet.getMetaData()for(inti=0,n=rsmd.getColumnCount();i<n;i++){StringcolumnName=rsmd.getColumnName(i+1);if(delegate.isUseColumnLabel()){StringcolumnLabel=rsmd.getColumnLabel(i+1);
if(isPostgreSQL){if(columnLabel.equals(columnLabel.toLowerCase())){//小寫的字段名直接改大寫。
columnName=columnLabel.toUpperCase();}else{
columnName=columnLabel;
//”user_ID”大小寫敏感字段保留
}}else{columnName=columnLabel;}}應用程序改造持久層框架改造改造示例:21應用程序改造游標/流式數(shù)據(jù)處理需要開啟事物PG-JDBC驅(qū)動默認加載所有行,如果結(jié)果集大會造成應用(JAVA)內(nèi)存溢出(OutOfMemory)使用游標或者設置fetchSize需要開啟事物應用程序改造游標/流式數(shù)據(jù)處理需要開啟事物22應用程序改造配合表數(shù)據(jù)類型的改造進行修改。javaBean.setDeleted(“Y”.equals(row.getString(‘IS_DELETE’))javaBean.setDeleted(row.getBoolean(‘IS_DELETE’))通知下游數(shù)據(jù)使用方進行程序改造。應用程序改造配合表數(shù)據(jù)類型的改造進行修改。23性能優(yōu)化模糊查詢:如果沒有修改PG庫的locale,使用like’abc%’查詢時,默認會掃描所有行,即使有索引也不走索引,引發(fā)性能問題。原因是要查詢的數(shù)據(jù)類型和索引的數(shù)據(jù)類型不匹配。解決方式:重建索引,為索引列指定pattern_ops模式,如varchar_pattern_ops。
createindexidx_t_name
ont(name varchar_pattern_ops);性能優(yōu)化模糊查詢:24性能優(yōu)化避免長事物讀取大量數(shù)據(jù)需要使用事物來防止溢出,但是使用長事物可能造成性能問題。長事物會導致vacuum進程無法回收已經(jīng)刪除數(shù)據(jù)的存儲空間,新的數(shù)據(jù)寫入只能使用新的數(shù)據(jù)塊上,導致磁盤空間持續(xù)增長。解決辦法:數(shù)據(jù)庫上監(jiān)控長事物程序上排查長事物產(chǎn)生的原因并進行修復性能優(yōu)化避免長事物25性能優(yōu)化受長事務影響膨脹的表的處理小表可使用vacuumfull來處理。大表使用pg_reorg來進行在線空間收縮,不鎖表,不影響業(yè)務。性能優(yōu)化受長事務影響膨脹的表的處理26性能優(yōu)化分頁排序優(yōu)化部分Oracle的復雜SQL使用到PG上會產(chǎn)生性能問題,多層子查詢只在最外層排序分頁的時候性能影響明顯,盡量在子查詢里進行關聯(lián),過濾,分頁。當表和子查詢多時,表的join順序沒有Oracle優(yōu)化得好,可能會走錯索引,所以盡量避免子查詢,使用join來做。性能優(yōu)化分頁排序優(yōu)化27數(shù)據(jù)遷移確定遷移工具制定遷移方案制定遷移腳本,開始遷移驗證遷移后的數(shù)據(jù)正確性數(shù)據(jù)遷移確定遷移工具28數(shù)據(jù)遷移工具選擇MTKOra2PG,DBConvertDSQL(分布式數(shù)據(jù)庫SQL引擎),DTS(阿里云的數(shù)據(jù)遷移服務),數(shù)據(jù)遷移工具選擇29數(shù)據(jù)遷移制定遷移方案:MTK+DSQL(分布式數(shù)據(jù)庫SQL引擎)MTK遷移任務可以并行到表級別DSQL遷移任務可以并行到行級別,解決大表遷移時間長的問題。重要的數(shù)據(jù)使用觸發(fā)器記錄變更,全量遷移完成之后再做增量遷移數(shù)據(jù)遷移制定遷移方案:MTK+DSQL(分布式數(shù)據(jù)庫SQ30數(shù)據(jù)遷移制定遷移腳本元數(shù)據(jù)遷移Schema,表結(jié)構(gòu),視圖,序列,……制定數(shù)據(jù)遷移任務腳本大表單獨使用任務優(yōu)先遷移如任務一:runMTK.sht1&
任務二:runMTK.sht2&小表批量遷移如任務三:runMTK.sht7,t8,t9,t10&數(shù)據(jù)遷移制定遷移腳本31數(shù)據(jù)遷移先建立索引再進行數(shù)據(jù)遷移建立索引比較耗時,每個索引創(chuàng)建時間與接近遷移一次數(shù)據(jù)時間一個帶7個索引的樣本表進行測試樣本(21G/)同步數(shù)據(jù)時間(分鐘)創(chuàng)建索引時間(分鐘)CPU總耗時先數(shù)據(jù)后索引111306%(<60%)/4%(100%)>2H先索引后數(shù)據(jù)(多線程寫)33014%(<70%)<40數(shù)據(jù)遷移先建立索引再進行數(shù)據(jù)遷移樣本(21G/)同步數(shù)據(jù)時間32遷移性能我們進行了3輪演練,比較性能,進行方案改進遷移性能我們進行了3輪演練,比較性能,進行方案改進33開始遷移400+G的數(shù)據(jù),分兩批遷移,實時性要求不高的表先遷移實時性,一致性要求高的表后遷移,200G數(shù)據(jù)耗時約1個小時。開始遷移400+G的數(shù)據(jù),分兩批遷移,34應用數(shù)據(jù)源切換啟動改造后的應用代碼,使用PG數(shù)據(jù)源應用功能回歸。應用性能測試。根據(jù)運行情況進行應用代碼,應用SQL與數(shù)據(jù)庫優(yōu)化。應用數(shù)據(jù)源切換啟動改造后的應用代碼,使用PG數(shù)據(jù)源35阿里數(shù)據(jù)庫團隊PostgreSQL實踐36周邊設施建設主備復制跨機房一主一備高可用性監(jiān)控AliMonitor備份恢復方案每天一全備WAL日志增量備份備份壓縮同步到OSS保存如果發(fā)生故障,由OSS拉取全備數(shù)據(jù)恢復,再應用增量數(shù)據(jù),恢復服務。周邊設施建設主備復制37Oracle切換到PG的實踐總結(jié)可行性調(diào)研相比其他數(shù)據(jù)庫,PostgreSQL更適合成為Oracle替代品。研發(fā)成本從調(diào)研到落地時間少于1個月。投入研發(fā)資源2人,DBA資源1人。9%以下的SQL改造5%以下的應用代碼改造改動的代碼和SQL中,80%以上改造類型相同機器資源配置與原Oracle相同,性能經(jīng)過優(yōu)化能滿足應用需求改造SQL修改總量SELECT76820UPDATE11142Oracle切換到PG的實踐總結(jié)可行性調(diào)研改造SQL修改總量38目前單機單節(jié)點能滿足我們應用需求TPS500時CPU占用率僅5%目前單機單節(jié)點能滿足我們應用需求39PG實踐總結(jié)風險及穩(wěn)定性風險可控穩(wěn)定從上線到現(xiàn)在1年半只出現(xiàn)了一次停服狀態(tài),原因是大量持續(xù)寫入,且WAL日志未及時遷移走,導致磁盤被寫滿。擴容后立即恢復了服務。沒有出現(xiàn)數(shù)據(jù)丟失PG實踐總結(jié)風險及穩(wěn)定性40誠邀入伙數(shù)據(jù)庫內(nèi)核研發(fā)專家Java研發(fā)專家數(shù)據(jù)庫架構(gòu)師3年以上工作經(jīng)驗,數(shù)據(jù)庫與云計算感興趣發(fā)送簡歷到:zhengsheng.yezs@微博:葉正盛_yzsind誠邀入伙數(shù)據(jù)庫內(nèi)核研發(fā)專家41阿里數(shù)據(jù)庫團隊PostgreSQL實踐楊洋洋(陽帥)yang_yang8708@163.com阿里巴巴數(shù)據(jù)庫團隊阿里數(shù)據(jù)庫團隊PostgreSQL實踐楊洋洋(陽帥)42提綱IDB產(chǎn)品介紹PostgreSQL實踐原因?qū)嵺`步驟實踐總結(jié)提綱IDB產(chǎn)品介紹43IDB定位HA備份恢復性能壓測自動化調(diào)度數(shù)據(jù)質(zhì)量安全審計監(jiān)控告警安裝配置元數(shù)據(jù)…用戶服務層數(shù)據(jù)庫服務平臺(iDB)資源申請數(shù)據(jù)訪問開發(fā)設計生產(chǎn)變更分庫分表SQL審核流程管控權限管控運維組件層淘寶天貓支付寶余額寶口碑芝麻信用釘釘1688速賣通高德地圖UC阿里云菜鳥物流…AliSQLMongoDBPostgreSQLOceanBase……Oracle基礎技術層SQLServerIDB定位HA備份恢復性能壓測自動化調(diào)度數(shù)據(jù)質(zhì)量安全審計監(jiān)44IDB是數(shù)據(jù)庫團隊自主研發(fā)的一個數(shù)據(jù)庫服務產(chǎn)品,是集團去O的重要實施平臺。先后實現(xiàn)對Oracle,MySQL,Oceanbase,SqlServer,PostgreSQL等數(shù)據(jù)庫的查詢,數(shù)據(jù)變更,結(jié)構(gòu)變更的支持。并且支持分庫分表的操作。IDB是數(shù)據(jù)庫團隊自主研發(fā)的一個數(shù)據(jù)庫服務產(chǎn)品,是集團去O的45阿里數(shù)據(jù)庫團隊PostgreSQL實踐462010年淘寶啟動“去IOE”項目2010年淘寶啟動“去IOE”項目47PostgreSQL實踐原因
IDB幫助集團實現(xiàn)了去O,但是自己還在使用Oracle。2014年底,這臺Oracle服務器已經(jīng)集團僅剩的幾臺服務器之一,需要承擔高昂的License費用。去O勢在必行,用什么來替換它呢?MySQL? 需要對應用和SQL做大量改造。達夢? 功能與Oracle兼容,穩(wěn)定性達不到要求PostgreSQL? 改造成本低,安全穩(wěn)定PostgreSQL實踐原因
IDB幫助集團實現(xiàn)了去O,但是48實踐步驟實踐評估:可行性分析、工作量評估。制定方案:確定遷移的重點和難點,制定遷移方案。應用改造:
SQL改造,代碼改造。數(shù)據(jù)遷移:結(jié)構(gòu)遷移,數(shù)據(jù)遷移?;貧w與測試:功能回歸、性能測試。性能調(diào)優(yōu):針對上線后的性能問題進行分析和優(yōu)化。實踐步驟實踐評估:可行性分析、工作量評估。49SQL改造時間間隔Oracle時間相減得到間隔,單位為天。PG時間相減得到interval值,需要轉(zhuǎn)換為具體的時間值。Oracle中sysdate+intervalxxxxunit(precision)類型的數(shù)據(jù),PG中用now()+‘時間間隔字符串’的方式來實現(xiàn)。Now()+‘1day’Now()+‘14400’::interval別名設置:避免使用關鍵字role,data,label,type,name作別名,或者加上as關鍵字SQL改造時間間隔50SQL改造常量參數(shù)需要進行強制類型轉(zhuǎn)換,否則類型則unknown,框架無法自動解析類型。selectid,‘new’::varcharstatusfromt;這樣才能保證應用程序中獲取到的status數(shù)據(jù)類型為String。不強制轉(zhuǎn)換獲取到的是Object對象,會導致JavaBean或者DO對象的屬性值設置失敗。SQL改造常量參數(shù)需要進行強制類型轉(zhuǎn)換,否則類型則unkno51SQL改造函數(shù)替換:將Oracle部分PG不支持的函數(shù)替換為PG的等價函數(shù)。分組合并:Oracle中wm_concat(xxx)轉(zhuǎn)換成PG中的string_agg(xxx,‘,’)over(partitionbyXoderbyY)來實現(xiàn)。Oracle中的regexp_replace(xxx,reg)在PG需要加上第三個參數(shù)“,”Bitand(A,B)
:替換成運算符&,A&Bsysdate:now,current_timestampNVL:coalesceDECODE:casewhenthenelseendSQL改造函數(shù)替換:將Oracle部分PG不支持的函數(shù)替換為52SQL改造OracleMergeInto插入或者更新的SQL改造PostgreSQL需要聯(lián)合使用with查詢,updatereturning,insert來進行選擇性更新或者插入。SQL改造OracleMergeInto插入或者更新的53withdataas(select#id#::integerid,#name#::varcharname,#status#::varcharstatus),
upsertas(updatemy_userdstsetname=,gmt_modified=now(),status=d.statusfromdatadwhereisnotnullandd.id=dst.idreturningdst.*)
insertintomy_user(id,name,status) selectnextVal('seq_my_user'),,d.status fromdatad wherenotexists(select1frommy_userdstwheredst.id=d.id)withdataas(select#id#::int54SQL改造整數(shù)參數(shù)傳入空字符串的處理使用#id#::numeric時,程序傳遞空字符串’’作為參數(shù),則會出現(xiàn)invalidinputsyntaxfortypenumeric錯誤需要使用to_number(#param#)(EDB)Select*fromtwherestatus=‘new’andpid=to_number(#param#)SQL改造整數(shù)參數(shù)傳入空字符串的處理使用#id#::nu55SQL改造分頁OracleSELECT*from(SELECTrownumASrn,t.*FROMtWHEREcondition ANDrownum<={end})wherern>={start}PGSELECT*fromtwhereconditionoffset{start}limit{pagesize}SQL改造分頁56SQL改造部分數(shù)據(jù)類型轉(zhuǎn)換Oracle布爾值char(1)‘Y’/’N’轉(zhuǎn)換成PG類型booleanClob大字段類型轉(zhuǎn)換成PG類型varchar虛擬列增加實際列或者使用視圖Oracle\u0000字符PG不允許存儲,過濾掉再保存修改字段類型時可以使用USING{表達式}進行字段值轉(zhuǎn)換如altertableuseraltercolumnis_deletedtypebooleanUSINGcaseis_deletedwhen'Y'thentrueelsefalseend;altertableuseraltercolumnis_deletedtypebooleanUSINGis_deleted='Y';SQL改造部分數(shù)據(jù)類型轉(zhuǎn)換57SQL改造遞歸查詢STARTWITH
CONNECTBY轉(zhuǎn)換成WITHRECURSIVE查詢例如select
*from
empstartwith
empno=7connect
by
mgr=prior
empno;轉(zhuǎn)換成PG的遞歸SQL:withrecursiver_empras(selecta.id,,a.pidfromempawhereid=1001unionallselectb.id,,b.pidfromemp
binnerjoinronr.id=b.pid)selectid,namefromrSQL改造遞歸查詢58應用程序改造字段名的大小轉(zhuǎn)換與映射問題。Oracle字段名默認大寫,PG字段名默認小寫。全部大寫大小寫混合區(qū)分大小寫區(qū)分大小寫SQL字段名USER_NAMEUser_Age“User_Id”“use_desc”O(jiān)racle得到的元數(shù)據(jù)USER_NAMEUSER_AGEUser_Iduse_descPG得到的元數(shù)據(jù)user_nameuser_ageUser_Iduse_desc應用程序改造字段名的大小轉(zhuǎn)換與映射問題。全部大寫大小寫混合區(qū)59應用程序改造Oracle與PG元數(shù)據(jù)大小寫差異解決辦法批量修改SQL文件,為字段加入大寫別名(操作性差,工作量大)Selectuser_id“USER_ID”fromtwhere…;批量修改代碼,將程序中獲取數(shù)據(jù)值時將字段名小寫。(操作性差,工作量大)row.getInt(“user_id”)…;應用程序改造Oracle與PG元數(shù)據(jù)大小寫差異解決辦法60應用程序改造OraclePG默認元數(shù)據(jù)大小寫差異解決辦法持久層框架改造,修改數(shù)據(jù)庫字段到JavaBean的映射方法(Mapping)SQL:selectuser_namefromtwhereuser_id=?Oracle元數(shù)據(jù):USER_NAME程序獲取數(shù)據(jù):row.get(“USER_NAME”)PG元數(shù)據(jù):user_name,原來的程序無法獲取到數(shù)據(jù):SQL:user_name->PG:user_name->框架轉(zhuǎn)換:”USER_NAME”->原來的程序正常獲取到數(shù)據(jù)。應用程序改造OraclePG默認元數(shù)據(jù)大小寫差異解決辦法61應用程序改造持久層框架改造改造示例:rsmd=ResultSet.getMetaData()for(inti=0,n=rsmd.getColumnCount();i<n;i++){StringcolumnName=rsmd.getColumnName(i+1);if(delegate.isUseColumnLabel()){StringcolumnLabel=rsmd.getColumnLabel(i+1);
if(isPostgreSQL){if(columnLabel.equals(columnLabel.toLowerCase())){//小寫的字段名直接改大寫。
columnName=columnLabel.toUpperCase();}else{
columnName=columnLabel;
//”user_ID”大小寫敏感字段保留
}}else{columnName=columnLabel;}}應用程序改造持久層框架改造改造示例:62應用程序改造游標/流式數(shù)據(jù)處理需要開啟事物PG-JDBC驅(qū)動默認加載所有行,如果結(jié)果集大會造成應用(JAVA)內(nèi)存溢出(OutOfMemory)使用游標或者設置fetchSize需要開啟事物應用程序改造游標/流式數(shù)據(jù)處理需要開啟事物63應用程序改造配合表數(shù)據(jù)類型的改造進行修改。javaBean.setDeleted(“Y”.equals(row.getString(‘IS_DELETE’))javaBean.setDeleted(row.getBoolean(‘IS_DELETE’))通知下游數(shù)據(jù)使用方進行程序改造。應用程序改造配合表數(shù)據(jù)類型的改造進行修改。64性能優(yōu)化模糊查詢:如果沒有修改PG庫的locale,使用like’abc%’查詢時,默認會掃描所有行,即使有索引也不走索引,引發(fā)性能問題。原因是要查詢的數(shù)據(jù)類型和索引的數(shù)據(jù)類型不匹配。解決方式:重建索引,為索引列指定pattern_ops模式,如varchar_pattern_ops。
createindexidx_t_name
ont(name varchar_pattern_ops);性能優(yōu)化模糊查詢:65性能優(yōu)化避免長事物讀取大量數(shù)據(jù)需要使用事物來防止溢出,但是使用長事物可能造成性能問題。長事物會導致vacuum進程無法回收已經(jīng)刪除數(shù)據(jù)的存儲空間,新的數(shù)據(jù)寫入只能使用新的數(shù)據(jù)塊上,導致磁盤空間持續(xù)增長。解決辦法:數(shù)據(jù)庫上監(jiān)控長事物程序上排查長事物產(chǎn)生的原因并進行修復性能優(yōu)化避免長事物66性能優(yōu)化受長事務影響膨脹的表的處理小表可使用vacuumfull來處理。大表使用pg_reorg來進行在線空間收縮,不鎖表,不影響業(yè)務。性能優(yōu)化受長事務影響膨脹的表的處理67性能優(yōu)化分頁排序優(yōu)化部分Oracle的復雜SQL使用到PG上會產(chǎn)生性能問題,多層子查詢只在最外層排序分頁的時候性能影響明顯,盡量在子查詢里進行關聯(lián),過濾,分頁。當表和子查詢多時,表的join順序沒有Oracle優(yōu)化得好,可能會走錯索引,所以盡量避免子查詢,使用join來做。性能優(yōu)化分頁排序優(yōu)化68數(shù)據(jù)遷移確定遷移工具制定遷移方案制定遷移腳本,開始遷移驗證遷移后的數(shù)據(jù)正確性數(shù)據(jù)遷移確定遷移工具69數(shù)據(jù)遷
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年項目管理理論知識試題及答案
- 優(yōu)化學習 2024年體育經(jīng)紀人考試過程中學習方法的多樣化試題及答案
- 2024年籃球裁判員考試難題應對策略及試題及答案
- 2024年足球裁判員如何應對壓力的試題與答案
- 2024年裁判員考試誠信試題及答案
- 2024年4月20日四川省雅安市事業(yè)單位招聘醫(yī)護類工作人員《職業(yè)能力傾向測驗》試題真題試卷答案解析
- 遼陽市 2023 年高中階段學校招生方案
- 模具設計中的知識輸出與分享試題及答案
- 水土資源優(yōu)化農(nóng)業(yè)工程可行性研究報告
- 燃氣管道等老化更新改造項目可行性研究報告
- 跨學科實踐制作簡易桿秤人教版八年級下冊物理
- 消毒供應中心規(guī)范培訓
- 口腔門診6S管理
- 沉浸式體驗活動設計合同
- 易制毒化學品銷售人員崗位職責
- 2025四川九洲建筑工程有限責任公司招聘生產(chǎn)經(jīng)理等崗位6人筆試參考題庫附帶答案詳解
- 2025-2030中國金紅石發(fā)展現(xiàn)狀及未來趨勢研究報告
- 結(jié)腸鏡檢查前后的護理
- 人工智能與人才測評融合-全面剖析
- 小區(qū)二次供水水箱清洗消毒的監(jiān)督流程課件
- 2024年江蘇淮安中考滿分作文《這份考卷答的漂亮》2
評論
0/150
提交評論