アート・オブ・SQL

―パフォーマンスを引き出すSQLプログラミング手法

[cover photo]
TOPICS
Programming , Database
発行年月日
PRINT LENGTH
332
ISBN
978-4-87311-336-4
原書
The Art of SQL
FORMAT
PDF
Ebook
3,520円
Ebookを購入する

本書は、『孫子』の「兵法(Art of War)」に着想を得て、SQLの基本原理を基に、DBプログラミング現場で取得された戦術を解説します。データベースはシステムの要であり、効率の悪いコードは長年にわたりパフォーマンスに影響を与えます。コードは初めから俊敏に動かなくてはならず、そのためにはSQL言語について確かな理解が必要です。本書では、インデックス付け、効率的なデータベースアクセス、階層データの扱い、大量データへの対処、応答時間改善の試みなど、さまざまな面からデータベースのパフォーマンスを最大限に引き出すためのコードの書き方を解説します。さらに、開発者自身がより良いDB開発のために、優れた疑問を示せるようになるため、SQLの理論と原則を解説し、効果的なSQL戦術を身に着けます。応用の利くデータベースエンジニアになるためのSQL戦略をまとめた本書はエキスパートになるための一冊です。

目次

まえがき

1章 計画の策定
	――パフォーマンスのためのデータベース設計
	1.1 データのリレーショナルな見方
	1.2 正規形であることの重要性
		1.2.1 ステップ1:原子性を確保する
		1.2.2 ステップ2:キー全体の依存性を調べる
		1.2.3 ステップ3:属性の独立性を調べる
	1.3 存在するかしないか、またはnullであるか
	1.4 ブール型列の適格性の検証
	1.5 サブタイプの理解
	1.6 自明事項の表明
	1.7 過度の柔軟性の危険
	1.8 履歴データの困難性
	1.9 設計とパフォーマンス
	1.10 フローの処理
	1.11 データの集中化
	1.12 システムの複雑性
	1.13 完成した計画

2章 戦争の実施
	――効率的なデータベースアクセス
	2.1 クエリの識別
	2.2 定常的なデータベース接続
	2.3 戦術の前に戦略
	2.4 解決の前に問題定義
	2.5 安定したデータベーススキーマ
	2.6 実際のデータに対する操作
	2.7 SQLにおける集合処理
	2.8 動作をまとめたSQL文
	2.9 有益なデータベースアクセス
	2.10 DBMSカーネルへの近さ
	2.11 必要なことだけを行う
	2.12 SQL文はビジネスロジックを反映する
	2.13 プログラムロジックをクエリに含める
	2.14 一度での複数の更新
	2.15 ユーザ定義関数の使用の注意
	2.16 簡潔なSQL
	2.17 SQLを使った攻撃的なコーディング
	2.18 例外の見識ある使用

3章 戦術的な配置
	――インデックス付け
	3.1 「入口」の特定
	3.2 インデックスと内容一覧
	3.3 インデックスを機能させる
	3.4 関数と変換を伴ったインデックス
	3.5 インデックスと外部キー
	3.6 同じ列に対する複数のインデックス付け
	3.7 システム生成キー
	3.8 インデックスアクセスの可変性

4章 策 略
	――SQL文の考察
	4.1 SQLの性質
		4.1.1 SQLとデータベース
		4.1.2 SQLとオプティマイザ
		4.1.3 オプティマイザの限界
	4.2 SQL術を規定する5つの要因
		4.2.1 データの総量
		4.2.2 結果セットを定義する基準
		4.2.3 結果セットのサイズ
		4.2.4 テーブル数
		4.2.5 他のユーザ数
	4.3 フィルタリング
		4.3.1 フィルタリング条件の意味
		4.3.2 フィルタリング条件の評価
		4.3.3 大量データの問い合わせ
		4.3.4 取得データの割合

5章 地 形
	――物理的実装の理解
	5.1 構造の種類
	5.2 矛盾する目的
	5.3 インデックスをデータリポジトリとみなす
	5.4 強制的な行の順序付け
	5.5 自動的なデータのグループ化
		5.5.1 ラウンドロビンパーティショニング
		5.5.2 データ駆動型パーティショニング
	5.6 パーティショニングは諸刃の剣
	5.7 パーティショニングとデータ分布
	5.8 最善のデータパーティショニング方法
	5.9 テーブルの事前結合(pre-join)
	5.10 聖なる簡潔性

6章 9つの状況
	――標準的なSQLパターンの理解
	6.1 小さな結果セット、直接的で限定的な基準
		6.1.1 インデックスの有用性
		6.1.2 クエリの効率とインデックスの使用
		6.1.3 データの分散度合い
		6.1.4 基準に対するインデックス付けの有意性
	6.2 小さな結果セット、間接的な基準
	6.3 広範囲な基準の小さな共通集合
	6.4 小さな共通集合、間接的で広範囲な基準
	6.5 大きな結果セット
	6.6 1つのテーブルの自己結合
	6.7 集約によって取得した結果セット
	6.8 日付に対する簡単な検索や範囲検索
		6.8.1 多数の品目、少数の履歴値
		6.8.2 品目ごとに多数の履歴値
		6.8.3 現在値
	6.9 データの不在に基づいて断定される結果セット

7章 戦略におけるバリエーション
	――階層データの扱い
	7.1 ツリー構造
		7.1.1 ツリー構造対マスタ/ディテール関係
		7.1.2 階層の実例
	7.2 SQLデータベースでのツリーの表現
	7.3 ツリーの実際の実装
		7.3.1 隣接モデル
		7.3.2 実体化パスモデル
		7.3.3 ネスト化集合モデル(Celko以降)
	7.4 SQLを使ったツリーの探索
		7.4.1 トップダウン探索:バンダムクエリ
		7.4.2 ボトムアップ探索:高地人クエリ
	7.5 ツリーからの値の集約
		7.5.1 リーフノードに格納されている値の集計
		7.5.2 さまざまなレベルを超えた割合の伝播

8章 弱みと強み
	――困難な状況の理解と対処
	8.1 欺きの基準
	8.2 抽象層
	8.3 分散システム
	8.4 動的に定義された検索基準
		8.4.1 簡単な映画データベースとメインクエリの設計
		8.4.2 適切なサイズのクエリ
		8.4.3 PHPでのSQLのラッピング

9章 複数の戦線
	――並列処理への取り組み
	9.1 サービス提供者としてのデータベースエンジン
		9.1.1 インデックスの長所
		9.1.2 なるべくしてなった物語
		9.1.3 列に並ぶ
	9.2 同時データ変更
		9.2.1 ロック
		9.2.2 競合

10章 戦力の集結
	――大量データへの対処
	10.1 データ量の増加
		10.1.1 データ量増加に対する操作の影響度
		10.1.2 救済のためのパーティショニング
		10.1.3 データパージ
	10.2 データウェアハウジング
		10.2.1 ファクトとディメンション:スタースキーマ
		10.2.2 クエリツール
		10.2.3 抽出、変換、ローディング
		10.2.4 ディメンションとファクトの問い合わせ:アドホックレポート
		10.2.5 (厳しい)注意点

11章 計 略
	――応答時間改善の試み
	11.1 データの改善
		11.1.1 列であるべき行
		11.1.2 行であるべき列
		11.1.3 別のものであるべき単一の列
	11.2 リスト内の変数を使った問い合わせ
	11.3 範囲(幅)での集約
	11.4 汎用的な状況の置き換え
	11.5 リスト内の複数項目に一致する行の選択
	11.6 ベストマッチの検索
	11.7 オプティマイザディレクティブ

12章 スパイの利用
	――パフォーマンスの監視
	12.1 データベースが遅い
	12.2 サーバ負荷の要素
	12.3 優れたパフォーマンスの定義
		12.3.1 何に出費しているかを知る
		12.3.2 何を得るかを知る
		12.3.3 一般に認められた基準との対比
		12.3.4 パフォーマンス目標の定義
	12.4 ビジネスタスクという観点での考察
	12.5 実行計画
		12.5.1 最速の実行計画の特定
		12.5.2 正しい実行計画の強要
	12.6 実行計画の適切な利用
		12.6.1 クエリを実行しない方法
		12.6.2 隠れた複雑さ
	12.7 本当に重要なこと

索 引