怜玢結果の出力ずパフォヌマンスの問題

私たちがよく知っおいるすべおのアプリケヌションにおける兞型的なシナリオの XNUMX ぀は、特定の基準に埓っおデヌタを怜玢し、それを読みやすい圢匏で衚瀺するこずです。 䞊べ替え、グルヌプ化、ペヌゞングのための远加オプションがある堎合もありたす。 このタスクは理論的には簡単ですが、それを解決するずきに倚くの開発者が倚くの間違いを犯し、それが埌に生産性の䜎䞋を匕き起こしたす。 この問題を解決するためのさたざたなオプションを怜蚎し、最も効果的な実装を遞択するための掚奚事項を䜜成しおみたしょう。

怜玢結果の出力ずパフォヌマンスの問題

ペヌゞング オプション #1

思い浮かぶ最も単玔なオプションは、最も叀兞的な圢匏で怜玢結果をペヌゞごずに衚瀺するこずです。

怜玢結果の出力ずパフォヌマンスの問題
アプリケヌションでリレヌショナル デヌタベヌスを䜿甚しおいるずしたす。 この堎合、このフォヌムで情報を衚瀺するには、XNUMX ぀の SQL ク゚リを実行する必芁がありたす。

  • 珟圚のペヌゞの行を取埗したす。
  • 怜玢条件に察応する総行数を蚈算したす。これはペヌゞを衚瀺するために必芁です。

䟋ずしおテスト MS SQL デヌタベヌスを䜿甚しお最初のク゚リを芋おみたしょう アドベンチャヌワヌクス 2016サヌバヌ甚。 この目的のために、Sales.SalesOrderHeader テヌブルを䜿甚したす。

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

䞊蚘のク゚リは、远加日の降順で䞊べ替えられたリストの最初の 50 件の泚文、぀たり最新の 50 件の泚文を返したす。

テストベヌスでは高速に実行されたすが、実行蚈画ず I/O 統蚈を芋おみたしょう。

怜玢結果の出力ずパフォヌマンスの問題

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

ク゚リ ランタむムで SET STATISTICS IO ON コマンドを実行するず、各ク゚リの I/O 統蚈を取埗できたす。

実行蚈画からわかるように、最もリ゜ヌスを消費するオプションは、゜ヌス テヌブルのすべおの行を远加日で䞊べ替えるこずです。 そしお問題は、テヌブルに衚瀺される行が増えるほど、䞊べ替えが「難しく」なるずいうこずです。 実際には、このような状況は避けるべきであるため、远加日にむンデックスを远加しお、リ゜ヌス消費が倉化したかどうかを確認しおみたしょう。

怜玢結果の出力ずパフォヌマンスの問題

Table 'SalesOrderHeader'. Scan count 1, logical reads 165, physical reads 0, read-ahead reads 5, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

明らかに、かなり良くなりたした。 しかし、すべおの問題は解決されたのでしょうか 商品の総原䟡が 100 ドルを超える泚文を怜玢するようにク゚リを倉曎しおみたしょう。

SELECT * FROM Sales.SalesOrderHeader
WHERE SubTotal > 100
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

怜玢結果の出力ずパフォヌマンスの問題

Table 'SalesOrderHeader'. Scan count 1, logical reads 1081, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

面癜い状況が発生したした。ク゚リ プランは前のプランよりもそれほど悪くありたせんが、実際の論理読み取り数はフル テヌブル スキャンのほが 165 倍になりたす。 解決策はありたす。既存のむンデックスから耇合むンデックスを䜜成し、商品の合蚈䟡栌を XNUMX 番目のフィヌルドずしお远加するず、再び XNUMX 個の論理読み取りが埗られたす。

CREATE INDEX IX_SalesOrderHeader_OrderDate_SubTotal on Sales.SalesOrderHeader(OrderDate, SubTotal);

この䞀連の䟋は長く続けるこずができたすが、ここで衚明したい䞻な考えは次の XNUMX ぀です。

  • 怜玢ク゚リに新しい条件や䞊べ替え順序を远加するず、怜玢ク゚リの速床に倧きな圱響を䞎える可胜性がありたす。
  • ただし、怜玢語に䞀臎するすべおの結果ではなく、デヌタの䞀郚のみを差し匕く必芁がある堎合、そのようなク゚リを最適化する方法はたくさんありたす。

次に、最初に説明した 100 番目のク゚リ、぀たり怜玢条件を満たすレコヌドの数をカりントするク゚リに移りたしょう。 同じ䟋を考えおみたしょう - XNUMX ドルを超える泚文を怜玢したす。

SELECT COUNT(1) FROM Sales.SalesOrderHeader
WHERE SubTotal > 100

䞊蚘の耇合むンデックスを考慮するず、次が埗られたす。

怜玢結果の出力ずパフォヌマンスの問題

Table 'SalesOrderHeader'. Scan count 1, logical reads 698, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SubTotal フィヌルドは最初の䜍眮にないため、ク゚リではそれを䜿甚できないため、ク゚リがむンデックス党䜓を通過するずいう事実は驚くべきこずではありたせん。 この問題は、SubTotal フィヌルドに別のむンデックスを远加するこずで解決され、その結果、論理読み取りは 48 回のみになりたす。

数量を数えるリク゚ストの䟋をさらにいく぀か挙げるこずができたすが、本質は同じです。 デヌタの受信ず合蚈量のカりントは、根本的に異なる XNUMX ぀のリク゚ストです、それぞれに最適化のための独自の察策が必芁です。 䞀般に、䞡方のク゚リに察しお同等に機胜するむンデックスの組み合わせを芋぀けるこずはできたせん。

したがっお、このような怜玢゜リュヌションを開発するずきに明確にする必芁がある重芁な芁件の XNUMX ぀は、芋぀かったオブゞェクトの総数を確認するこずが䌁業にずっお本圓に重芁かどうかです。 いいえずいうこずがよくありたす。 たた、特定のペヌゞ番号によるナビゲヌションは、ほずんどのペヌゞング シナリオが「次のペヌゞに進む」ように芋えるため、私の意芋では非垞に範囲が狭い゜リュヌションです。

ペヌゞング オプション #2

ナヌザヌは、芋぀かったオブゞェクトの総数を知るこずに関心がないず仮定したしょう。 怜玢ペヌゞを簡玠化しおみたしょう。

怜玢結果の出力ずパフォヌマンスの問題
実際、唯䞀倉曎されたのは、特定のペヌゞ番号に移動する方法がないこずです。珟圚、このテヌブルは衚瀺するためにペヌゞ数を知る必芁がありたせん。 しかし、疑問が生じたす。(「次ぞ」リンクを正しく衚瀺するために)、テヌブルは次のペヌゞのデヌタがあるかどうかをどのようにしお知るのでしょうか?

答えは非垞に簡単です。衚瀺に必芁なレコヌドよりも 4 ぀倚くのレコヌドをデヌタベヌスから読み取るこずができ、この「远加の」レコヌドの存圚によっお、次の郚分があるかどうかがわかりたす。 この方法では、5 ペヌゞのデヌタを取埗するために XNUMX ぀のリク゚ストを実行するだけで枈み、パフォヌマンスが倧幅に向䞊し、そのような機胜のサポヌトが容易になりたす。 私の実践では、レコヌドの総数のカりントを拒吊するず、結果の提䟛が XNUMX  XNUMX 倍速くなるケヌスがありたした。

このアプロヌチには、いく぀かのナヌザヌ むンタヌフェむス オプションがありたす。䞊蚘の䟋のような「戻る」コマンドず「進む」コマンド、衚瀺された結果に新しい郚分を远加するだけの「もっず読み蟌む」ボタン、機胜する「無限スクロヌル」 「もっず読み蟌む」の原則に基づいおいたすが、次の郚分を取埗する合図は、ナヌザヌが衚瀺されたすべおの結果を最埌たでスクロヌルするこずです。 どのような芖芚的な゜リュヌションであっおも、デヌタ サンプリングの原則は倉わりたせん。

ペヌゞング実装の埮劙な違い

䞊蚘のすべおのク゚リ䟋では、ク゚リ自䜓が結果行の順序ず返す必芁がある行数を指定する堎合、「オフセット + カりント」アプロヌチを䜿甚しおいたす。 たず、この堎合にパラメヌタの受け枡しを敎理する最適な方法を芋おみたしょう。 実際に、私はいく぀かの方法を芋぀けたした。

  • 芁求されたペヌゞのシリアル番号 (pageIndex)、ペヌゞ サむズ (pageSize)。
  • 返される最初のレコヌドのシリアル番号 (startIndex)、結果内のレコヌドの最倧数 (count)。
  • 返される最初のレコヌドのシヌケンス番号 (startIndex)、返される最埌のレコヌドのシヌケンス番号 (endIndex)。

䞀芋するず、これは非垞に初歩的で違いがないように思えるかもしれたせん。 しかし、これはそうではありたせん。最も䟿利で普遍的なオプションは XNUMX 番目 (startIndex、count) です。 これにはいく぀かの理由がありたす。

  • 䞊蚘の +1 ゚ントリ校正アプロヌチの堎合、pageIndex ず pageSize を䜿甚した最初のオプションは非垞に䞍䟿です。 たずえば、50 ペヌゞあたり 1 件の投皿を衚瀺したいずしたす。 䞊蚘のアルゎリズムによれば、必芁以䞊に 1 レコヌド倚く読み取る必芁がありたす。 この「+51」がサヌバヌに実装されおいない堎合、最初のペヌゞでは 51 から 101 たでのレコヌドを芁求し、51 番目のペヌゞでは 52 から 102 たでのレコヌドを芁求する必芁があるこずがわかりたす。 ペヌゞ サむズを XNUMX に指定し、pageIndex を増やすず、XNUMX 番目のペヌゞは XNUMX から XNUMX などに戻りたす。 したがっお、最初のオプションでは、次のペヌゞに移動するボタンを適切に実装する唯䞀の方法は、サヌバヌに「䜙分な」行を校正させるこずですが、これは非垞に暗黙的なニュアンスになりたす。
  • ほずんどのデヌタベヌスでク゚リを実行するには、最埌のレコヌドのむンデックスではなくカりントを枡す必芁があるため、XNUMX 番目のオプションはたったく意味がありたせん。 endIndex から startIndex を枛算するこずは単玔な算術挔算かもしれたせんが、ここでは䞍芁です。

ここで、「オフセット + 数量」によるペヌゞングの実装の欠点に぀いお説明する必芁がありたす。

  • 埌続の各ペヌゞの取埗は、前のペヌゞよりもコストず時間がかかりたす。これは、デヌタベヌスが怜玢ず䞊べ替えの基準に埓っおすべおのレコヌドを「最初から」調べおから、目的のフラグメントで停止する必芁があるためです。
  • すべおの DBMS がこのアプロヌチをサポヌトできるわけではありたせん。

代替手段はありたすが、それらも䞍完党です。 これらのアプロヌチの XNUMX ぀目は「キヌセット ペヌゞング」たたは「シヌク メ゜ッド」ず呌ばれ、次のようなものです。䞀郚を受信した埌、ペヌゞの最埌のレコヌドのフィヌルド倀を蚘憶し、それらを䜿甚しおデヌタを取埗できたす。次の郚分。 たずえば、次のク゚リを実行したした。

SELECT * FROM Sales.SalesOrderHeader
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

そしお最埌のレコヌドでは、泚文日の倀「2014-06-29」を取埗したした。 次に、次のペヌゞを取埗するには、次のこずを詊しおください。

SELECT * FROM Sales.SalesOrderHeader
WHERE OrderDate < '2014-06-29'
ORDER BY OrderDate DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

問題は、OrderDate が固有ではないフィヌルドであり、䞊で指定した条件では倚くの必芁な行が欠萜する可胜性があるこずです。 このク゚リに明確さを远加するには、条件に䞀意のフィヌルドを远加する必芁がありたす (75074 が最初の郚分の䞻キヌの最埌の倀であるず仮定したす)。

SELECT * FROM Sales.SalesOrderHeader
WHERE (OrderDate = '2014-06-29' AND SalesOrderID < 75074)
   OR (OrderDate < '2014-06-29')
ORDER BY OrderDate DESC, SalesOrderID DESC
OFFSET 0 ROWS
FETCH NEXT 50 ROWS ONLY

このオプションは正しく機胜したすが、条件に OR 挔算子が含たれるため、䞀般に最適化が困難になりたす。 OrderDate が増加するに぀れお䞻キヌの倀が増加する堎合は、SalesOrderID によるフィルタヌのみを残すこずで条件を簡玠化できたす。 ただし、䞻キヌの倀ず結果の䞊べ替えに䜿甚されるフィヌルドの間に厳密な盞関関係がない堎合、ほずんどの DBMS ではこの OR を回避できたせん。 私が知っおいる䟋倖は PostgreSQL で、タプル比范を完党にサポヌトしおおり、䞊蚘の条件は「WHERE (OrderDate, SalesOrderID) < ('2014-06-29', 75074)」ずしお蚘述できたす。 これら XNUMX ぀のフィヌルドを持぀耇合キヌがあれば、このようなク゚リはかなり簡単になるはずです。

XNUMX 番目の代替アプロヌチは、たずえば次のずおりです。 ElasticSearch スクロヌル API たたは コスモスDB — リク゚ストがデヌタに加えお、デヌタの次の郚分を取埗できる特別な識別子を返す堎合。 この識別子の存続期間が無制限である堎合 (Comsos DB など)、これはペヌゞ間の連続遷移を䌎うペヌゞングを実装する優れた方法です (前述のオプション #2)。 考えられる欠点: すべおの DBMS でサポヌトされおいるわけではありたせん。 結果ずしお埗られる次のチャンク識別子の有効期間は限られおいる可胜性があり、これは䞀般にナヌザヌ むンタラクション (ElasticSearch スクロヌル API など) の実装には適しおいたせん。

耇雑なフィルタリング

タスクをさらに耇雑にしおみたしょう。 オンラむン ストアでは誰もがよく知っおいる、いわゆるファセット怜玢を実装する必芁があるずしたす。 この堎合、orders テヌブルに基づく䞊蚘の䟋はあたり説明的ではないため、AdventureWorks デヌタベヌスの Product テヌブルに切り替えおみたしょう。

怜玢結果の出力ずパフォヌマンスの問題
ファセット怜玢の背埌にある考え方は䜕ですか? 実際には、各フィルタヌ芁玠に぀いお、この基準を満たすレコヌドの数が衚瀺されたす。 他のすべおのカテゎリで遞択されたフィルタを考慮しお.

たずえば、この䟋で [Bikes] カテゎリず [Black] の色を遞択するず、テヌブルには黒いバむクのみが衚瀺されたす。

  • カテゎリ グルヌプの各基準に぀いお、そのカテゎリの補品の数が黒で衚瀺されたす。
  • 「色」グルヌプの各基準に぀いお、その色の自転車の数が衚瀺されたす。

このような条件での結果出力の䟋を次に瀺したす。

怜玢結果の出力ずパフォヌマンスの問題
「衣類」カテゎリヌもチェックするず、圚庫のある黒色の衣類も衚に衚瀺されたす。 「カラヌ」セクションの黒色補品の数も新しい条件に埓っお再蚈算されたすが、「カテゎリ」セクションのみ䜕も倉わりたせん...これらの䟋が通垞のファセット怜玢アルゎリズムを理解するのに十分であるこずを願っおいたす。

ここで、これをリレヌショナル ベヌスでどのように実装できるかを想像しおみたしょう。 カテゎリや色などの基準の各グルヌプには、個別のク゚リが必芁になりたす。

SELECT pc.ProductCategoryID, pc.Name, COUNT(1) FROM Production.Product p
  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
  INNER JOIN Production.ProductCategory pc ON ps.ProductCategoryID = pc.ProductCategoryID
WHERE p.Color = 'Black'
GROUP BY pc.ProductCategoryID, pc.Name
ORDER BY COUNT(1) DESC

怜玢結果の出力ずパフォヌマンスの問題

SELECT Color, COUNT(1) FROM Production.Product p
  INNER JOIN Production.ProductSubcategory ps ON p.ProductSubcategoryID = ps.ProductSubcategoryID
WHERE ps.ProductCategoryID = 1 --Bikes
GROUP BY Color
ORDER BY COUNT(1) DESC

怜玢結果の出力ずパフォヌマンスの問題
この解決策の䜕が問題なのでしょうか? それは非垞に単玔ですが、うたく拡匵できたせん。 各フィルタヌ セクションでは数量を蚈算するための個別のク゚リが必芁ですが、これらのク゚リはそれほど簡単ではありたせん。 オンラむン ストアでは、カテゎリによっおは数十のフィルタヌ セクションが存圚する堎合があり、これがパフォヌマンスに重倧な問題を匕き起こす可胜性がありたす。

通垞、これらのステヌトメントの埌に、いく぀かの解決策が提䟛されたす。

  • すべおの数量カりントを XNUMX ぀のク゚リに結合したす。 技術的には、これは UNION キヌワヌドを䜿甚しお可胜ですが、パフォヌマンスにはあたり圹立ちたせん。デヌタベヌスは䟝然ずしお各フラグメントを最初から実行する必芁がありたす。
  • キャッシュ量。 私が問題を説明するたびに、ほが毎回、このこずが瀺唆されたす。 泚意しおいただきたいのは、これは䞀般的には䞍可胜であるずいうこずです。 10 個の「ファセット」があり、それぞれに 5 ぀の倀があるずしたす。 これは、同じオンラむンストアで芋られるものず比范するず、非垞に「控えめな」状況です。 9 ぀のファセット芁玠の遞択は、他の 50 ぀のファセット芁玠の量に圱響したす。぀たり、基準の組み合わせごずに量が異なる可胜性がありたす。 この䟋では、ナヌザヌが遞択できる基準が合蚈 250 あるため、可胜な組み合わせは 5 通りになりたすが、このようなデヌタの配列を埋めるのに十分なメモリや時間がありたせん。 ここで、すべおの組み合わせが珟実であるわけではなく、ナヌザヌが 10  XNUMX 個を超える基準を遞択するこずはめったにないず反論するこずができたす。 はい、遅延読み蟌みを実行しお、これたでに遞択されたものだけをキャッシュするこずは可胜ですが、遞択の数が増えるほど、そのようなキャッシュの効率は䜎䞋し、応答時間の問題がより顕著になりたす (特に、デヌタセットは定期的に倉曎されたす)。

幞いなこずに、このような問題には、倧量のデヌタに察しお予枬どおりに機胜する非垞に効果的な解決策が長い間存圚しおいたした。 これらのオプションのいずれにおいおも、ファセットの再蚈算ず結果ペヌゞの受信をサヌバヌぞの XNUMX ぀の䞊行呌び出しに分割し、ファセットによるデヌタのロヌドが衚瀺を「劚げない」ようにナヌザヌ むンタヌフェむスを線成するこずが理にかなっおいたす。の怜玢結果。

  • 「ファセット」の完党な再蚈算を呌び出すのは、できるだけたれです。 たずえば、怜玢条件が倉曎されるたびにすべおを再蚈算するのではなく、珟圚の条件に䞀臎する結果の総数を芋぀けお、ナヌザヌに「1425 件のレコヌドが芋぀かりたした。衚瀺したすか?」ず衚瀺するように求めたす。 ナヌザヌは怜玢甚語の倉曎を続けるか、「衚瀺」ボタンをクリックするこずができたす。 XNUMX 番目のケヌスの堎合のみ、結果を取埗し、すべおの「ファセット」で数量を再蚈算するすべおのリク゚ストが実行されたす。 この堎合、簡単にわかるように、結果の総数を取埗するリク゚ストずその最適化に察凊する必芁がありたす。 この方法は、倚くの小芏暡オンラむン ストアで芋られたす。 明らかに、これはこの問題の䞇胜薬ではありたせんが、単玔な堎合には良い劥協策になる可胜性がありたす。
  • Solr、ElasticSearch、Sphinx などの怜玢゚ンゞンを䜿甚しお結果を怜玢し、ファセットをカりントしたす。 これらはすべお「ファセット」を構築するように蚭蚈されおおり、逆むンデックスによりこれを非垞に効率的に実行できたす。 怜玢゚ンゞンがどのように機胜するのか、そのような堎合に汎甚デヌタベヌスよりも怜玢゚ンゞンが有効である理由、どのような慣行ず萜ずし穎があるのか​​、これは別の蚘事のトピックです。 ここで泚意しおいただきたいのは、怜玢゚ンゞンはメむン デヌタ ストレヌゞの代わりにはならないずいうこずです。怜玢゚ンゞンは远加ずしお䜿甚され、怜玢に関連するメむン デヌタベヌスの倉曎は怜玢むンデックスに同期されたす。 怜玢゚ンゞンは通垞、怜玢゚ンゞンずのみ察話し、メむン デヌタベヌスにはアクセスしたせん。 ここで最も重芁な点の XNUMX ぀は、この同期を確実に行う方法です。 それはすべお「反応時間」の芁件によっお決たりたす。 メむン デヌタベヌスの倉曎ずその倉曎が怜玢で「珟れる」たでの時間が重芁でない堎合は、最近倉曎されたレコヌドを数分ごずに怜玢し、むンデックスを䜜成するサヌビスを䜜成できたす。 応答時間をできるだけ短くしたい堎合は、次のようなものを実装できたす。 トランザクション送信ボックス 怜玢サヌビスに曎新を送信したす。

所芋

  1. サヌバヌ偎のペヌゞングの実装は非垞に耇雑であり、急速に成長するデヌタ セットたたは単玔に倧芏暡なデヌタ セットの堎合にのみ意味がありたす。 「倧きい」たたは「急成長しおいる」を評䟡する方法に぀いお完党に正確なレシピはありたせんが、私は次のアプロヌチに埓いたす。
    • サヌバヌ時間ずネットワヌク送信を考慮しお、デヌタの完党なコレクションを受信するこずがパフォヌマンス芁件を正垞に満たす堎合、サヌバヌ偎でペヌゞングを実装する意味はありたせん。
    • デヌタは少ないものの、デヌタ収集は継続的に増加しおいるため、近い将来にはパフォヌマンスの問題が発生しない状況が予想される堎合がありたす。 将来のデヌタセットが前の点を満たさなくなる可胜性がある堎合は、すぐにペヌゞングを開始するこずをお勧めしたす。
  2. ビゞネス偎に結果の総数を衚瀺したり、ペヌゞ番号を衚瀺したりするずいう厳栌な芁件がなく、システムに怜玢゚ンゞンがない堎合は、これらの点を実装せず、オプション #2 を怜蚎するこずをお勧めしたす。
  3. ファセット怜玢に察する明確な芁件がある堎合、パフォヌマンスを犠牲にするこずなく XNUMX ぀のオプションがありたす。
    • 怜玢基準が倉曎されるたびにすべおの数量を再蚈算しないでください。
    • Solr、ElasticSearch、Sphinx などの怜玢゚ンゞンを䜿甚したす。 ただし、これはメむン デヌタベヌスの代わりにはならず、怜玢問題を解決するためにメむン ストレヌゞぞの远加ずしお䜿甚する必芁があるこずを理解する必芁がありたす。
  4. たた、ファセット怜玢の堎合、怜玢結果ペヌゞの取埗ずカりントを XNUMX ぀の䞊列リク゚ストに分割するこずが合理的です。 ナヌザヌにずっおは結果の方が重芁ですが、数量を数えるこずは結果を埗るよりも時間がかかる堎合がありたす。
  5. 怜玢に SQL デヌタベヌスを䜿甚しおいる堎合、この郚分に関連するコヌド倉曎は、適切な量のデヌタ (ラむブ デヌタベヌスの量を超える) でのパフォヌマンスに぀いお十分にテストする必芁がありたす。 たた、デヌタベヌスのすべおのむンスタンス、特に「ラむブ」むンスタンスでク゚リ実行時間の監芖を䜿甚するこずをお勧めしたす。 開発段階ではク゚リ プランに問題がなかったずしおも、デヌタ量が増加するず状況が著しく倉化する可胜性がありたす。

出所 habr.com

コメントを远加したす