日付範囲で分割されたテーブルを含む大きな(数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#アプリを使用しています。
ファイルシステムのブロックサイズに関するコメントが関連する場合があります。 ファイルシステムブロックについてであり、ハードディスクブロックについてではないことに注意してください。これは通常、NTFS用語ではクラスターと呼ばれます。管理者として開いたcmd
のコマンドfsutil fsinfo ntfsinfo [your drive]
で確認できます。
fillfactor
のようなストレージパラメータを確認することもできます。 (確信はありませんが)テーブルを新しいテーブルスペースに移動すると、テーブルブロックがコピーされるだけでなく、並べ替えられると思います。 updateまたはdeleteステートメントを発行したことがないテーブルをコピーした場合、新しいテーブルスペースのテーブルは元のテーブルになりますが、レコードを更新/削除した場合、新しいテーブルスペースのテーブルは「コンパクト」になり、いっぱいになりますすべての新しいブロックはfillfactorまでのみであり、すべてのブロックで将来の更新のためにいくらかのスペースを残します。 fillfactorが大きすぎる場合、これはディスク領域の無駄になります。