如果把OracleDBA轉到PostgreSQL數據庫上是比較容易的,畢竟PostgreSQL數據庫與Oracle數據庫很相似。
PostgreSQL幾乎支持所有的SQL標準,支持類型相當豐富。PostgreSQL數據庫的源代碼要比MySQL數據庫的源代碼更容易讀懂,如果團隊的C語言能力比較強的話,就可以在PostgreSQL數據庫上做開發,比方說實現類似greenplum的系統,這樣也能與現在的分布式趨勢接軌。
為了說明PostgreSQL的功能,下面從“從Oracle遷移到Mysql之前必須知道的50件事”簡要對比壹下PostgreSQL數據庫與MySQL數據庫之間的差異。
從Oracle遷移到Mysql會面對的50件難事1、對子查詢的優化表現不佳。(PostgreSQL可解決)
2、對復雜查詢的處理較弱。(PostgreSQL可解決)
3、查詢優化器不夠成熟。(PostgreSQL可解決)
PostgreSQL完全支持SQL-92標準,對SQL的支持也很全面,可以支持復雜的SQL查詢。
4、性能優化工具與度量信息不足。(PostgreSQL可解決)
PostgreSQL提供了執行計劃和詳細的cost值,可以方便看到SQL的執行效率。
5、審計功能相對較弱。
6、安全功能不成熟,沒有用戶組與角色的概念,沒有回收權限的功能(僅可以授予權限)。當壹個用戶從不同的主機/網絡以同樣的用戶名/密碼登錄之後,可能被當作完全不同的用戶來處理,沒有類似於Oracle的內置的加密功能。
7、身份驗證功能是完全內置的,不支持LDAP、ActiveDirectory或其它類似的外部身份驗證功能。
8、MysqlCluster可能與妳想象的有較大差異。
9、存儲過程與觸發器的功能有限。(PostgreSQL可解決)
PostgreSQL提供了完善的存儲過程和觸發器支持。
10、垂直擴展性較弱。
11、不支持MPP(大規模並行處理)。(PostgreSQL可解決)
PostgreSQL是類似Oracle數據庫的多進程架構,而不像MySQL是多線程的架構,所以能支持MPP。
12、支持SMP(對稱多處理器),但是如果每個處理器超過4或8個核(core)時,Mysql的擴展性表現較差。
13、對於時間、日期、間隔等時間類型沒有秒以下級別的存儲類型。
14、可用來編寫存儲過程、觸發器、計劃事件以及存儲函數的語言功能較弱。
15、沒有基於回滾(roll-back)的恢復功能,只有前滾(roll-forward)的恢復功能。
16、不支持快照功能。
17、不支持數據庫鏈(databaselink)。有壹種叫做Federated的存儲引擎可以作為壹個中轉將查詢語句傳遞到遠程服務器的壹個表上,不過,它功能很粗糙並且漏洞很多。
18、數據完整性檢查非常薄弱,即使是基本的完整性約束,也往往不能執行。(PostgreSQL可解決)
PostgreSQL提供完善的數據完整性檢查機制,支持外鍵。
19、優化查詢語句執行計劃的優化器提示非常少。
20、只有壹種表連接類型:嵌套循環連接(nested-loop),不支持排序-合並連接(sort-mergejoin)與散列連接(hashjoin)。(PostgreSQL可解決)
PostgreSQL則支持這些表連接類型。
21、大部分查詢只能使用表上的單壹索引;在某些情況下,會存在使用多個索引的查詢,但是查詢優化器通常會低估其成本,它們常常比表掃描還要慢。(PostgreSQL可解決)
PostgreSQL數據不存在這個問題,假設表T的兩個字段col1的col2上有兩個索引,idx_1和idx_2,那麽select*fromtwherecol1=:aandcol2=:b;查詢時,PostgreSQL數據庫有可能把這個查詢轉化為select*fromtwherecol1=:aintersectselect*fromtwherecol2=:b,這樣兩個索引都可以使用上。
22、不支持位圖索引(bitmapindex)。每種存儲引擎都支持不同類型的索引。大部分存儲引擎都支持B-Tree索引。
23、管理工具較少,功能也不夠成熟。
24、沒有成熟能夠令人滿意的IDE工具與調試程序。可能不得不在文本編輯器中編寫存儲過程,並且通過往表(調試日誌表)中插入記錄的方式來做調試。
25、每個表都可以使用壹種不同的存儲引擎。(PostgreSQL可解決)
26、每個存儲引擎在行為表現、特性以及功能上都可能有很大差異。(PostgreSQL可解決)
27、大部分存儲引擎都不支持外鍵。(PostgreSQL可解決)
28、默認的存儲引擎(MyISAM)不支持事務,並且很容易損壞。(PostgreSQL可解決)
29、最先進最流行的存儲引擎InnoDB由Oracle擁有。(PostgreSQL可解決)
30、有些執行計劃只支持特定的存儲引擎。特定類型的Count查詢,在這種存儲引擎中執行很快,在另外壹種存儲引擎中可能會很慢。(PostgreSQL可解決)
PostgreSQL只有壹種存儲引擎,所以不存在上面的情況。而PostgreSQL支持完善的事務。
31、執行計劃並不是全局***享的,,僅僅在連接內部是***享的。
32、全文搜索功能有限,只適用於非事務性存儲引擎。Ditto用於地理信息系統/空間類型和查詢。(PostgreSQL可解決)
PostgreSQL數據庫支持全文搜索,支持更多類型的索引,如B-tree,R-tree,Hash,GiST,GIN,R-tree,GIST,GIN索引可用於空間類型和查詢。
33、沒有資源控制。壹個完全未經授權的用戶可以毫不費力地耗盡服務器的所有內存並使其崩潰,或者可以耗盡所有CPU資源。
34、沒有集成商業智能(businessintelligence),OLAP**數據集等軟件包。
35、沒有與GridControl類似的工具
36、沒有類似於RAC的功能。如果妳問”如何使用Mysql來構造RAC”,只能說妳問錯了問題。
37、不支持用戶自定義類型或域(domain)。(PostgreSQL可解決)
PostgreSQL支持豐富的類型,同時也支持自定義類型。
38、每個查詢支持的連接的數量最大為61。
39、MySQL支持的SQL語法(ANSISQL標準)的很小壹部分。不支持遞歸查詢、通用表表達式(Oracle的with語句)或者窗口函數(分析函數)。支持部分類似於Merge或者類似特性的SQL語法擴展,不過相對於Oracle來講功能非常簡單。(PostgreSQL可解決)
這些PostgreSQL數據庫都支持,如窗口函數。
40、不支持功能列(基於計算或者表達式的列,Oracle11g開始支持計算列,以及早期版本就支持虛列(rownum,rowid))。
41、不支持函數索引,只能創建基於具體列的索引。(PostgreSQL可解決)
PostgreSQL支持函數索引。
42、不支持物化視圖。
43、不同的存儲引擎之間,統計信息差別很大,並且所有的存儲引擎支持的統計信息都只支持簡單的基數(cardinality)與壹定範圍內的記錄數(rows-in-a-range)。換句話說,數據分布統計信息是有限的。更新統計信息的機制也不多。
44、沒有內置的負載均衡與故障切換機制。
45、復制(Replication)功能是異步的,並且有很大的局限性。例如,它是單線程的(single-threaded),因此壹個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master。
46、Cluster並不如想象的那麽完美。或許我已經提過這壹點,但是這壹點值得再說壹遍。
47、數據字典(INFORMATION_SCHEMA)功能很有限,並且訪問速度很慢(在繁忙的系統上還很容易發生崩潰)。
48、不支持在線的AlterTable操作。
49、不支持Sequence。(PostgreSQL可解決)
PostgreSQL支持sequence。
50、類似於ALTERTABLE或CREATETABLE壹類的操作都是非事務性的。它們會提交未提交的事務,並且不能回滾也不能做災難恢復。Schame被保存在文件系統上,這壹點與它使用的存儲引擎無關。(PostgreSQL可解決)
PostgreSQL不存在這個問題。
每種數據庫都有不同的應用場景PostgreSQL具備了更高的可靠性,對數據壹致性、完整性的支持高於MySQL,因此PostgreSQL更加適合嚴格的企業應用場景,MySQL查詢速度較快,更適合業務邏輯相對簡單、數據可靠性要求較低的互聯網場景。以上個人淺見,歡迎批評指正。
認同我的看法,請點個贊再走,感謝!
喜歡我的,請關註我,再次感謝!