2009-07-28 5 views
2

Postgresのwork_memオプションはどのように機能しますか?ここでhttp://www.postgresql.org/docs/8.4/static/runtime-config-resource.htmlから説明があります:Postgresのwork_memを最大にするとどうなりますか?

 
Specifies the amount of memory to be used by internal 
sort operations and hash tables before switching to 
temporary disk files. The value defaults to one megabyte 
(1MB). Note that for a complex query, several sort or 
hash operations might be running in parallel; each one 
will be allowed to use as much memory as this value 
specifies before it starts to put data into temporary 
files. Also, several running sessions could be doing 
such operations concurrently. So the total memory used 
could be many times the value of work_mem; it is 
necessary to keep this fact in mind when choosing the 
value. Sort operations are used for ORDER BY, DISTINCT, 
and merge joins. Hash tables are used in hash joins, 
hash-based aggregation, and hash-based processing of IN 
subqueries. 

私はここに、おそらく完全に間違っているbut..isn't基本的にオペレーティングシステムで「仮想メモリ」と同じことを「一時ディスクファイルへの切替え」? RAMが消えたら、OSはスワップファイルを作成しませんか?これを100TBのようなものに設定し、OSがそれを理解できるようにする方が良いのではないでしょうか?潜在的に私のシステムを台無しにする前に、誰かが実際にこのアプローチを試みたかどうかを確認したい。

答えて

6

例えば、PostgreSQLは、ディスク内ソートよりもメモリ内ソートよりも適しているソート操作に切り替わります。を知っていると、ソートはスワップで起こるかどうかわかりません。

また、PostgreSQLは、データがRAMに収まらないことが分かった場合、全く異なるプラン(たとえば、別のJOINメソッドを使用)に切り替えることができます。

work_memが高すぎるに設定するは、すべてが必ずしもRAMに収まらないように十分なデータを取得するとすぐに非常に遅いデータベースを取得します。

0

OSはスワップを扱うという点では一般的ですが、プロセスが使用できる限られたアドレス空間があります。これは32ビットシステムではあまり大きくありません(Windows 32ビットプラットフォームで2Gb、 3Gbに強化されました)、あなたが正しいとすれば、OSに仮想メモリを通してこれを処理させることができます。

PostgreSQLはディスクよりもはるかにデータを構造化する方法を知っているので、メモリを使い切ってからデータベースを明示的なファイル処理に切り替えることは、OS扱う。

4

スワップするデータベースサーバーは、無効なデータベースサーバーです。

RAMでは、postgresはquicksortを使用します。ディスク上では、ハードディスクにはるかに適した別のアルゴリズムが使用されます。スワップアウトされたメモリにクイックソートを使用することは非常に遅くなります。

+0

'スワップするデータベースサーバーはデッドデータベースサーバーです。' – hopla

4

work_memは、で使用できるRAMの最大量で、の1回の並べ替え操作であることに注意してください。単一の照会の場合、複数のソート操作が並行して実行され、データベースに一度に照会する複数の接続が存在する可能性があります。そのため、すべてのソート操作でRAMのwork_memのx倍を使用することができます(これが控えめな理由です)。

このような高い値をwork_memに設定すると、並べ替え操作によってRAMの大部分が使用され、スワップからのページの出し入れにつながります(覚えておいてください。プロセスやPostgreSQLの一部にはRAMを必要とするディスクベースのソート操作は、OSによって行われるページスワップよりも効率的な要素であると指摘されています。常にでは非常に遅い実行されます。

もう一つのポイントは、このような高いwork_mem値は、単一のクエリが(故意または事故によって)多かれ少なかれ全体のデータベースサーバが応答しなく行かせるかもしれないこと、である。

関連する問題