Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Performance_loss_due_to_data_file_extend
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
nuko_yokohama
February 20, 2023
Technology
330
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Performance_loss_due_to_data_file_extend
Is there any performance impact from PostgreSQL data file extend?
nuko_yokohama
February 20, 2023
More Decks by nuko_yokohama
See All by nuko_yokohama
PostgreSQL ECPG
nuko_yokohama
0
68
PostgreSQL 18 is coming soon!
nuko_yokohama
0
420
BRIN(Block Range INdex)
nuko_yokohama
1
530
ltree extension
nuko_yokohama
1
870
PostgreSQL Built in Sharding
nuko_yokohama
0
840
PostgreSQL 16 Support load balancing in libpq
nuko_yokohama
0
580
PostgreSQL 16 Add pg_stat_io view, providing more detailed IO statistics
nuko_yokohama
0
290
Do PostgreSQL 16 Dream of Multi-Master Replication?
nuko_yokohama
0
1.4k
Apache AGE
nuko_yokohama
0
510
Other Decks in Technology
See All in Technology
消えない 動かない 効かない
yama3133
1
120
Omarchy Quattro の日本語設定周り
simosako
2
170
AI時代、データエンジニアが一番おもろい
genshun9
0
440
20260912_スクフェス三河
kgnkhkr
0
330
20260912_スクラムにジェネラリストは必要か
ryugen04
0
390
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
3
290
AIに丸投げしないトイル削減 / Eliminating Toil Without Leaving It All to AI
kohbis
4
1.1k
AIオーケストレーションを活用した 開発ワークフローの設計と実践
bqnq
0
170
日経電子版を支えていく Kasane Design System/fec_fukuoka
nikkei_engineer_recruiting
0
1.2k
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
840
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
230
家のリアーキテクト・リファクタリング
suguruooki
0
140
Featured
See All Featured
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
How to train your dragon (web standard)
notwaldorf
97
6.8k
Balancing Empowerment & Direction
lara
6
1.3k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.2k
The World Runs on Bad Software
bkeepers
PRO
72
12k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.9k
Prompt Engineering for Job Search
mfonobong
0
450
Abbi's Birthday
coloredviolet
3
9.9k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
520
Navigating Team Friction
lara
192
16k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
Transcript
データファイルの拡張による パフォーマンス低下はあるのだろうか PostgreSQL Unconferecnce #39 (2023-02-20) トーク 10 分 議論
10 分 くらいです
自己紹介 • ぬこ@横浜 , @nuko_yokohama • にゃーん • 趣味でポスグレをやってる者だ •
体重&お腹が EXTEND して困っています
PostgreSQL のデータファイル拡張
PostgreSQL のデータファイル • PostgreSQL のテーブルやインデックスはファイル化されている – 8KB 単位のブロックが連続しているファイル – ファイルサイズは可変(
0 バイト~ 1GB ) • 事前の領域確保はされない。 ブロック (8KB) ブロック (8KB) ブロック (8KB) ブロック (8KB) ・・・ ブロック (8KB) ブロック (8KB) ブロック (8KB) ブロック (8KB) ・・・ ブロック (8KB) ブロック (8KB) ブロック (8KB) ・・・ ・・・ ブロック (8KB) 最大 1GB 最終ブロックは 1GB 以下 セグメントファイル セグメントファイル セグメントファイル
PostgreSQL のデータファイルの拡張 / 縮小 • 拡張 – データ挿入( INSERT/COPY FROM
)時 – データ更新( UPDATE )時 • FILLFACTOR が 100 だと拡張しやすい • HOT 更新でない場合 • 縮小 – TRUNCATE (切り詰め) – VACUUM FULL/CLUSTER (再編成) – 全件 DELETE 後の VACUUM
PostgreSQL のデータファイルの拡張 • データファイルはブロック( 8KB )単位で拡張する • 1 ブロックのサイズは極端に大きくはないものの、拡張のコス トはタダではないのではないか。
– ページサイズ分のディスクへの書き込み – 拡張時のロック (wait_event の extend? ) • 拡張しない状態だと挿入等は早くなるの?
拡張なし 状態の作り方 • テーブルに最後に挿入されたレコード「以外」を DELETE • VACUUM – VACUUM FULL
ではない! • テーブルに最後に挿入されたレコードを DELETE • 環境: Linux/PostgreSQL 15.2
拡張なし 状態の作り方(無理やり) ブロック (8KB) ブロック (8KB) ブロック (8KB) ブロック (8KB)
・・・ ブロック (8KB) 無効領域 無効領域 1 レコードのみ残 他は無効領域 ・・・ 無効領域 空き領域 空き領域 1 レコードのみ残 他は空き領域 ・・・ 無効領域 空き領域 空き領域 空き領域 1 レコード無効 他は空き領域 ・・・ 空き領域 空き領域 初期状態 最終ブロックの 1 件 以外を DELETE VACUUM VACUUM
実験 1 :バルクコピー
実験 1 :バルクコピー • pgbench_hisotry を以下の条件で定義 – UNLOGGED TABLE –
FILFACTOR=100 • 検証パターン – 拡張あり: TRUNCATE 後に COPY – 拡張なし:スライド 7 の状態から COPY • 400,000 件のデータを COPY FROM で登録
実験 1 :バルクコピー • 拡張なしの場合、約 5% 程度 COPY 時間が短縮 拡張あり
拡張なし 0 100 200 300 400 500 460.28 440.44 pgbench_history COPY(40 万件 ) 処理時間 (3 回測定の平均 ) 処理時間( ms ) 効果はいまひとつだ…
実験 2 :複数クライアントからの挿入
実験 2 :複数クライアントからの挿入 • pgbench_hisotry を以下の条件で定義 – UNLOGGED TABLE –
FILFACTOR=100 • 検証パターン – 拡張あり: TRUNCATE 後に pgbench 実行 – 拡張なし:スライド 7 の状態から pgbench 実行 • 今回は 4 ~ 32 クライアント各 10 万~ 1.25 万回 INSERT
実験 2 :複数クライアントからの挿入 • 検証に使ったスクリプト (ins-only.txt) \set aid random(1, 100000
* :scale) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta,CURRENT_TIMESTAMP); END; • pgbench のオプション – DB 名、ユーザ名、ポート番号は省略 pgbench -c 4 -t 100000 -n -r -f ins-only.txt
実験 2 :複数クライアントからの挿入 拡張あり 拡張なし 0.0 0.1 0.2 0.3 0.4
0.5 0.09 0.10 0.13 0.14 0.16 0.17 pgbench_history 4Cli INSERT(10 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.14 0.14 0.17 0.17 0.26 0.25 pgbench_history 8Cli INSERT(5 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 0.30 0.30 0.3 0.3 0.54 0.54 pgbench_history 16Cli INSERT(2.5 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 0.5 1.0 1.5 2.0 0.64 0.65 0.63 0.63 1.07 1.07 pgbench_history 32Cli INSERT(1.25 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 効果なし…
実験 2 :複数クライアントからの挿入 • pgbench_history のレコード長が短い( 30 バイト程度)だと効果が みえないのかも •
1ブロック内に格納されるレコード数が多い→ブロック拡張の契機が 少ない?
実験 2-2 :複数クライアントからの挿入 ( レコード長拡大)
実験 2-2 :複数クライアントからの挿入 • longrec というテーブルを定義 – UNLOGGED TABLE –
FILFACTOR=100 • 検証パターン – 拡張あり: TRUNCATE 後に pgbench を実行 – 拡張なし:スライド 7 の状態から pgbench を実行 • 今回は 1 ~ 16 クライアント各 10 万~ 6250 回 INSERT CREATE UNLOGGED TABLE longrec ( aid integer, mtime timestamp, data text -- ここに長大文字を入れる )
実験 2-2 :複数クライアントからの挿入 拡張あり 拡張なし 0.0 0.1 0.2 0.3 0.4
0.5 0.6 0.05 0.05 0.39 0.39 0.07 0.07 longrec 1Cli INSERT(10 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 0.2 0.4 0.6 0.8 1.0 1.2 0.11 0.11 0.67 0.66 0.32 0.33 longrec 4Cli INSERT(2.5 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 0.5 1.0 1.5 2.0 2.5 0.18 0.18 1.09 1.07 0.99 1 longrec 8Cli INSERT(1.25 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 拡張あり 拡張なし 0.0 1.0 2.0 3.0 4.0 5.0 0.76 0.75 1.08 1.05 2.39 2.4 longrec 16Cli INSERT(0.625 万件 ) 処理時間 (3 回測定の平均 ) BEGIN INSERT COMMIT 平均レイテンシ( ms ) 効果なし…
みんなに聞いてみたいこと
データファイル領域の事前確保 • PostgreSQL のデータファイルが 事前確保されていれば嬉しいケースって何かあるだろうか? – 実はそんなケースはないのか? – 拡張時のコストは気にするものではない? •
事前領域確保のスマートな方法はないものか。 – PostgreSQL 標準機能でもっとスマートにできないか? – 誰かこんなユーティリティ作っていたりしない?
みなさまのコメント • Oracle とかだと表領域として OS レベルでの連続領域をとっていた りした • ある程度のサイズ(数百 GB
)のテーブルで DELETE→VACUUM 切 り詰め→ INSERT の繰り返しのようなケースで問題になった ( PG14 で改善?) – SR 構成のスタンバイが上記のような状態で影響を受ける • テーブル AM として、事前確保+なるべく拡張しないものを作ると いうのが PostgreSQL の作法なのかもしれない。
おしまい