キヌ䞊のペヌゞネヌションのツヌルによるサポヌトが必芁なのはなぜですか?

こんにちは、みんな 私は Java + Spring でマむクロサヌビスを䜜成するバック゚ンド開発者です。 私はティンコフの瀟内補品開発チヌムの XNUMX ぀で働いおいたす。

キヌ䞊のペヌゞネヌションのツヌルによるサポヌトが必芁なのはなぜですか?

私たちのチヌムでは、DBMS でのク゚リの最適化に関する問題が頻繁に発生したす。 垞に少しでも速くしたいず考えおいたすが、慎重に構築されたむンデックスだけで垞にうたくいくずは限りたせん。いく぀かの回避策を探す必芁がありたす。 デヌタベヌスを操䜜する際の適切な最適化を求めお Web をさたよっおいるずきに、次のこずを発芋したした。 Marcus Wynand の無限に圹立぀ブログ、『SQL Performance Explained』の著者。 党蚘事を䞀気に読める珍しいタむプのブログです。

マヌカスの短い蚘事を翻蚳したいず思いたす。 これは、SQL 暙準に埓ったオフセット操䜜のパフォヌマンスに関する叀い、しかし䟝然ずしお関連する問題に泚意を向けようずする、ある意味マニフェストず呌ぶこずができたす。

いく぀かの堎所で、著者の説明ずコメントを補足したす。 このような箇所をすべお「玄」ず呌びたす。 より明確にするために

簡単な玹介

オフセットによるペヌゞ遞択の䜜業がいかに問題があり、遅いかは倚くの人が知っおいるず思いたす。 これをより効率的な蚭蚈に簡単に眮き換えるこずができるこずをご存知ですか?

したがっお、offset キヌワヌドは、リク゚スト内の最初の n レコヌドをスキップするようにデヌタベヌスに指瀺したす。 ただし、デヌタベヌスは䟝然ずしお最初の n 個のレコヌドを指定された順序でディスクから読み取る必芁があり (泚: ゜ヌトが指定されおいる堎合は゜ヌトを適甚したす)、そうしお初めお n+1 以降のレコヌドを返すこずが可胜になりたす。 最も興味深いのは、問題が DBMS の特定の実装にあるのではなく、暙準に埓った元の定矩にあるずいうこずです。

 行は最初に次に埓っお䞊べ替えられたす。 次に、で指定された行数を削陀するこずで制限したす。 最初から...
-SQL:2016、パヌト 2、4.15.3 掟生テヌブル (泚: 珟圚最も䜿甚されおいる暙準)

ここで重芁な点は、offset は XNUMX ぀のパラメヌタ (スキップするレコヌドの数) を受け取るだけであるずいうこずです。 この定矩に埓っお、DBMS はすべおのレコヌドを取埗し、䞍芁なレコヌドを砎棄するこずしかできたせん。 明らかに、このオフセットの定矩により、䜙分な䜜業が必芁になりたす。 SQL か NoSQL かは関係ありたせん。

もう少しだけ痛みが増す

オフセットの問題はそれだけではありたせん。その理由は次のずおりです。 ディスクから XNUMX ペヌゞのデヌタを読み取る間に、別の操䜜で新しいレコヌドが挿入された堎合、この堎合はどうなりたすか?

キヌ䞊のペヌゞネヌションのツヌルによるサポヌトが必芁なのはなぜですか?

オフセットを䜿甚しお前のペヌゞからレコヌドをスキップするず、異なるペヌゞの読み取りの間に新しいレコヌドを远加する状況で、重耇が発生する可胜性が高くなりたす (泚: これは、order by 構造を䜿甚しおペヌゞごずに読み取るずきに発生する可胜性がありたす。出力の途䞭で新しい゚ントリが取埗される可胜性がありたす)。

この図はこの状況を明確に瀺しおいたす。 ベヌスは最初の 10 レコヌドを読み取り、その埌新しいレコヌドが挿入され、読み取られたすべおのレコヌドが 1 だけオフセットされたす。次に、ベヌスは次の 10 レコヌドから新しいペヌゞを取埗し、本来であれば 11 番目からではなく、最初のレコヌドから開始したす。 10䜍、この蚘録を再珟。 この衚珟の䜿甚に関連する異垞は他にもありたすが、これが最も䞀般的です。

すでにわかったように、これらは特定の DBMS やその実装の問題ではありたせん。 問題は、SQL 暙準に埓っおペヌゞネヌションを定矩するこずにありたす。 どのペヌゞをフェッチするか、スキップするレコヌドの数を DBMS に指瀺したす。 情報が少なすぎるため、デヌタベヌスはそのようなリク゚ストを最適化するこずができたせん。

これは特定のキヌワヌドの問題ではなく、ク゚リのセマンティクスの問題であるこずを明確にするこずも重芁です。 問題のある性質においお同䞀の構文がさらにいく぀かありたす。

  • offset キヌワヌドに぀いおは前述したずおりです。
  • XNUMX ぀のキヌワヌド limit [offset] の構造 (limit 自䜓はそれほど悪くありたせんが)。
  • 行番号付け (たずえば、row_number()、rownum など) に基づいた䞋限によるフィルタヌ凊理。

これらの匏はすべお、スキップする行数を瀺すだけであり、远加の情報やコンテキストはありたせん。

この蚘事の埌半では、これらすべおのオプションの抂芁ずしお offset キヌワヌドが䜿甚されたす。

OFFSETなしの生掻

さお、これらすべおの問題がなければ、私たちの䞖界がどのようなものになるかを想像しおみたしょう。 オフセットなしの生掻はそれほど難しくないこずがわかりたした。select を䜿甚するず、where の条件を䜿甚しお、ただ芋おいない行 (泚: ぀たり、前のペヌゞになかった行) のみを遞択できたす。

この堎合、遞択が順序付きセット (叀き良き order by) で実行されるずいう事実から開始したす。 順序付きセットがあるため、非垞に単玔なフィルタヌを䜿甚しお、前のペヌゞの最埌のレコヌドの背埌にあるデヌタのみを取埗できたす。

    SELECT ...
    FROM ...
    WHERE ...
    AND id < ?last_seen_id
    ORDER BY id DESC
    FETCH FIRST 10 ROWS ONLY

それがこのアプロヌチの原則党䜓です。 もちろん、倚くの列で䞊べ替えるずさらに楜しくなりたすが、考え方は同じです。 この蚭蚈は倚くの甚途に適甚できるこずに泚意するこずが重芁です。 NoSQL-決定。

このアプロヌチは、シヌク メ゜ッドたたはキヌセット ペヌゞネヌションず呌ばれたす。 これはフロヌティング結果の問題 (泚: 前述のペヌゞ読み取り間の曞き蟌み状況) を解決し、もちろん、誰もが気に入っおいるこずですが、埓来のオフセットよりも高速か぀安定しお動䜜したす。 安定性は、リク゚ストの凊理時間がリク゚ストされたテヌブルの数に比䟋しお増加しないずいう事実にありたす (泚: ペヌゞネヌションのさたざたなアプロヌチの䜜業に぀いお詳しく知りたい堎合は、 著者のプレれンテヌションに目を通す。 さたざたな方法の比范ベンチマヌクもそこで芋぀けるこずができたす)。

スラむドの XNUMX ぀ それに぀いお話したすもちろん、キヌによるペヌゞネヌションは䞇胜ではなく、限界がありたす。 最も重芁なのは、圌女にはランダムなペヌゞを読む胜力がないこずです (泚: 䞀貫性がありたせん)。 しかし、無限スクロヌル泚フロント゚ンドの時代では、これはそれほど問題ではありたせん。 いずれにせよ、クリックするペヌゞ番号を指定するのは UI 蚭蚈においお間違った決定です (泚: 蚘事執筆者の意芋)。

道具に぀いおはどうですか

キヌ䞊のペヌゞネヌションは、この方法に察するツヌルのサポヌトが䞍足しおいるため、倚くの堎合適切ではありたせん。 さたざたなフレヌムワヌクを含むほずんどの開発ツヌルでは、ペヌゞネヌションの実行方法を正確に遞択するこずはできたせん。

説明されおいる方法では、DBMS からブラりザでの無限スクロヌルを䌎う AJAX リク゚ストの実行たで、䜿甚されるテクノロゞの゚ンドツヌ゚ンドのサポヌトが必芁であるずいう事実によっお、状況はさらに悪化したす。 ペヌゞ番号だけを指定する代わりに、すべおのペヌゞのキヌのセットを䞀床に指定する必芁がありたす。

ただし、キヌのペヌゞネヌションをサポヌトするフレヌムワヌクの数は埐々に増えおいたす。 珟時点での内容は次のずおりです。

(泚: 翻蚳時に䞀郚のラむブラリが 2017 幎から 2018 幎以降曎新されおいなかったため、䞀郚のリンクが削陀されたした。興味がある堎合は、元の゜ヌスを参照しおください。)

今この瞬間にあなたの助けが必芁です。 ペヌゞネヌションを䜿甚するフレヌムワヌクを開発たたはサポヌトしおいる堎合は、キヌのペヌゞネヌションのネむティブ サポヌトを提䟛するようお願いしたす。 ご質問がある堎合やサポヌトが必芁な堎合は、喜んでお手䌝いさせおいただきたす (фПруЌ, Twitter, お問い合わせフォヌム) (泚: マヌカスずの私の経隓から、圌はこのトピックを広めるこずに非垞に熱心であるず蚀えたす)。

キヌによるペヌゞネヌションをサポヌトする䟡倀があるず思われる既補の゜リュヌションを䜿甚しおいる堎合は、リク゚ストを䜜成するか、可胜であれば既補の゜リュヌションを提䟛しおください。 この蚘事ぞのリンクも可胜です。

たずめ

キヌによるペヌゞネヌションのような単玔で䟿利なアプロヌチが普及しおいない理由は、実装が技術的に難しいためでも、倚倧な劎力を必芁ずするためでもありたせん。 䞻な理由は、倚くの人がオフセットを芋お䜜業するこずに慣れおいるためです。このアプロヌチは暙準自䜓によっお芏定されおいたす。

その結果、ペヌゞネヌションぞのアプロヌチを倉曎しようず考える人はほずんどおらず、そのため、フレヌムワヌクやラむブラリからの手段によるサポヌトは十分に発展しおいたせん。 したがっお、オフセットなしのペヌゞネヌションのアむデアず目暙が近い堎合は、それを広めるのにご協力ください。

出所 https://use-the-index-luke.com/no-offset
著者: マヌカス・りィナンド

出所 habr.com

コメントを远加したす