あなたの春の掃除リストにあなたのデータベースを加えてください
7866 ワード
あなたのデータベースの行を削除または更新するたびに、古いレコードは秘密にまだ背景に隠れているとハードドライブ上のスペースを取っている.
エー
しかし、どのように理解することが重要です
Postgresと他のデータベースがどのように、そしてどのように自分自身をきれいにするかを理解することによって、あなたはあなたのデータベースを低応答時間とデータベースサーバーの適切な量の保管のために調整することができます.
この投稿では次のようにします. 真空プロセスとは何か 完全対自動真空 このプロセスの変更と検査方法
Postgresテーブルの更新.SQLエディタ
データベースの寿命の間に、我々は上記のようなデータベースに何千もの変化をするかもしれません.しかし、レコードを削除することは実際にディスクスペースを解放しません.
Postgresはマルチバージョン同時実行制御(MVCCとしても知られている)を使用して、同時のデータアクセスと一貫性を保証します.
SQL文を実行するたびに、すべての行の代わりにデータのスナップショットを使用します.これは、ユーザーが並行トランザクションによって生成される矛盾したデータを表示するのを防ぎます.また、データを読み書きしようとするさまざまなセッションに対するロック満足を最小化します.
各トランザクションは、トランザクションID
たとえば、下の画像では、ユーザーAは2つのレコードを空のテーブルに挿入します.ユーザBがAを走らせるならば
MVCCデータアクセス例
我々が実行するとき
削除コマンド:postgresは物理的にタプルを削除しません既存のタプルをマークする
更新コマンド:アップデートステートメントは あなたが頻繁にDML(挿入、更新、削除)声明を持っているならば 死んだタプルを取り除く デッドタプルを指すインデックスタプルを削除する 統計情報を更新 SQL文がどのように実行され、メンテナンス要件がどのようになっているのかを知ることができます
Postgresは
The Postgresは、ターゲットテーブルのすべてのページをスキャンし、デッドタプルのリストを作成します.必要に応じて古いタプルを凍結します. デッドタプルリストを参照することで、デッドタプルを指すインデックスタプルを削除します. それ以降のターゲットテーブルのシステムカタログだけでなく、統計情報を更新
インパクトを発揮します
我々が作成したテーブルはハードドライブ上のスペースの443ページを使用し、データのすべてが順次追加されたため、それは0の完全な空き容量比を持っています.
今、私は100より大きい値ですべてのレコードを削除します.しかし、我々が上記のコマンドを再実行するならば、ページと自由空間比率の数は変わりません.
今我々は我々が使用されるページの数を見ることができるスペースの使用状況を追跡するときに443から1になっている!しかし、このページのフリースペースと使用スペースの比率も0から49 %に増加しました.このスペースをオペレーティングシステムに戻すことができます
真空図
The
したがって、バルクデータの削除や更新を行う場合、これらのデッドタプルによって占有されるスペースによってあまりにも多くのストレージを使用することがあります.The 新しい空のストレージテーブルファイルを作成します. ライブタプルを新しいテーブルストレージにコピーします. 古いテーブルファイルを削除し、ストレージを開放します. これは、すべての関連付けられたインデックスを再構築し、システムカタログや統計情報を更新します. どのように実行してください
空き容量比は、現在50 %から0 %まで下がっています.
たとえば、下の画像では、4ページのテーブルがあります.つのページには、デッドタプルがあります.可視マップは、特定のページにデッドタプルを定義するビットマップを使用します. ビット0 :ページ上のデッドタプルは、したがってスキップ ビット1 :ページは、デッドタプルから成ります;したがって、 デッドタプルを追跡するためのPostgresの可視性マップ
Postgres自動バキュームデーモンを使用して、Vaccum処理を自動化します.デフォルトでは、1分ごとに実行されます.vaccumが目覚めるとき、それは3人の労働者を呼び出します.これらの作業者は、ターゲットテーブル上のVaccum処理を行う.
PGRADES設定を問い合わせることで、Postgresでの自動バキュームプロセスのさまざまな設定を確認できます.
あなたが列の何百万を持っているならば、自動的に掃除して、毎分、データベースをreindexingすることは最適でないかもしれません.したがって、テーブルレベルを設定できます.テーブルレベルの設定を指定すると、グローバル設定をバイパスします.
たとえば、以下のクエリではautovacuumを設定します
我々が知っているように、完全な真空プロセスはオペレーティングシステムにスペースを取り戻します.しかし、完全な真空はその処理のためのテーブルの排他的ロックを必要とします、そして、それは他のすべての取引をブロックします.以下の表では、これらのプロセス間の違いを要約することができます.
真空対真空フル
この記事では、以下を取り上げました. Postgresの実装方法 使用 使用 個々のテーブルの自動バキュームの設定 これらの概念は,高いアベイラビリティを維持しながらデータベースのサーバコストを削減するのに有用である.上記の記事に示すクエリを使用すると、データベースの内部およびそのメモリ消費を検査できます.
場合は、直感的なインターフェイスと簡単にデータの可視化とSQLエディタをしたい.
ArcTypeによるデータ視覚化
エー
VACUUM
プロセスは、あなたのラップトップでリサイクルビンを空にするようです.それはスペースをクリアし、索引付け時間を減らし、あなたのデータベースを清潔に保つ.しかし、どのように理解することが重要です
VACUUM
あなたが夕食パーティーの真ん中であなたの家を掃除するのと同じくらいを避けることができるように、働きます.Postgresと他のデータベースがどのように、そしてどのように自分自身をきれいにするかを理解することによって、あなたはあなたのデータベースを低応答時間とデータベースサーバーの適切な量の保管のために調整することができます.
この投稿では次のようにします.
PostgresがSQL文を実行する方法
Postgresテーブルの更新.SQLエディタ
データベースの寿命の間に、我々は上記のようなデータベースに何千もの変化をするかもしれません.しかし、レコードを削除することは実際にディスクスペースを解放しません.
Postgresはマルチバージョン同時実行制御(MVCCとしても知られている)を使用して、同時のデータアクセスと一貫性を保証します.
SQL文を実行するたびに、すべての行の代わりにデータのスナップショットを使用します.これは、ユーザーが並行トランザクションによって生成される矛盾したデータを表示するのを防ぎます.また、データを読み書きしようとするさまざまなセッションに対するロック満足を最小化します.
各トランザクションは、トランザクションID
BEGIN
and COMMIT
文.ユーザーが行を挿入すると、トランザクションがコミットされない場合、他のユーザーは新しく挿入された行を見ることができません.たとえば、下の画像では、ユーザーAは2つのレコードを空のテーブルに挿入します.ユーザBがAを走らせるならば
SELECT
ステートメントは、レコードがコミットされる前に0行を取得します.同様に、削除トランザクションステートメントがコミットされていない場合、別のユーザーはまだ削除ステートメントのテーブルデータを取得します.MVCCデータアクセス例
我々が実行するとき
DELETE
or UPDATE
Postgreresは以下のようにします.削除コマンド:postgresは物理的にタプルを削除しません既存のタプルをマークする
DEAD
. 更新コマンド:アップデートステートメントは
DELETE
プラスINSERT
文.したがって、既存のタプルをDEAD
を挿入し、新しいタプルを挿入します.DEAD
タプルは不要なスペースを取ることができます.スペースを解放するには、以下のメンテナンスプロセスを実行しなければなりません.VACUUM
プロセス.真空によるデッドタプルのクリーニング
Postgresは
VACUUM
除去のためのメンテナンスプロセスDEAD
タプルそれは更なるデータ挿入で再利用のために死んだタプルによって占められるスペースを回収します.The
VACUUM
他のDMLトランザクションと同時に実行できます.なぜなら、テーブルに排他ロックを適用しないからです.死んだタプルを除去するために以下の操作を行う.VACCUM
処理また、FSM(フリースペースマップ)とVM(可視マップ)を更新します.Postgresの真空の例
インパクトを発揮します
VACUUM
例のテーブルを作成し、いくつかの値を削除し、VACUUM
コマンド.この例ではpg_freespacecamp
宇宙利用の改善を監視する拡張データの自動生成された一連のテーブルを作成する
create table SampleTable(id1 int, id2 int);
insert into
SampleTable
values (
generate_series(1,100000),
generate_series(1,100000)
);
を使用して測定空き領域の使用
create extension pg_freespacemap;
SELECT
count(*) as npages,
round(100 * avg(avail) / 8192, 2) as avg_fs_ratio
FROM
pg_freespace(
'SampleTable');
SQLエディタ我々が作成したテーブルはハードドライブ上のスペースの443ページを使用し、データのすべてが順次追加されたため、それは0の完全な空き容量比を持っています.
今、私は100より大きい値ですべてのレコードを削除します.しかし、我々が上記のコマンドを再実行するならば、ページと自由空間比率の数は変わりません.
delete from SampleTable where id1 > 10;
未使用のページを削除するには、vacuumコマンドを実行しなければなりません.VACUUM sampletable;
SQLエディタ今我々は我々が使用されるページの数を見ることができるスペースの使用状況を追跡するときに443から1になっている!しかし、このページのフリースペースと使用スペースの比率も0から49 %に増加しました.このスペースをオペレーティングシステムに戻すことができます
VACUUM FULL
.真空フルは何ですか?
真空図
The
VACUUM
プロセスは将来の使用のために死んだタプルを取り除きますが、それはオペレーティングシステムにスペースを返しません.したがって、バルクデータの削除や更新を行う場合、これらのデッドタプルによって占有されるスペースによってあまりにも多くのストレージを使用することがあります.The
VACUUM FULL
プロセスは、オペレーティングシステムにスペースを返します.次の作業を行います.VACUUM FULL
テーブルの排他ロックを取得します.VACUUM FULL
コマンドは以前のサンプルテーブルに影響を与えます.vacuum full SampleTable;
SELECT
count(*) as npages,
round(100 * avg(avail) / 8192, 2) as avg_fs_ratio
FROM
pg_freespace(
'SampleTable');
SQLエディタ空き容量比は、現在50 %から0 %まで下がっています.
Postgresの真空性能
VACUUM
ターゲットテーブルのすべてのページをスキャンする必要があるので、クリーニングは高価です.あなたが100万行で大きなテーブルを持っているならば、それはあなたのデータベース資源に有害でありえます.リソースを保存するには、Postgresは可視性マップを使用します.Postgresの各テーブルには、テーブル内のページがデッドタプルを持つかどうかを判断するVMがあります.ページがデッドタプルを持たない場合、バキューム処理はページをスキップします.たとえば、下の画像では、4ページのテーブルがあります.つのページには、デッドタプルがあります.可視マップは、特定のページにデッドタプルを定義するビットマップを使用します.
VACCUM
処理VACCUM
その特定のページ.Postgres自動バキュームデーモン
Postgres自動バキュームデーモンを使用して、Vaccum処理を自動化します.デフォルトでは、1分ごとに実行されます.vaccumが目覚めるとき、それは3人の労働者を呼び出します.これらの作業者は、ターゲットテーブル上のVaccum処理を行う.
PGRADES設定を問い合わせることで、Postgresでの自動バキュームプロセスのさまざまな設定を確認できます.
select name,
setting,
category,
short_desc
from pg_settings
where name like '%autovacuum%'
Postgres自動真空設定.SQLエディタPostgresの特定のテーブルのためにautovacuumを修正する方法
あなたが列の何百万を持っているならば、自動的に掃除して、毎分、データベースをreindexingすることは最適でないかもしれません.したがって、テーブルレベルを設定できます.テーブルレベルの設定を指定すると、グローバル設定をバイパスします.
たとえば、以下のクエリではautovacuumを設定します
SampleTable2
それが100以上の死んだタプルを持っているならば.ALTER TABLE SampleTable2 SET (autovacuum_vacuum_scale_factor = 0, autovacuum_vacuum_threshold = 100)
真空対真空フル
我々が知っているように、完全な真空プロセスはオペレーティングシステムにスペースを取り戻します.しかし、完全な真空はその処理のためのテーブルの排他的ロックを必要とします、そして、それは他のすべての取引をブロックします.以下の表では、これらのプロセス間の違いを要約することができます.
真空対真空フル
結論
この記事では、以下を取り上げました.
delete
and update
文VACUUM
玉子を取るVACUUM FULL
スペースをOSに戻す場合は、直感的なインターフェイスと簡単にデータの可視化とSQLエディタをしたい.
ArcTypeによるデータ視覚化
Reference
この問題について(あなたの春の掃除リストにあなたのデータベースを加えてください), 我々は、より多くの情報をここで見つけました https://dev.to/arctype/add-your-database-to-your-spring-cleaning-list-1e9kテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol