程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA

PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA

編輯:關於PHP編程

PostgreSQL 9.5新特性:IMPORT FOREIGN SCHEMA



本次以故事的形式講述一名不緊跟時代步伐、不主動積極學習的員工在不了解最新特性的情況下,如何失去了“老員工”的優勢和領導的信任。

在一個風和日麗,沒有霧霾的早上,技術部領導把小明叫到了辦公室,問:“兄弟,我想在新的系統上查詢一下在用的生產系統的數據,有沒有比較快速、方便的方法?新的用的PG的數據庫有這種方案嗎?”

小明:“領導,把數據從生產系統中導出,然後導入到新系統不就OK?”

領導:“比較快速、方便的方法有沒有?”

小明:“領導,把數據從生產系統中導出,然後導入到新系統就很快。”

領導:“更快速、方便的方法有沒有?”

小明:“領導,把數據從生產系統中導出,然後導入新系統就已經很快了!”

領導對於小明復讀機似的回答有些惱火,按耐住心中的不耐煩,問了一句:“導入外部表需要做什麼准備工作嗎?”


小明胸有成竹的講:“領導,就是實現創建好ddl就行。”

領導認真的問到:“一共多少張表?”

小明有些不確定:“200張?”

領導有些驚訝:“這麼多?!”

小明突然又想起了些什麼,小聲的說:“領導......我剛想起來...還有一個用戶,裡面大概有300張表...”(-__-|||)(聲音小的連他自己都快聽不到了)

領導有點沉不住氣了:“滾出去!”

小明紅著臉說:“領導!你聽我說...”

領導這次徹底的被點燃了:“滾出去!!!”


小明默默的在外面幫領導關上了門......

領導已經氣的不行,此時老板的電話已打過來:“怎麼樣?搞定沒?”

領導:“沒問題,老板,稍等片刻!”

老板:“好的,搞好了說一聲,好跟客戶介紹咱們新開發的系統,起碼有個查詢體驗,等你消息!抓緊。”

領導此時想起了公司新來的同事小強,雖然小強平時看起來比較逗逼和活潑,但是小強已經是公司為數不多做數據庫的員工了。領導想好了如何跟老板解釋系統開發進度慢,拖延體驗時間的解釋。抱著試試看的心態,傳召了小強,表達了在此情景下的需求。

小強:“領導,這個問題,我不敢保證能做好,我盡力。”

領導:“平時看你活潑誇張,今天說話有所保留;說說看,你有什麼思路?”

小強:“領導,不動數據庫什麼玩笑我都敢開,真刀真槍干事兒了,不來那些沒用的話。我前段時間看到PostgreSQL9.5有個新特性,可以簡單的導入外部表,按模式導入,我覺得可以嘗試一下。”

領導:“好,去做吧,注意操作謹慎,別粗心。”

小強:“知道了,半個小時內給您回消息,不論成功還是失敗,都即時匯報給您。”

小強出門後,領導點了一顆煙,靜待平時看起來“不靠譜”的小強。

同時,領導也在想,小強說的方法理論上聽起來確實不錯,不知道放在實踐中如何,他對比了一下兩位員工的方案:

小明的方案:


小強的方案:


小強回到工位上,倒了杯水,心理有一些壓力,盡管自己剛測試過新功能(導入外部模式),但是心理還是很緊張,因為他覺得要對領導的信任負責任,要對生產系統的穩定運行負責任,這絕對不是平時打打鬧鬧、說說笑笑之類的胡鬧。

他打開筆記本,深吸了一口氣,謹慎的進行了操作:

1.確定一下新環境的數據庫版本:

-bash-3.2$psql

psql(9.5beta2)

輸入"help"來獲取幫助信息.

postgres=#selectversion();

version

-------------------------------------------------------------------------------------------------------------

PostgreSQL9.5beta2onx86_64-pc-linux-gnu,compiledbygcc(GCC)4.1.220080704(RedHat4.1.2-55),64-bit

(1行記錄)

2.創建基於用戶的模式:

postgres=#\cmusic

您現在已經連接到數據庫"music",用戶"postgres".

postgres=#createschemaericauthorizationeric;

CREATESCHEMA

3.安裝postgres_fdw插件:

music=#createextensionpostgres_fdw;

CREATEEXTENSION

4.創建外部服務器對象:

music=#createservermusic_fdw_serverforeigndatawrapperpostgres_fdwoptions(host'192.168.1.143',dbname'music',port'5432');

CREATESERVER

5.創建用戶映射對象:

music=#createusermappingforericservermusic_fdw_serveroptions(user'eric',password'gao');

CREATEUSERMAPPING

連接到生產庫看一下生產庫的表信息:

music=#\cmusiceric

Youarenowconnectedtodatabase"music"asuser"eric".

music=>\d

Listofrelations

Schema|Name|Type|Owner

--------+---------+---------------+----------

eric|summary|table|eric

...

(200rows)

6.遠程導入整個schema:

music=#importforeignschemaericfromservermusic_fdw_serverintoeric;

IMPORTFOREIGNSCHEMA

7.查看新系統表狀態:

music=>\dsummary;

引用的外部表"eric.summary"

欄位|類型|修飾詞|FDW選項

------+------------------------+--------+----------------------

id|integer||(column_name'id')

info|charactervarying(128)||(column_name'info')

Server:music_fdw_server

FDWOptions:(schema_name'eric',table_name'summary')

8.調整屬主和權限:

music=#grantselectoneric.summarytoeric;

GRANT

music=#altertableeric.summaryownertoeric;

ALTERTABLE

9.驗證數據量:

music=>selectcount(*)fromsummary;

count

-------

8

(1行記錄)

數據已經導入到了新的系統中,小強立刻給領導打電話通報。

領導:“不錯,小強,如果上面要求屏蔽掉某些敏感的表或者是只提供基礎數據好實現嗎?”

小強:“沒問題,我給你我的測試報告吧,最近剛做的。”

測試報告:

在源端創建2個新的表:

music=>createtableericgaoIasselect*fromsummary;

SELECT8

music=>createtableericgaoIIasselect*fromsummary;

SELECT8

music=>\d

Listofrelations

Schema|Name|Type|Owner

--------+-----------+---------------+----------

eric|ericgaoi|table|eric

eric|ericgaoii|table|eric

eric|summary|table|eric

(5rows)

排除某個表:

music=>\cmusicpostgres

您現在已經連接到數據庫"music",用戶"postgres".

music=#IMPORTFOREIGNSCHEMAericEXCEPT(summary)FROMSERVERmusic_fdw_serverINTOeric;

IMPORTFOREIGNSCHEMA

查看一下導入效果:

music=>\d

關聯列表

架構模式|名稱|類型|擁有者

----------+-----------+--------------+----------

eric|ericgaoi|所引用的外表|postgres

eric|ericgaoii|所引用的外表|postgres

(2行記錄)

已經排除表summary。

刪掉目標庫的表,再測試一下包含某個表的用法:

music=>dropforeigntableericgaoi;

DROPFOREIGNTABLE

music=>dropforeigntableericgaoii;

DROPFOREIGNTABLE

這一次僅導入某些指定的表:

music=#importforeignschemaericlimitto(summary)fromservermusic_fdw_serverintoeric;

IMPORTFOREIGNSCHEMA

music=>\d

關聯列表

架構模式|名稱|類型|擁有者

----------+---------+--------------+----------

eric|summary|所引用的外表|postgres

(1行記錄)

領導:“謝謝你,小強,回去工作吧”

說著,領導撥通了小明的電話,心想還是要維系好同事關系,多一份人脈,多很多機會,再說小明也是老員工了,剛才對他發火也有些沖動。

小明進了辦公司,領導微笑著,說:“小明,剛才事出緊急,有些急躁,抱歉。”

小明:“領導,沒關系,確實是我技術不精,以後多多學習!”

領導:“剛才小強把表都整過來了,我看查詢有些慢,你給看一下原因。”

小明:“好的領導,我收集一下信息,完事兒立刻給你匯報!”

小明回到工位執行了幾條命令,收集了一下性能方面的信息:

在新系統上:

music=>analyzeeric.summary;

ANALYZE

music=>explainanalyzeselect*fromsummary;

QUERYPLAN

----------------------------------------------------------------------------------------------------------

ForeignScanonsummary(cost=100.00..101.24rows=8width=28)(actualtime=4.308..4.319rows=8loops=1)

Planningtime:0.076ms

Executiontime:8.308ms

(3行記錄)

在生產系統的服務器看:

music=>analyzeeric.summary;

ANALYZE

music=>explainanalyzeselect*fromsummary;

QUERYPLAN

--------------------------------------------------------------------------------------------------

SeqScanonsummary(cost=0.00..1.08rows=8width=28)(actualtime=0.003..0.004rows=8loops=1)

Planningtime:0.108ms

Executiontime:0.023ms

(3rows)

小明把以上信息提交給了領導,解釋說:”領導,你看收集到的信息顯示,遠程的表查詢起來就是慢,看來這功能還是不靠譜啊,我建議還是用我的方案,導數據,或者可以買第三方軟件進行同步數據,把數據實時同步到本地。”

領導:”小明...老師...公司花錢請你來是讓你給個報告然後告訴老板要花錢買新產品的嗎?那還用你做啥?同步數據可以用HotStandby,還用第三方軟件?你一個導數據的方案想通吃所有項目?!目前這查詢速度客戶是可以接受的,並不是相對速度慢就是不可以好嗎?!!想要查遠程數據並且提升一下性能可以用物化視圖好嗎?!!!“

小明:”領導,不好意思...物化視圖是...什麼?“

領導:”滾出去!!!“


外部表在查詢速度上還是有一定的延遲的,如果在項目中可以接受實際的查詢速度就OK。如果接受不了,可以嘗試使用物化視圖,當然還有很多方案,方法總比困難多~~~

物化視圖在此就不多浪費篇幅了,如果感興趣的話,可參考如下文章,裡面有對物化視圖的性能測試:

http://gaoqiangdba.blog.163.com/blog/static/245970045201510171821363/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved