PostgreSQL由於是類似Oracle的多進程架構,所以能支援高並發的應用情境,這點與Oracle資料庫很像,所以把Oracle DBA轉到PostgreSQL資料庫上是比較容易的,畢竟PostgreSQL資料庫與Oracle資料庫很相似。
同時,PostgreSQL資料庫的原始碼要比MySQL資料庫的原始碼更容易讀懂,如果團隊的C語言能力比較強的知,就能在PostgreSQL資料庫上做開發,比方說實作類別似greenplum的系統,這樣也能與現在的分布式趨勢接軌。
為了說明PostgreSQL的功能,我下面簡要對比一下PostgreSQL資料庫與MySQL資料庫之間的差異:
我們先藉助Jametong翻譯的"從Oracle遷移到Mysql之前必須知道的50件事",看一看如何把Oracle轉到MySQL中的困難:
50 things to know before migrating Oracle to MySQL
by Baron Schwartz,Translated by Jametong
1. 對子查詢的最佳化表現不佳.
2. 對複雜查詢的處理較弱
3. 查詢最佳化工具不夠成熟
4. 效能最佳化工具與度量資訊不足
5. 審計功能相對較弱
6. 安全功能不成熟,甚至可以說很粗糙.沒有使用者組與角色的概念,沒有回收許可權的功能(僅僅可以授予許可權).當一個使用者從不同的主機/網路以同樣地使用者名稱/密碼登入之後,可能被當作完全不同的使用者來處理.沒有類似於Oracle的內建的加密功能.
7. 身分識別驗證功能是完全內建的.不支援LDAP,Active Directory以及其它類似的外部身分識別驗證功能.
8. Mysql Cluster可能與你的想象有較大差異.
9. 預存程序與觸發器的功能有限.
10. 垂直擴充性較弱.
11. 不支援MPP(大規模平行處理).
12. 支援SMP(對稱式多處理器),但是如果每個處理器超過4或8個核(core)時,Mysql的擴充性表現較差.
13. 對於時間、日期、間隔等時間類型沒有秒以下層級的儲存類型.
14. 可用來編寫預存程序、觸發器、計劃事件以及儲存函數的語言功能較弱.
15. 沒有基於復原(roll-back)的恢複功能,只有前滾(roll-forward)的恢複功能.
16. 不支援快照功能.
17. 不支援資料庫鏈(database link).有一種叫做Federated的儲存引擎可以作為一個中轉將查詢語句傳遞到遠程伺服器的一個表上,不過,它功能很粗糙並且漏洞很多.
18. 資料完整性檢查非常薄弱,即使是基本的完整性條件約束,也往往不能執行。
19. 最佳化查詢語句執行計畫的最佳化器提示非常少.
20. 只有一種表連線類型:嵌套迴圈串連(nested-loop),不支援排序-合并串連(sort-merge join)與散列串連(hash join).
21. 大部分查詢只能使用表上的單一索引;在某些情況下,會存在使用多個索引的查詢,但是查詢最佳化工具通常會低估其成本,它們常常比表掃描還要慢.
22. 不支援位元影像索引(bitmap index).每種儲存引擎都支援不同類型的索引.大部分儲存引擎都支援B-Tree索引.
23. 管理工具較少,功能也不夠成熟.
24. 沒有成熟能夠令人滿意的IDE工具與偵錯工具.可能不得不在文字編輯器中編寫預存程序,並且通過往表(調試日誌表)中插入記錄的方式來做調試.
25. 每個表都可以使用一種不同的儲存引擎.
26. 每個儲存引擎在行為表現、特性以及功能上都可能有很大差異.
27. 大部分儲存引擎都不支援外鍵.
28. 預設的儲存引擎(MyISAM)不支援事務,並且很容易損壞.
29. 最先進最流行的儲存引擎InnoDB由Oracle擁有.
30. 有些執行計畫只支援特定的儲存引擎.特定類型的Count查詢,在這種儲存引擎中執行很快,在另外一種儲存引擎中可能會很慢.
31. 執行計畫並不是全域共用的,,僅僅在串連內部是共用的.
32. 全文檢索搜尋功能有限, 只適用於非事務性儲存引擎. Ditto用於地理資訊系統/空間類型和查詢.
33. 沒有資源控制.一個完全未經授權的使用者可以毫不費力地耗盡伺服器的所有記憶體並使其崩潰,或者可以耗盡所有CPU資源.
34. 沒有整合商業智慧(business intelligence), OLAP **資料集等軟體包.
35. 沒有與Grid Control類似的工具(http://solutions.mysql.com/go.php?id=1296&t=s)
36. 沒有類似於RAC的功能.如果你問”如何使用Mysql來構造RAC”,只能說你問錯了問題.
37. 不支援使用者自訂類型或域(domain).
38. 每個查詢支援的串連的數量最大為61.
39. MySQL支援的SQL文法(ANSI SQL標準)的很小一部分.不支援遞迴查詢、通用表運算式(Oracle的with 語句)或者視窗函數(分析函數).支援部分類似於Merge或者類似特性的SQL文法擴充,不過相對於Oracle來講功能非常簡單.
40. 不支援功能列(基於計算或者運算式的列,Oracle11g 開始支援計算資料行,以及早期版本就支援虛列(rownum,rowid)).
41. 不支援函數索引,只能在建立基於具體列的索引.
42. 不支援物化視圖.
43. 不同的儲存引擎之間,統計資訊差別很大,並且所有的儲存引擎支援的統計資訊都只支援簡單的基數(cardinality)與一定範圍內的記錄數(rows-in-a-range). 換句話說,資料分布統計資訊是有限的.更新統計資料的機制也不多.
44. 沒有內建的負載平衡與故障切換機制.
45. 複製(Replication)功能是非同步,並且有很大的局限性.例如,它是單線程的(single-threaded),因此一個處理能力更強的Slave的恢複速度也很難跟上處理能力相對較慢的Master.
46. Cluster並不如想象的那麼完美.或許我已經提過這一點,但是這一點值得再說一遍.
47. 資料字典(INFORMATION_SCHEMA)功能很有限,並且訪問速度很慢(在繁忙的系統上還很容易發生崩潰).
48. 不支援線上的Alter Table操作.
49. 不支援Sequence.
50. 類似於ALTER TABLE或CREATE TABLE一類的操作都是非事務性的.它們會提交未提交的事務,並且不能復原也不能做災難恢複.Schame被儲存在檔案系統上,這一點與它使用的儲存引擎無關.
PostgreSQL資料庫可以解決以上問題中的:
1. 對子查詢的最佳化表現不佳
2. 對複雜查詢的處理較弱
3. 查詢最佳化工具不夠成熟
PostgreSQL完全支援SQL-92標準,對SQL的支援也很全面,可以支援複雜的SQL查詢。
4. 效能最佳化工具與度量資訊不足
PostgreSQL提供了執行計畫和詳細的cost值,可以方便看到SQL的執行效率。
9. 預存程序與觸發器的功能有限.
PostgreSQL提供了完善的預存程序和觸發器支援。
11. 不支援MPP(大規模平行處理)
而PostgreSQL是類似Oracle資料庫的架構,是多進程的架構,而不像MySQL是多線程的架構,所以能支援MPP。
18. 資料完整性檢查非常薄弱,即使是基本的完整性條件約束,也往往不能執行。
PostgreSQL提供完善的資料完整性檢查機制,支援外鍵。
20. 只有一種表連線類型:嵌套迴圈串連(nested-loop),不支援排序-合并串連(sort-merge join)與散列串連(hash join).
而PostgreSQL則支援這些表連線類型
21. 大部分查詢只能使用表上的單一索引;在某些情況下,會存在使用多個索引的查詢,但是查詢最佳化工具通常會低估其成本,它們常常比表掃描還要慢.
PostgreSQL資料不存在這個問題,假設表T的兩個欄位col1的col2上有兩個索引,idx_1和idx_2,那麼select * from t where col1=:a and col2=:b;查詢時,PostgreSQL資料庫有可能把這個查詢轉化為select * from t where col1=:a intersect select * from t where col2=:b,這樣兩個索引都可以使用上。
25. 每個表都可以使用一種不同的儲存引擎.
26. 每個儲存引擎在行為表現、特性以及功能上都可能有很大差異.
27. 大部分儲存引擎都不支援外鍵.
28. 預設的儲存引擎(MyISAM)不支援事務,並且很容易損壞.
29. 最先進最流行的儲存引擎InnoDB由Oracle擁有.
30. 有些執行計畫只支援特定的儲存引擎.特定類型的Count查詢,在這種儲存引擎中執行很快,在另外一種儲存引擎中可能會很慢.
PostgreSQL只有一種儲存引擎,所以不存在上面的情況。而PostgreSQL支援完善的事務。
32. 全文檢索搜尋功能有限, 只適用於非事務性儲存引擎. Ditto用於地理資訊系統/空間類型和查詢.
PostgreSQL資料庫支援全文檢索搜尋,支援更多類型的索引,如B-tree,R-tree, Hash, GiST, GIN,R-tree,GIST,GIN索引可用於空間類型和查詢。
37. 不支援使用者自訂類型或域(domain).
PostgreSQL支援豐富的類型,同時也支援自訂類型。
39. MySQL支援的SQL文法(ANSI SQL標準)的很小一部分.不支援遞迴查詢、通用表運算式(Oracle的with 語句)或者視窗函數(分析函數).支援部分類似於Merge或者類似特性的SQL文法擴充,不過相對於Oracle來講功能非常簡單.
這些PostgreSQL資料庫都支援,如視窗函數。
41. 不支援函數索引,只能在建立基於具體列的索引.
PostgreSQL支援函數索引
49. 不支援Sequence.
PostgreSQL支援sequence
50. 類似於ALTER TABLE或CREATE TABLE一類的操作都是非事務性的.它們會提交未提交的事務,並且不能復原也不能做災難恢複.Schame被儲存在文
件系統上,這一點與它使用的儲存引擎無關.
PostgreSQL不存在這個問題。