2011-12-03 161 views
3

我注意到Oracle需要一段時間才能編譯存儲過程,但運行速度要遠遠快於PostgreSQL PGSQL。Oracle PL/SQL存儲過程編譯器vs PostgreSQL PGSQL存儲過程編譯器

使用PostgreSQL,同樣的過程(即所有的SQL-92格式都帶有select和where子句中的函數)需要較少的時間進行編譯,但運行時間較長。

是否有一個指標網站,我可以並排查找Oracle vs PostgreSQL存儲過程,SQL解析,視圖和ref_cursors的性能指標?

PostgreSQL PGSQL編譯器缺少優化例程嗎? Oracle處理存儲過程的方式和PostgreSQL如何處理它們之間的主要區別是什麼?

我正在考慮編寫一個PGSQL函數庫,它允許PL/SQL代碼在PGSQL中編譯和運行。 (即DECODE,NVL,GREATEST,TO_CHAR,TO_NUMBER,全部爲 PL/SQL函數),但我不知道這是否可行。

+1

iirc Oracle執行更多的編譯時類型檢查,而PostgreSQL必須在運行時檢查更多。但對於完整的故事,你最好查看文檔。 –

回答

2

這是一個很難回答的問題,因爲它可以運行得非常深入,但我會將我的2美分添加到答案的高層貢獻中。首先,我非常喜歡PostgreSQL,我非常喜歡Oracle。然而,PL/SQL比PL/PGSQL所提供的語言/環境要深得多,或者是我曾遇到過的任何其他數據庫引擎過程語言。 Oracle至少10G使用PL/SQL的優化編譯器。這很可能有助於它在您的用例中編譯速度較慢的原因。 PL/SQL也有本地編譯。您可以使用簡單的編譯器指令將PL/SQL代碼編譯成機器代碼。這對計算密集型邏輯非常適用,不適用於SQL邏輯。我的觀點是,從功能和性能的角度來看,Oracle花費了大量的資源,使PL/SQL成爲一種真正的對待,而我只涉及到許多例子中的兩個.PL/SQL比PG/SQL早了很多年。是總結的,我不認爲PG/SQL很快就會迎頭趕上。

我懷疑你會找到一個並排比較,但我認爲這將是非常好的。這樣做的努力可能不值得大多數人時間。 另外我不會重寫已經存在的東西。

http://www.pgsql.cz/index.php/Oracle_functionality_(en) 
+0

感謝您的鏈接。沒有必要重新發明輪子。 –

2

有像TPC SQL存儲過程(見tpc.org)沒有正式的基準。我也不知道任何具有特定PL/SQL和pgSQL實現的數據庫應用程序可用作基準。

這兩種語言都被編譯並優化成中間代碼,然後由解釋器運行。 PL/SQL 可將編譯爲機器代碼,因爲解釋器非常高效,典型應用程序大部分時間都用在SQL引擎中,而不是程序代碼中(see AskTom article),因此不會像人們想象的那樣提高整體性能。 。

當程序代碼調用SQL時,它就像在任何其他程序中一樣,使用語句和綁定參數進行輸入和輸出。 Oracle能夠保持這些SQL「準備好」,這意味着遊標可以在沒有額外的SQL「軟解析」的情況下再次使用(通常只有當數據庫第一次運行SQL時纔會發生SQL「硬解析」它開始了)。

當在select或where子句中使用函數時,數據庫必須在SQL和過程引擎之間來回切換。這可以消耗更多的處理時間,然後代碼本身。

兩個編譯器之間的一個主要區別是Oracle維護一個依賴關係樹,這會導致PL/SQL在底層對象發生更改時自動重新編譯。而不實際運行的代碼,這是不是隨着Postgres的情況下檢測到的編譯錯誤(see Documentation

+0

您是否知道是否有方法可視化依賴關係樹,因爲有些IDE在其工具集中隨附了這些內容。即Maven依賴插件。狀態機編譯器也不錯。即http://www.complang.org/ragel/ –

0

是否有一個指標的網站,我可以通過側面的Oracle存儲過程發現側VS PostgreSQL的性能指標,SQL解析, 意見和ref_cursors?

公開評估Oracle性能可能違反了您的許可條款。如果你是一個公司用戶,確保在你做任何事情之前合法檢查它。

我正在考慮編寫一個PGSQL函數庫,它允許在PGSQL中編譯和運行PL/SQL代碼。 (即DECODE,NVL, GREATEST,TO_CHAR,TO_NUMBER,所有PL/SQL函數),但如果這是可行的,我不知道 。

請檢查手冊並確保您需要所有這些,因爲有些已經作爲內置函數實現。另外,我似乎還記得一些附加功能來提高Oracle兼容性。

最後,別忘了PostgreSQL提供關於如何編寫函數的選項。簡單的可以用純SQL編寫(並且在某些情況下自動內聯),對於繁重的工作,我更喜歡使用Perl(您可能喜歡Python或Java)。