行指向ストレージとパーティション

PostgreSQLでクエリ性能を改善する

Amy McCarty

Instructor

データベースのストレージ形式

行指向ストレージ

  • 列間の関係を保持

列指向ストレージ

  • 行間の関係を保持
id name species age habitat received
01 Bob panda 2 Asia 2018
02 Sunny zebra 3 Africa 2018
03 Beco zebra 10 Africa 2017
04 Coco koala 5 Australia 2016
PostgreSQLでクエリ性能を改善する

行指向

行指向ストレージ

  • 列間の関係を保持

 

id name species age habitat received
01 Bob panda 2 Asia 2018
PostgreSQLでクエリ性能を改善する

列指向

列指向ストレージ

  • 行間の関係を保持  

2つのテーブル。1つ目はidとnameの一覧(01-Bob、02-Sunny、03-Beco、04-Coco)。2つ目は同じidに対するspecies一覧(01-panda、02-zebra、03-zebra、04-koala)。

PostgreSQLでクエリ性能を改善する

行指向ストレージ

 

  • 1行が同一ロケーションに保存
  • レコードの追加・削除が速い
  • 全列の取得が速い
    • 全行の取得は遅い
PostgreSQLでクエリ性能を改善する

行の削減

行数を減らす

  • WHERE フィルタ
  • INNER JOIN
  • DISTINCT
  • LIMIT
PostgreSQLでクエリ性能を改善する

行指向DBの手法

パーティション

  • 1つの(親)テーブルを小さな(子)テーブルに分割する方法

インデックス

  • 検索を高速化するために列キーをソートして作成する方法

 

パーティションとインデックスの利用

  • 設定と保守が必要
  • 存在はDB管理者やドキュメントで確認
PostgreSQLでクエリ性能を改善する

パーティション構造

動物園動物の親テーブル(id、name、species、habitat、receivedの4レコード)。01 - Bob - Panda - Asia - 2018。02 - Sunny - Zebra - Africa - 2018。03 - Beco - Zebra - Africa - 2017。04 - Coco - Macaw - South America - 2016。habitat列ごとに3つの子テーブルがあり、AsiaはBob、AfricaはSunnyとBeco、South AmericaはCocoのみ。

  • 親テーブル
    • DBフロントエンドで可視
    • ここに対してクエリを記述
  • 子テーブル
    • DBフロントエンドでは不可視
    • クエリは内部で検索
PostgreSQLでクエリ性能を改善する

パーティション構造

動物園動物の親テーブル(4レコード)。Asia、Africa、South Americaの子テーブルがあり、Africaのテーブルが赤枠で強調表示。

SELECT species
FROM zoo_animals
WHERE habitat = 'Africa'
PostgreSQLでクエリ性能を改善する

パーティション概要

What

  • 1つのテーブルを複数の小さなテーブルに分割

Why

  • 柔軟な保存
  • 高速なクエリ

Where

  • よく使うフィルタ列
    • 日付、場所
PostgreSQLでクエリ性能を改善する

パーティションのクエリ評価

クエリプランナー

大鍋を囲む複数のシェフ

EXPLAIN
SELECT species
FROM zoo_animals
WHERE habitat = 'Africa'

クエリ計画

Seq Scan on zoo_animals  (cost=0.00..
17.70 rows=2 width=182)
  Filter: (state_code = 15)
  • コスト(時間)の見積もり
PostgreSQLでクエリ性能を改善する

Let's practice!

PostgreSQLでクエリ性能を改善する

Preparing Video For Download...