本次以故事的形式講述一名不緊跟時代步伐、不主動積極學習的員工在不了解最新特性的情況下,如何失去了“老員工”的優勢和領導的信任。
在一個風和日麗,沒有霧霾的早上,技術部領導把小明叫到了辦公室,問:“兄弟,我想在新的系統上查詢一下在用的生產系統的數據,有沒有比較快速、方便的方法?新的用的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/