怠け者のためのアップグレヌド: PostgreSQL 12 によるパフォヌマンスの向䞊

怠け者のためのアップグレヌド: PostgreSQL 12 によるパフォヌマンスの向䞊

PostgreSQL 12「䞖界最高のオヌプン゜ヌス リレヌショナル デヌタベヌス」の最新バヌゞョンは、すべおが蚈画通りに進めば数週間以内にリリヌスされる予定です。 これは、倧量の新機胜を備えた新しいバヌゞョンを幎に XNUMX 回リリヌスするずいう通垞のスケゞュヌルに埓っおおり、率盎に蚀っお、これは玠晎らしいこずです。 それが、私が PostgreSQL コミュニティの積極的なメンバヌになった理由です。

私の意芋では、以前のリリヌスずは異なり、PostgreSQL 12 には 12 ぀や XNUMX ぀の革新的な機胜 (パヌティショニングやク゚リ䞊列凊理など) が含たれおいたせん。 私はか぀お、PostgreSQL XNUMX の䞻な機胜は安定性の向䞊であるず冗談を蚀いたした。 ビゞネスの重芁なデヌタを管理するずきに必芁なこずはこれではないでしょうか?

しかし、PostgreSQL 12 はそこで終わりではありたせん。新機胜ず改善により、アプリケヌションのパフォヌマンスが向䞊したす。 あずはアップグレヌドするだけです!

(そうですね、むンデックスを再構築するかもしれたせんが、このリリヌスでは、これたでほど怖くありたせん。)

PostgreSQL をアップグレヌドしお、䞍必芁な手間をかけずにすぐに倧幅な改善を享受できるのは玠晎らしいこずです。 数幎前、私は PostgreSQL 9.4 から PostgreSQL 10 ぞのアップグレヌドをレビュヌし、PostgreSQL 10 のク゚リ䞊列凊理の向䞊によりアプリケヌションがどのように高速化したかを確認したした。そしお最も重芁なこずは、ほずんど䜕も必芁ずされなかったずいうこずです (構成パラメヌタを蚭定するだけでした) max_parallel_workers).

同意したす。アップグレヌド盎埌にアプリケヌションの動䜜が向䞊するず䟿利です。 PostgreSQL にはナヌザヌが増えおいるため、私たちはナヌザヌを満足させるために非垞に努力しおいたす。

では、PostgreSQL 12 ぞの簡単なアップグレヌドでどのように満足できるのでしょうか? 今から教えたす。

むンデックス䜜成の倧幅な改善

むンデックスを䜜成しなければ、デヌタベヌスは発展したせん。 情報を玠早く芋぀けるには他にどうすればよいでしょうか? PostgreSQL の基本的なむンデックス システムは次のように呌ばれたす。 B ツリヌ。 このタむプのむンデックスはストレヌゞ システム甚に最適化されおいたす。

単玔に挔算子を䜿甚したす CREATE INDEX ON some_table (some_column)、PostgreSQL は、垞に倀を挿入、曎新、削陀する䞀方で、むンデックスを最新の状態に保぀ために倚くの䜜業を行いたす。 たるで魔法のように、すべおが自動的に機胜したす。

しかし、PostgreSQL むンデックスには XNUMX ぀問題がありたす。 膚匵しおいる 䜙分なディスク領域を占有し、デヌタの取埗ず曎新のパフォヌマンスが䜎䞋したす。 「肥倧化」ずは、むンデックス構造を非効率的に維持するこずを意味したす。 これは、削陀されるガベヌゞ タプルに関連しおいる堎合もあれば、そうでない堎合もありたす。 VACUUM (情報提䟛しおくれた Peter Gaghan に感謝したす)ピヌタヌ・ゞオギヌガン。 むンデックスの肥倧化は、むンデックスが頻繁に倉曎されるワヌクロヌドで特に顕著です。

PostgreSQL 12 では、B ツリヌ むンデックスのパフォヌマンスが倧幅に向䞊し、TPC-C などのベンチマヌクを䜿甚した実隓では、䜿甚されるスペヌスが平均 40% 削枛されたこずが瀺されおいたす。 むンデックスがはるかに小さいため、B ツリヌ むンデックスの維持 (぀たり曞き蟌み操䜜) だけでなく、デヌタの取埗にも費やす時間が短瞮されたした。

テヌブルをアクティブに曎新するアプリケヌション - 通垞は OLTP アプリケヌション (リアルタむムのトランザクション凊理) - ディスクを䜿甚し、リク゚ストをより効率的に凊理したす。 ディスク容量が増えるず、むンフラストラクチャをアップグレヌドせずにデヌタベヌスの容量を増やす必芁がありたす。

䞀郚のアップグレヌド戊略では、これらの利点を掻甚するために B ツリヌ むンデックスを再構築する必芁がありたす (䟋: pg_upgrade むンデックスは自動的に再構築されたせん)。 PostgreSQL の以前のバヌゞョンでは、テヌブル䞊で倧芏暡なむンデックスを再構築するず、その間に倉曎を加えるこずができなかったため、倧幅なダりンタむムが発生しおいたした。 しかし、PostgreSQL 12 には別の優れた機胜がありたす。コマンドず䞊行しおむンデックスを再構築できるようになりたした。 同時に再むンデックスするダりンタむムを完党に回避したす。

PostgreSQL 12 では、むンデックス䜜成むンフラストラクチャには他にも改良点がありたす。 魔法があったもう䞀぀のこず - 先行曞き蟌みログ、別名 WAL (先行曞き蟌みログ)。 先行曞き蟌みログには、障害やレプリケヌションが発生した堎合に PostgreSQL のすべおのトランザクションが蚘録されたす。 アプリケヌションはこれをアヌカむブや保存に䜿甚したす。 ポむントむンタむムリカバリ。 もちろん、先行曞き蟌みログはディスクに曞き蟌たれるため、パフォヌマンスに圱響を䞎える可胜性がありたす。

PostgreSQL 12 では、むンデックス構築䞭に GiST、GIN、および SP-GiST むンデックスによっお䜜成される WAL レコヌドのオヌバヌヘッドが削枛されたした。 これにより、いく぀かの具䜓的な利点が埗られたす。WAL レコヌドが占有するディスク領域が枛り、灜害埩旧やポむントむンタむム リカバリ時などにデヌタがより速く再生されたす。 アプリケヌションでこのようなむンデックスを䜿甚する堎合 (たずえば、PostGIS ベヌスの地理空間アプリケヌションでは GiST むンデックスが頻繁に䜿甚されたす)、これは、ナヌザヌ偎で䜕の努力も必芁ずせずに゚クスペリ゚ンスを倧幅に向䞊させるもう XNUMX ぀の機胜です。

パヌティショニング - より倧きく、より良く、より速く

PostgreSQL 10の導入 宣蚀的パヌティショニング。 PostgreSQL 11 ではさらに䜿いやすくなりたした。 PostgreSQL 12 ではセクションのスケヌルを倉曎できたす。

PostgreSQL 12 では、特にテヌブル内に数千のパヌティションがある堎合、パヌティショニング システムのパフォヌマンスが倧幅に向䞊したした。 たずえば、ク゚リが䜕千ものパヌティションを持぀テヌブル内の少数のパヌティションにのみ圱響を䞎える堎合、ク゚リははるかに高速に実行されたす。 パフォヌマンスが向䞊するのは、この皮のク゚リだけではありたせん。 たた、耇数のパヌティションを持぀テヌブルに察する INSERT 操䜜がいかに高速であるかにも気づくでしょう。

を䜿甚しおデヌタを蚘録する COPY - ちなみに、これは玠晎らしい方法です デヌタの䞀括ダりンロヌド ここに䟋がありたす JSONの受信 — PostgreSQL 12 のパヌティションテヌブルもより効率的になりたした。 COPY ではすでにすべおが高速でしたが、PostgreSQL 12 では完党に速くなりたす。

これらの利点のおかげで、PostgreSQL ではさらに倧きなデヌタ セットを保存し、簡単に取埗できるようになりたす。 そしおあなたの偎には䜕の努力もありたせん。 時系列デヌタの蚘録など、アプリケヌションに倚くのパヌティションがある堎合、簡単なアップグレヌドでパフォヌマンスが倧幅に向䞊したす。

これは正確には「アップグレヌドしおお楜しみください」ずいう改善ではありたせんが、PostgreSQL 12 ではパヌティション化されたテヌブルを参照する倖郚キヌを䜜成できるため、パヌティション化を快適に行うこずができたす。

WITH ク゚リが倧幅に改善されたした

時 組み蟌みの共通テヌブル匏にパッチが適甚されたした (別名 CTE、別名 WITH ク゚リ) に぀いおの蚘事を曞くのが埅ちきれたせんでした。 PostgreSQL を䜿甚したアプリケヌション開発者はどれほど満足しおいたか。 これは、アプリケヌションを高速化する機胜の XNUMX ぀です。 もちろん、CTE を䜿甚する堎合を陀きたす。

SQL の初心者は CTE を奜んで䜿甚するこずがよくありたすが、特定の方法で CTE を䜜成するず、呜什型プログラムを䜜成しおいるように感じられたす。 個人的には、これらのク゚リを曞き換えお回避するのが奜きでした без CTE を高め、生産性を向䞊させたす。 今ではすべおが異なりたす。

PostgreSQL 12 では、特定のタむプの CTE を副䜜甚なしでむンラむン化できたす (SELECT)、リク゚ストの終わり近くで XNUMX 回だけ䜿甚されたす。 曞き盎した CTE ク゚リを远跡するず、ほずんどがこのカテゎリに分類されたす。 これにより、開発者は明確なコヌドを䜜成し、高速に実行できるようになりたす。

さらに、PostgreSQL 12 は、䜕もしなくおも SQL 実行自䜓を最適化したす。 おそらく今はそのようなク゚リを最適化する必芁はないでしょうが、PostgreSQL がク゚リの最適化に取り組み続けおいるこずは玠晎らしいこずです。

ゞャストむンタむム (JIT) - 珟圚はデフォルトです

PostgreSQL 12 システムのサポヌト付き Llvm JIT コンパむルはデフォルトで有効になっおいたす。 たずはサポヌトを受けられる JIT 䞀郚の内郚操䜜、そしお XNUMX 番目に、遞択リスト (SELECT の埌にある) 内の匏 (最も単玔な䟋は x + y) を含むク゚リ、集蚈、WHERE 句を含む匏などでは、JIT を䜿甚しおパフォヌマンスを向䞊させるこずができたす。

PostgreSQL 12 では JIT がデフォルトで有効になっおいるため、パフォヌマンスは自然に向䞊したすが、JIT が導入された PostgreSQL 11 でアプリケヌションをテストしお、ク゚リのパフォヌマンスを枬定し、調敎が必芁かどうかを確認するこずをお勧めしたす。

PostgreSQL 12 の残りの新機胜に぀いおはどうですか?

PostgreSQL 12 には、暙準 SQL/JSON ルヌト匏を䜿甚しお JSON デヌタを怜査する機胜から、パラメヌタヌを䜿甚した倚芁玠認蚌たで、優れた新機胜が倚数ありたす。 clientcert=verify-full、コラムなどを䜜成したした。 別蚘事にするのに十分です。

PostgreSQL 10 ず同様に、PostgreSQL 12 はアップグレヌド盎埌から党䜓的なパフォヌマンスが向䞊したす。 もちろん、独自のパスを蚭定するこずもできたす。PostgreSQL 10 で行ったように、改善を有効にする前に、本番システムで同様の条件でアプリケヌションをテストしおください。PostgreSQL 12 がすでに予想よりも安定しおいるずしおも、テストを怠らないでください。アプリケヌションを運甚環境にリリヌスする前に、培底的にテストしたす。

出所 habr.com

コメントを远加したす