SQLパフォーマンス詳解読書会(7)ノート
インデックスを使ったgroup by
- group by のアルゴリズム
部分結果
パイプライン化したorder byの使い方
最初のN行のみの選択
fetch first
(SQL 2008/PostgreSQL/DB2)LIMIT 10
(MySQL/PostgreSQL)SELECT * FROM rownum <= 10
(Oracle)SELECT TOP 10 FROM~
memo
ページング
- 複数間結果を10件ずつ区切って一つ一つ選択していく方式
- ”(1) 順序付けはクエリが呼び出 される度にやり直されるので、新しい売上が挿入されるとページがずれ てしまいます。”(p149)
- repeatable read だとずれない
- オフセット法
- order byした結果をoffset句で飛ばす範囲を指定する
- limitで必要な行数を指定する
- シーク法
- 前ページの最終値”?”を指定し、sort対象の列 < ? をwhere句で与える(Order by DESCの場合)
- sort 対象の列がユニークである場合にのみ可能
- window関数
... row_number() over() rn ... where rn between 11 and 20
STOP KEY
が実行計画に出ていない場合はパイプライン化できない可能性がある- OVER句が含まれる内側のクエリがマテリアライズされることがある
行値式:標準SQLだが実装の足並みが揃っていない。DB2とPostgreSQLがサポート
- Oracle範囲条件検索は非サポート(ORA-01796)
- SQL Server 2017 非サポート
- MySQL インデックスのアクセス述語として使用不可