web-dev-qa-db-ja.com

テーブルスペースを変更するとスペースが無駄になるようです

日付範囲で分割されたテーブルを含む大きな(数Tバイトの)Postgresデータベース(Windowsではv10)があります。ボリュームに応じて、一部は日ごとにパーティション化され、他は月ごとにパーティション化されます。

SSDドライブに「fastspace」と従来の磁気ハードディスクに「slowspace」の2つの主なテーブルスペースがあります。

データが古くなり、関連性が低くなると、パーティションをfastspaceからslowspaceに移動します

ALTER TABLE..... SET TABLESPACE slowspace

テーブルスペースを変更する前後に、利用可能なディスク領域(OSレベルで)のチェックを開始しましたが、宛先ドライブ(slowspace)が、ソースドライブ(fastspace)が増加しています。

典型的なテーブルには、数ギガバイトのスペースを占有する1か月間の1億行のデータが含まれる場合があります。表領域を変更すると、x-Gバイトの領域がfastspaceから解放される可能性がありますが、宛先表領域slowspaceは2xGバイトの領域を失います。 (テーブルとインデックスの両方を同時に移動しています)

なぜ違いがあり、状況を改善するために何ができるでしょうか?

テーブルスペースの変更は比較的速いプロセスです(時間は分単位で測定されます)が、パーティションをスロースペースに移動した後に別のVACUUMを実行すると非常に時間がかかります(時間単位で測定される時間)。 VACUUMのようなパフォーマンス集約型の操作が最速のディスクで実行されるように最善を尽くすため、これは二重に苛立たしいことです。データをより遅いディスクに移動し、すぐに非常に遅い操作を強制的に開始して失われたスペースを取り戻すのは非常に煩わしいです。

コメントに応じて更新...ブロックサイズの問題かどうかは不明です。私のディスクは両方とも512バイト/セクターで、postgresページサイズは(私が思うに)データベースごとに設定されており、テーブルスペースごとに設定されていません)

どちらのディスクもNTFSです。システム情報/コンポーネント/ストレージ/ディスクによると、「fastspace」ディスクは次のようになります...

Description Disk drive
Manufacturer    (Standard disk drives)
Model   BIWIN SSD
Bytes/Sector    512
Media Loaded    Yes
Media Type  Fixed hard disk
Partitions  4
SCSI Bus    0
SCSI Logical Unit   0
SCSI Port   0
SCSI Target ID  0
Sectors/Track   63
Size    238.47 GB (256,052,966,400 bytes)
Total Cylinders 31,130
Total Sectors   500,103,450
Total Tracks    7,938,150
Tracks/Cylinder 255
Partition   Disk #0, Partition #0
Partition Size  260.00 MB (272,629,760 bytes)
Partition Starting Offset   1,048,576 bytes
Partition   Disk #0, Partition #1
Partition Size  236.67 GB (254,119,553,536 bytes)
Partition Starting Offset   407,896,064 bytes
Partition   Disk #0, Partition #2
Partition Size  960.00 MB (1,006,632,960 bytes)
Partition Starting Offset   254,528,192,512 bytes
Partition   Disk #0, Partition #3
Partition Size  500.00 MB (524,288,000 bytes)
Partition Starting Offset   255,535,874,048 bytes

そして、このような「スロースペース」ディスクは....

Description Disk drive
Manufacturer    (Standard disk drives)
Model   Toshiba MQ01ABD100
Bytes/Sector    512
Media Loaded    Yes
Media Type  Fixed hard disk
Partitions  1
SCSI Bus    2
SCSI Logical Unit   0
SCSI Port   0
SCSI Target ID  0
Sectors/Track   63
Size    931.51 GB (1,000,202,273,280 bytes)
Total Cylinders 121,601
Total Sectors   1,953,520,065
Total Tracks    31,008,255
Tracks/Cylinder 255
Partition   Disk #1, Partition #0
Partition Size  931.39 GB (1,000,068,874,240 bytes)
Partition Starting Offset   135,266,304 bytes

ALTER TABLE ... SET TABLESPACEコマンドを使用する直前と直後にDriveInfo.AvailableFreeSpaceを使用して、移動の前後にディスク領域を監視するためにc#アプリを使用しています。

4
ConanTheGerbil

ファイルシステムのブロックサイズに関するコメントが関連する場合があります。 ファイルシステムブロックについてであり、ハードディスクブロックについてではないことに注意してください。これは通常、NTFS用語ではクラスターと呼ばれます。管理者として開いたcmdのコマンドfsutil fsinfo ntfsinfo [your drive]で確認できます。

fillfactorのようなストレージパラメータを確認することもできます。 (確信はありませんが)テーブルを新しいテーブルスペースに移動すると、テーブルブロックがコピーされるだけでなく、並べ替えられると思います。 updateまたはdeleteステートメントを発行したことがないテーブルをコピーした場合、新しいテーブルスペースのテーブルは元のテーブルになりますが、レコードを更新/削除した場合、新しいテーブルスペースのテーブルは「コンパクト」になり、いっぱいになりますすべての新しいブロックはfillfactorまでのみであり、すべてのブロックで将来の更新のためにいくらかのスペースを残します。 fillfactorが大きすぎる場合、これはディスク領域の無駄になります。

1
eppesuig