Oracle Relational Database Management System(RDBMS)は、大規模な組織で広く使用されており、市場で入手可能な最も高度なデータベーステクノロジと見なされています。これは通常、RDBMSを、製品が提供するものの標準的な「デファクト」として機能する他のデータベース製品と最も頻繁に比較されます。これは、db-engines.comによって、今日の市場で入手可能なRDBMSの第1位としてランク付けされています。
PostgreSQLは#4 RDBMSとしてランク付けされていますが、PostgreSQLに移行することに利点がないという意味ではありません。 PostgreSQLは1989年から1996年にオープンソース化されています。PostgreSQLは2017年と2018年の2年連続でDBMSofthe yearを受賞しました。これは、多数のユーザーや大規模な組織を引き付けるのをやめる気配がないことを示しています。
PostgreSQLが多くの注目を集めている理由の1つは、組織の高コストを削減し、ベンダーロックインから逃れることができるように、人々がOracleに代わるものを探しているためです。
実用的で生産性の高いOracleデータベースからの移行は、困難な作業になる可能性があります。企業のTCO(総所有コスト)などの懸念は、企業がOracleを廃止するかどうかの決定を引きずる理由の1つです。
このブログでは、企業がOracleを離れてPostgreSQLに移行することを選択した主な理由のいくつかを見ていきます。
理由1:真のオープンソースプロジェクトです
PostgreSQLはオープンソースであり、BSDまたはMITライセンスと同様に、リベラルなオープンソースライセンスであるPostgreSQLライセンスの下でリリースされます。製品とサポートの取得には料金はかかりません。
データベースソフトウェアを活用したい場合は、PostgreSQLデータベースで利用可能なすべての機能を無料で入手できることを意味します。 PostgreSQLはデータベースの世界で30年以上成熟しており、1996年からオープンソースとしてタッチベースになっています。拡張機能の作成に取り組んでいる開発者は何十年も楽しんでいます。それ自体で、開発者、機関、および組織はエンタープライズアプリケーションにPostgreSQLを選択します。主要なビジネスおよびモバイルアプリケーションを強化します。
繰り返しになりますが、組織は、Postgresのようなオープンソースデータベースソリューションが、特定の企業や開発者に完全に依存することなく、より優れた容量、柔軟性、サポートを提供するという認識に目覚めています。 Postgresは、以前のLinuxと同様に、ソリューションをコミュニティに返すことを選択する日々のビジネス上の問題を解決する熱心なユーザーによって設計されてきました(そして今後もそうなり続けます)。オラクルのような大規模な開発者は、収益性の高い製品や狭いが収益性の高い市場をサポートする製品を開発する動機が異なる可能性がありますが、Postgresコミュニティは、日常のリレーショナルデータベースユーザー向けに可能な限り最高のツールを開発することに取り組んでいます。
PostgreSQLは、多くの場合、あまり複雑にすることなくこれらのタスクを実行します。その設計は、追加機能による追加のIT環境の管理などのリソースを浪費することなく、データベースの処理に厳密に焦点を合わせています。これは、このオープンソースソフトウェアの利用者がOracleからPostgreSQLに移行するときのようなものの1つです。 Oracleデータベースがどのように機能するか、または最適化と調整の方法について複雑なテクノロジーを研究するために何時間も費やすと、費用のかかるサポートが必要になる可能性があります。これにより、機関や組織は、コストの負担が少なく、利益と生産性をもたらす代替手段を見つけるようになります。 PostgreSQLがSQL構文の存在をOracleの構文とどのように一致させることができるかについては、以前のブログを確認してください。
理由2:ライセンスがなく大規模なコミュニティ
Oracle RDBMSプラットフォームのユーザーにとって、無料または高額な料金なしのコミュニティサポートを見つけるのは困難です。機関、組織、および開発者は、多くの場合、問題の回答や解決策を無料で提供できる代替情報をオンラインで見つけることになります。
Oracleを使用する場合、(通常は)多額の費用がかかるため、特定の製品を決定したり、製品サポートを利用するかどうかを決定したりすることは困難です。特定の製品を試してテストし、最終的には購入してしまうかもしれませんが、それが役に立たないことに気付くだけです。 PostgreSQLを使用すると、コミュニティは無料で、現在の問題を喜んでサポートしてくれる豊富な経験を持つ専門家でいっぱいです。
ここhttps://lists.postgresql.org/でメーリングリストに登録して、コミュニティとの連絡を開始できます。 PostgreSQLタッチの初心者または天才は、ここに基づいて、ソリューション、テクノロジー、バグ、新しい発見を伝達、紹介、共有したり、新しいソフトウェアを共有したりします。 irc.freenode.netを使用して#postgresqlチャネルに参加するIRCチャットに助けを求めることもできます。 https://postgres-slack.herokuapp.com/またはhttps://postgresteam.slack.com/に参加して、Slackを通じてコミュニティに連絡することもできます。採用するオプションはたくさんあり、質問を提供できるオープンソース組織もたくさんあります
どこから始めればよいかについての詳細と情報については、https://www.postgresql.org/community/をチェックしてください。
PostgreSQLのプロフェッショナルサービスに行ってチェックアウトしたい場合は、たくさんのオプションから選択できます。 https://www.postgresql.org/support/professional_support/northamerica/で彼らのウェブサイトをチェックすることでさえ、そこにたくさんの会社のリストを見つけることができます、そしてこれらのいくつかは安い価格です。ここSevereninesでも、ClusterControlライセンスまたはDBAコンサルタントの一部であるPostgresのサポートも提供しています。
理由3:SQL適合性の幅広いサポート
PostgreSQLは、その言語のデファクトスタンダードとしてSQLに適応し、準拠することに常に熱心に取り組んできました。 SQL標準の正式名称は、ISO /IEC9075「データベース言語SQL」です。標準リリースの連続する改訂バージョンは以前のバージョンに置き換わるため、以前のバージョンへの適合性の主張には公式のメリットはありません。
Oracleとは異なり、ANSI標準SQL(構造化照会言語)に準拠していないキーワードまたは演算子がまだ存在します。たとえば、OUTER JOIN(+)演算子は、Oracleに触れていない、またはOracleにあまり馴染みのない他のDBAとの混同を引き起こす可能性があります。 PostgreSQLはJOIN構文のANSI-SQL標準に準拠しているため、MySQL / Percona/MariaDBデータベースなどの他のオープンソースRDBMSデータベースと簡単かつ簡単にジャンプできるという利点があります。
Oracleで非常に一般的なもう1つの構文は、階層クエリの使用です。 Oracleは非標準のSTARTWITH..CONNECTBY構文を使用しますが、SQL:1999では、階層クエリは再帰的な共通テーブル式によって実装されます。たとえば、以下のクエリは、階層クエリに従って構文が異なります。
SELECT
restaurant_name,
city_name
FROM
restaurants rs
START WITH rs.city_name = 'TOKYO'
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;
PostgreSQL
WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
FROM restaurants
WHERE city_name = 'TOKYO'
UNION
SELECT m.restaurant_name, m.city_name
FROM restaurants m
JOIN tmp ON tmp.restaurant_name = m.city_name)
SELECT restaurant_name, city_name FROM tmp;
PostgreSQLは、MySQL/MariaDBのような他のトップオープンソースRDBMSと非常によく似たアプローチを採用しています。
PostgreSQLのマニュアルによると、PostgreSQLの開発は、標準の最新の公式バージョンへの準拠を目指しており、そのような準拠は従来の機能や常識と矛盾しません。 SQL標準に必要な機能の多くがサポートされていますが、構文や機能がわずかに異なる場合もあります。実際、これはPostgreSQLの優れた点であり、小規模であろうと大規模であろうと、さまざまな組織によってサポートおよびコラボレーションされています。美しさは、標準のプッシュスルーに準拠したSQL言語にとどまります。
PostgreSQL開発は、標準の最新の公式バージョンへの準拠を目的としており、そのような準拠は従来の機能や常識と矛盾しません。 SQL標準に必要な機能の多くがサポートされていますが、構文や機能がわずかに異なる場合もあります。時間の経過とともに、適合に向けたさらなる動きが期待できます。
理由4:クエリの並列処理
公平を期すために、PostgreSQLのクエリ並列処理は、SQLステートメントに対するOracleの並列実行と比較するとそれほど豊富ではありません。 Oracleの並列処理には、ヒントを使用したステートメントキュー、並列度(DOP)の設定、並列度ポリシーの設定、または適応並列処理などの機能があります。
PostgreSQLは、サポートされている計画に基づいた単純な並列処理を備えていますが、OracleがオープンソースのPostgreSQLよりも優れていることを定義するものではありません。
PostgreSQLの並列処理は、コミュニティによって絶えず改善され、継続的に強化されています。 PostgreSQL 10がリリースされたとき、特にマージ結合、ビットマップヒープスキャン、インデックススキャン、インデックスのみのスキャン、収集マージなどの並列処理のサポートが改善され、一般の人々にアピールが追加されました。改善により、pg_stat_activityにも統計が追加されます。
>PostgreSQLバージョン<10では、並列処理はデフォルトで無効になっているため、変数max_parallel_workers_per_gatherを設定する必要があります。
postgres=# \timing
Timing is on.
postgres=# explain analyze select * from imdb.movies where birthyear >= 1980 and birthyear <=2005;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Seq Scan on movies (cost=0.00..215677.28 rows=41630 width=68) (actual time=0.013..522.520 rows=84473 loops=1)
Filter: ((birthyear >= 1980) AND (birthyear <= 2005))
Rows Removed by Filter: 8241546
Planning time: 0.039 ms
Execution time: 525.195 ms
(5 rows)
Time: 525.582 ms
postgres=# \o /dev/null
postgres=# select * from imdb.movies where birthyear >= 1980 and birthyear <=2005;
Time: 596.947 ms
クエリプランでは、実際の時間は約522.5ミリ秒で、実際のクエリの実行時間は約596.95ミリ秒であることがわかります。並列処理を有効にする一方で、
postgres=# set max_parallel_workers_per_gather=2;
Time: 0.247 ms
postgres=# explain analyze select * from imdb.movies where birthyear >= 1980 and birthyear <=2005;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
Gather (cost=1000.00..147987.62 rows=41630 width=68) (actual time=0.172..339.258 rows=84473 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Seq Scan on movies (cost=0.00..142824.62 rows=17346 width=68) (actual time=0.029..264.980 rows=28158 loops=3)
Filter: ((birthyear >= 1980) AND (birthyear <= 2005))
Rows Removed by Filter: 2747182
Planning time: 0.096 ms
Execution time: 342.735 ms
(8 rows)
Time: 343.142 ms
postgres=# \o /dev/null
postgres=# select * from imdb.movies where birthyear >= 1980 and birthyear <=2005;
Time: 346.020 ms
クエリプランは、クエリが並列処理を使用する必要があると判断し、Gatherノードを使用します。クエリプランによって集計されるまでの実際の時間は、2つの作業で339ミリ秒、264ミリ秒と見積もられています。現在、クエリの実際の実行時間は346ミリ秒でした。これは、クエリプランから推定された実際の時間に非常に近いものです。
これは、PostgreSQLがどれほど高速で有益であるかを示しています。 PostgreSQLには、並列処理が発生する可能性がある場合、またはクエリプランが並列処理を使用するよりも高速であると判断した場合に独自の制限がありますが、その機能はOracleと大きな違いはありません。 PostgreSQLの並列処理は柔軟性があり、クエリがクエリの並列処理に必要なシーケンスと一致する限り、正しく有効化または利用できます。
理由5:高度なJSONサポートであり、常に改善されています
PostgreSQLでのJSONサポートは、他のオープンソースRDBMSと常に同等です。 LiveJournalのこの外部ブログをご覧ください。PostgreSQLのJSONサポートは、他のRDBMSと比較して常に高度であることが明らかになっています。 PostgreSQLには多数のJSON関数と機能があります。
JSONデータ型はPostgreSQL-9.2で導入されました。それ以来、多くの重要な機能強化が行われ、PostgreSQL-9.4でJSONBデータ型が追加された主要な追加機能が追加されました。 PostgreSQLは、JSONデータを格納するためのjsonとjsonbの2つのデータ型を提供します。 jsonbでは、JSONデータをバイナリ形式で格納するJSONデータ型の高度なバージョンです。これは、PostgreSQLでのJSONデータの検索と処理の方法に大きな違いをもたらした主要な機能強化です。
OracleはJSONも幅広くサポートしています。対照的に、PostgreSQLは、データの出力、さらにはデータベースに格納されているデータに影響を与えるデータ取得、データフォーマット、または条件付き操作に使用できる関数だけでなく、広範なサポートも備えています。 jsonbデータ型で保存されたデータには、多数のjsonbドキュメント内で発生するキーまたはキーと値のペアを効率的に検索するために使用できるGIN(Generalized Inverted Index)を使用できるという大きな利点があります。
PostgreSQLには、jsonbタイプのTRANSFORMFORTYPEをサポートされているプロシージャ言語に実装するのに役立つ追加の拡張機能があります。これらの拡張機能は、PL/Perlの場合はjsonb_plperlおよびjsonb_plperluです。 PL / Pythonの場合、これらはjsonb_plpythonu、jsonb_plpython2u、およびjsonb_plpython3uです。たとえば、jsonb値を使用してPerl配列をマップするには、jsonb_plperlまたはjsonb_plperlu拡張機能を使用できます。
ArangoDBは、PostgreSQLのJSONパフォーマンスを他のJSONサポートデータベースと比較するベンチマークを投稿しました。これは古いブログですが、それでもPostgreSQLのJSONが、データベースカーネルのコア機能である他のデータベースと比較してどのように機能するかを示しています。これにより、PostgreSQLには副次的な機能があっても独自の利点があります。
理由6:主要なクラウドベンダーによるDBaaSサポート
PostgreSQLはDBaaSとして広くサポートされています。これらのサービスは、Amazon、MicrosoftのAzure Database for PostgreSQL、およびGoogleのCloud SQLforPostgreSQLから提供されています。
Oracleと比較すると、Amazon RDSforOracleでのみ使用できます。主要なプレーヤーが提供するサービスは手頃な価格で始まり、ニーズに応じてセットアップするのに非常に柔軟です。これにより、教育機関や組織はそれに応じてセットアップを行い、Oracleプラットフォームにかかる多額のコストを軽減できます。
理由7:大量のデータの処理の改善
PostgreSQL RDBMSは、分析およびデータウェアハウジングのワークロードを処理するようには設計されていません。 PostgreSQLは行指向のデータベースですが、大量のデータを保存する機能があります。 PostgreSQLには、データストアの処理に関して次の制限があります。
制限 | 値 |
最大データベースサイズ | 無制限 |
最大テーブルサイズ | 32 TB |
最大行サイズ | 1.6 TB |
最大フィールドサイズ | 1 GB |
テーブルあたりの最大行数 | 無制限 |
テーブルあたりの最大列数 | 列タイプに応じて250〜1600 |
テーブルあたりの最大インデックス | 無制限 |
PostgreSQLのコア機能を使用する場合は、jsonbを使用して大量のデータを保存できます。たとえば、大量のドキュメント(PDF、Word、スプレッドシート)を作成し、jsonbデータ型を使用してこれを保存します。ジオロケーションアプリケーションとシステムには、PostGISを使用できます。
理由8:スケーラビリティ、高可用性、冗長性/地理的冗長性、およびフォールトトレラントソリューションを安価で
オラクルは、Oracle Grid、Oracle Real Application Clusters(RAC)、Oracle Clusterware、OracleDataGuardなどの同様の強力なソリューションを提供しています。これらのテクノロジーは、コストの増加につながる可能性があり、展開して安定させるのに予想外の費用がかかります。これらのソリューションを捨てるのは難しいです。トレーニングとスキルを強化し、展開と実装のプロセスに関与する人々を育成する必要があります。
PostgreSQLは大規模なサポートがあり、選択できるオプションがたくさんあります。 PostgreSQLには、ソフトウェアのコアパッケージに組み込まれたストリーミングと論理レプリケーションが含まれています。また、PostgreSQLの同期レプリケーションをセットアップして、読み取りクエリをスタンバイノードで処理しながら、より高可用性のクラスターを作成できる場合もあります。高可用性については、PostgreSQL用のトップPGクラスタリング高可用性(HA)ソリューションのブログを読むことをお勧めします。このブログには、選択できる多くの優れたツールとテクノロジーが含まれています。
高可用性、監視、およびバックアップソリューションを提供するエンタープライズ機能もあります。 ClusterControlはこのテクノロジーの1つであり、OracleSolutionsと比較して手頃な価格で提供されます。
理由9:いくつかの手続き型言語のサポート:PL / pgSQL、PL / Tcl、PL / Perl、およびPL/Python。
バージョン9.4以降、PostgreSQLには、選択に応じて新しい手続き型言語を定義できる優れた機能があります。すべての種類のプログラミング言語がサポートされているわけではありませんが、サポートされている言語は多数あります。現在、ベースディストリビューションでは、PL / pgSQL、PL / Tcl、PL / Perl、およびPL/Pythonが含まれています。外部言語は次のとおりです。
名前 | 言語 | ウェブサイト |
PL / Java | Java | https://tada.github.io/pljava/ |
PL / Lua | | https://github.com/pllua/pllua |
PL / R | R | https://github.com/postgres-plr/plr |
PL / sh | Unixシェル | https://github.com/petere/plsh |
PL / v8 | JavaScript | https://github.com/plv8/plv8 |
これの素晴らしい点は、Oracleとは異なり、PostgreSQLに新たに飛び込んだ開発者は、PL / SQLについて学ぶ時間をさらにとることなく、アプリケーションシステムにビジネスロジックをすばやく提供できることです。 PostgreSQLは、開発者の環境をより簡単かつ効率的にします。 PostgreSQLのこの性質は、開発者がPostgreSQLを愛し、エンタープライズプラットフォームソリューションからオープンソース環境に移行し始める理由に貢献しています。
理由10:大規模なテキストデータ(GIN、GiST、SP-GiST、BRIN)の柔軟なインデックス
PostgreSQLには、大きなデータの処理に役立つインデックスのサポートに関して大きな利点があります。 Oracleには、特に全文索引付けの場合に、大規模なデータセットの処理にも役立つ多くの索引タイプがあります。ただし、PostgreSQLの場合、これらのタイプのインデックスは、目的に応じて柔軟に作成されます。たとえば、次のタイプのインデックスは大きなデータに適用できます。
GIN-(一般化された転置インデックス)
このタイプのインデックスは、jsonb、hstore、range、およびarraysデータ型の列に適用できます。 1つの列に複数の値を含むデータ型がある場合に便利です。 PostgreSQLのドキュメントによると、「GINは、インデックス付けされるアイテムが複合値である場合を処理するように設計されており、インデックスによって処理されるクエリは、複合アイテム内に表示される要素値を検索する必要があります。たとえば、アイテムはドキュメントであり、クエリは特定の単語を含むドキュメントの検索である可能性があります。」
GiST-(一般化された検索ツリー)
使用するインデックスタイプ(GiSTまたはGIN)を選択する際は、次のパフォーマンスの違いを考慮してください。
- GINインデックスのルックアップはGiSTの約3倍高速です
- GINインデックスの構築にはGiSTの約3倍の時間がかかります
- GINインデックスの更新はGiSTインデックスよりも適度に遅くなりますが、高速更新のサポートが無効になっている場合は約10倍遅くなります
- GINインデックスはGiSTインデックスの2〜3倍です
経験則として、ルックアップが高速であるため、静的データにはGINインデックスが最適です。動的データの場合、GiSTインデックスの更新が高速です。
SP-GiST-(スペースパーティションGiST)
- プレフィックスの3桁(歴史的に電話会社のスイッチに関連)
これは、最初の3桁のセットの周り、2番目の3桁のセットの周りに自然なクラスタリングがあることを意味します。そうすると、数字がより均一な分布でファンアウトする可能性があります。ただし、電話番号を使用すると、一部の市外局番は他の市外局番よりもはるかに飽和度が高くなります。その結果、ツリーのバランスが非常に崩れる可能性があります。その自然なクラスタリングとデータの不均等な分散のために、電話番号などのデータはSP-GiSTの良い例になる可能性があります。
BRIN-(ブロック範囲インデックス)
日付や郵便番号など、順序付けられた非常に大きなデータセットがある場合、BRINインデックスを使用すると、不要なデータの多くをすばやくスキップまたは除外できます。さらに、BRINは、全体的なデータサイズに比べて小さいインデックスとして維持されるため、データセットが大きい場合に大きなメリットがあります。
PostgreSQLには、オラクルのエンタープライズプラットフォームやビジネスソリューションと競合する場合にいくつかの大きな利点があります。 PostgreSQLはOracleとほぼ同じくらい強力であるため、オープンソースRDBMSの頼りになる選択肢としてPostgreSQLを称賛するのは間違いなく簡単です。
オラクルを打ち負かすのは難しい(そしてそれを受け入れるのは難しい真実です)。また、技術者のエンタープライズプラットフォームを捨てるのも簡単ではありません。システムがパワーと生産的な結果を提供する場合、それはジレンマになる可能性があります。
プラットフォームのコストに継続的に過剰投資すると、他のビジネスレイヤーのコストや優先順位を上回り、進捗に影響を与える可能性があるため、決定を下さなければならない場合があります。
PostgreSQLとその基盤となるプラットフォームソリューションは、コストを削減し、予算上の問題を軽減するのに役立ちます。すべて中程度から小さな変化があります。