★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

第57章 テーブルサンプリングメソッドの書き方

目次

57.1. サンプリングメソッドサポート関数

PostgreSQLによるTABLESAMPLE句の実装は、SQL標準が求めるBERNOULLISYSTEMのメソッドに加え、ユーザ定義のテーブルサンプリングメソッドをサポートしています。 サンプリングメソッドは、TABLESAMPLE句が使用された際にどの行が選択されるかを決定します。

SQLレベルでは、テーブルサンプリングメソッドは、以下の呼び出し形式を持ち、典型的にはCで実装された単一のSQLの関数で表現されます。

method_name(internal) RETURNS tsm_handler

関数の名前はTABLESAMPLE句に現れるメソッド名と同じです。 internal引数は、ダミー(常に0の値を持つ)で、単にこの関数がSQLコマンドから直接呼ばれるのを防ぐために用意されています。 関数の戻り値は、pallocされたTsmRoutine型の構造体でなければなりません。 その構造体の中には、サンプリングメソッド用のサポート関数へのポインタが含まれています。 サポート関数は普通のC関数で、SQLレベルからは見ることも呼び出すこともできません。 サポート関数は57.1で説明されています。

関数へのポインタに加え、TsmRoutine構造体は以下の追加のフィールドを提供しなければなりません。

List *parameterTypes

このサンプリングメソッドが使用される際に、TABLESAMPLE句が受け付ける引数のデータ型のOIDが格納された、OIDのリストです。 たとえば、組み込みのメソッドに対しては、このリストは、サンプリングのパーセンテージを表すFLOAT4OIDという値を持つ単一の要素が含まれています。 カスタムサンプリングメソッドは、複数の異なるパラメータを持つことができます。

bool repeatable_across_queries

trueの場合、もし毎回同じ引数とREPEATABLEシード値が提供され、テーブル内容に変更がないならば、サンプリングメソッドは実行されたどの問い合わせに対しても、同一のサンプルを出力することができます。 falseの場合は、サンプリングメソッドを使用する際にREPEATABLE句を受け付けません。

bool repeatable_across_scans

trueの場合、サンプリングメソッドは同じ問い合わせ内で実行されたどのスキャンに対しても、同一のサンプルを出力することができます(パラメータ、シード値、スナップショットに変更がない、という前提で)。 falseの場合、プランナは、サンプル対象のテーブルを2度以上スキャンする必要のあるようなプランは選択しません。 問い合わせの結果に不整合が発生する可能性があるからです。

TsmRoutine構造体はsrc/include/access/tsmapi.hで宣言されています。 詳細はそちらをご覧ください。

標準配布物に含まれるテーブルサンプリングメソッドは、自分でサンプリングメソッドを書く際に良いお手本になります。 組み込みのサンプリングメソッドに関しては、ソースツリー中のsrc/backend/access/tablesampleサブディレクトリを見てください。 追加のメソッドに関してはcontribサブディレクトリを見てください。