2

ほとんどの使用法/チュートリアル/マニュアルでは、管理可能な DB のコンテキストでメソッドを使用する方法が説明されています。

したがってUser.where( some condition)、数十または数百の結果が返される場合、Rails/DB/server がそれを処理できると考えるのが合理的です。

同じクエリが数千または数十万のレコードの結果を返した場合はどうなるでしょうか? 何百万ものレコードと言えますか?

それは何に依存していますか?Rails またはハードウェア (存在する場合) によって強制される制限は何ですか?

そして最も重要なのは、Rails でそのような大規模なデータ セットを処理する方法があるかどうか (すべてをクラッシュさせずに?)

4

2 に答える 2

3

基本的なことは、結果セットが大きくなりすぎると、PostgreSQL が結果セットをディスクに実体化するということです。これは、速度が向上することを意味しますが、他の操作のためにメモリを解放します。

一般に、PostgreSQL で数十万または数百万の行をクライアントに送信する必要はめったにありません。重要なのは、クエリを作成して (必要に応じて適切な SQL 拡張機能を使用して)、フロントエンドが必要とするデータのみを返し、データベースで適切に集計することです。このような集約ロジックをデータベースに配置すると速度が低下する (そして CPU 時間のコストがかかる) と考える多くの人に会いましたが、その領域のコストは、ディスク I/O 待機で何度も十分に返済される傾向があります。時間コストなど。

私が尋ねる基本的な質問は、「なぜ何百万ものレコードを見る必要があるのですか?」ということです。基本的に、これらをメモリに保持するか、ディスクに保存してから、ネットワーク経由で転送し、受信してから処理したいと言っています。これは効率の模範ではありません。ストレージの近くで数百万のレコードを処理し、一部の CPU コストを他のコストと交換する方がはるかに優れています。

混合環境または DW 環境でより複雑なクエリ内並列処理が必要な場合は、通常の PostgreSQL の代わりに Postgres-XC を使用してください。これにはかなりの複雑さが伴いますが、大規模な環境では、他の方法では解決できない問題が解決可能になります。

于 2013-10-07T03:14:11.073 に答える
2

では、始めましょう:

グラスにバケツ一杯の水を入れようとするとどうなりますか??

つまり、次のように言えます。

  1. 最初の依存関係は、データベースのサイズです。
  2. 数百万の行を選択するには、(数百万 * 行のサイズ) のサイズが必要なため、その数のスプール領域が必要になります。スプールがさらに結合されると、スペースの必要性が大幅に増加します。
  3. データベースが並列に対応しておらず、スマート オプティマイザーを備えていない場合、これらの多くの行はパフォーマンスに影響を与え、クエリをさらに遅くします。

とにかく、数百万/数兆のデータを扱っている場合は、Teradata のようなデータ ウェアハウスへの移行を検討する必要があると思います。

于 2013-06-19T16:34:25.487 に答える