次の方法で共有


TABLESAMPLE 句の使用による結果セットの制限

更新 : 2006 年 12 月 12 日

TABLESAMPLE 句は、FROM 句に指定したテーブルから返される行の数をサンプル行の数または率に制限します。次に例を示します。

TABLESAMPLE (10 PERCENT) /*Return a sample 10 percent of the rows of the result set. */
TABLESAMPLE (15 ROWS) /* Return a sample of 15 rows from the result set. */.

TABLESAMPLE 句は、派生テーブル、リンク サーバーのテーブル、およびテーブル値関数、行セット関数、または OPENXML から派生したテーブルには適用できません。TABLESAMPLE 句は、ビューやインライン テーブル値関数の定義には指定できません。

TABLESPACE 句の構文は次のようになります。

TABLESAMPLE [SYSTEM] (sample_number [ PERCENT | ROWS ] )

[ REPEATABLE (repeat_seed) ]

ms189108.note(ja-jp,SQL.90).gifメモ :
SQL Server 2005 にアップグレードしたデータベースに対して TABLESAMPLE を使用する場合は、データベースの互換性レベルを 90 に設定する必要があります。データベースの互換性レベルの設定については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

次の条件のいずれかに該当する場合は、TABLESAMPLE を使用すると、データ量の多いテーブルからサンプルをすばやく返すことができます。

  • サンプルは、個別行レベルで真のランダム サンプルである必要がない。
  • テーブルの個々のページの行が、同じページの他の行と相関していない。
ms189108.note(ja-jp,SQL.90).gif重要 :
真にランダムな個別行のサンプルが必要である場合は、TABLESAMPLE は使用せずに、クエリを変更して行をランダムにフィルタ選択します。たとえば、次のクエリでは、NEWID 関数を使用して Sales.SalesOrderDetail テーブルの約 1% の行を返します。 SELECT * FROM Sales.SalesOrderDetail WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float) / CAST (0x7fffffff AS int) SalesOrderID 列が CHECKSUM 式に含まれているため、NEWID() は 1 行につき 1 回評価されて、行単位でのサンプリングが実現されます。式 CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) が評価されると、0 ~ 1 のランダムな float 値が生成されます。

SYSTEM オプションの使用

SYSTEM は、ANSI SQL の実装に準拠したサンプリング メソッドを指定します。SYSTEM の指定は省略できますが、これは SQL Server 2005 で使用できる唯一のサンプリング メソッドであり、既定では適用されます。

TABLESAMPLE SYSTEM は、おおよその率の行を返し、テーブル内の 8 KB の物理ページごとにランダム値を生成します。ページに対して生成されたランダム値とクエリに指定された率に基づいて、そのページをサンプルに含めるか除外するかが決定されます。サンプルに含められた各ページは、すべての行をサンプル結果セットとして返します。たとえば、TABLESAMPLE SYSTEM 10 PERCENT と指定した場合、SQL Server では指定したテーブルのデータ ページの約 10% からすべての行が返されます。テーブルに十分な数のページがあり、各ページに行が均等に分散している場合、返される行数は要求したサンプルのサイズに近い数になります。ただし、ページごとに生成されるランダム値は、他のページに対して生成される値から独立しているため、要求したページの率よりも大きい、あるいは小さい率の値が返される場合もあります。TOP(n) 演算子を使用すると、行の最大数を制限できます。

テーブルの行の総数に基づいた率ではなく、行の数を指定した場合、その数は返す行の率、つまり返すページ数に変換されます。そのうえで、その計算された率を使用して TABLESAMPLE 操作が実行されます。

テーブルが単一のページで構成されている場合、ページのすべての行が返されるか、1 行も返されないかのいずれかです。この場合、TABLESAMPLE SYSTEM では、ページの行数に関係なく、1 ページのうちの 100% または 0% の行だけが返されます。

特定のテーブルに TABLESAMPLE SYSTEM を使用すると、そのテーブルに対する実行プランがテーブル スキャンの使用のみに制限されます。テーブル スキャンには、ヒープのスキャン、またはクラスタ化インデックス (存在する場合) のスキャンがあります。プランにはテーブル スキャンが実行されたことが示されますが、データ ファイルから実際に読み取られる必要があるのは、結果セットに含められるページのみです。

ms189108.note(ja-jp,SQL.90).gif重要 :
TABLESAMPLE SYSTEM 句は、注意して使用する必要があり、サンプリングを使用する場合の影響についても理解しておく必要があります。たとえば、2 つのテーブルを結合する場合、おそらく両方のテーブルの各行について一致があります。ところが、2 つのテーブルのうち、いずれか一方に TABLESAMPLE SYSTEM を指定した場合、他方のテーブルから返される行の中に、サンプル テーブルの行と一致しないものがあるという状況が生じ得ます。この動作によって、実際にはデータが有効であるにもかかわらず、データ一貫性の問題がテーブルに存在するという疑いをユーザーに持たせてしまうことがあります。また、結合する両方のテーブルに TABLESAMPLE SYSTEM を指定すると、この問題はさらに顕著になります。

REPEATABLE オプションの使用

REPEATABLE オプションを実行すると、選択されたサンプルが再度返されます。REPEATABLE の repeat_seed に同じ値を指定した場合は、テーブルに変更が加えられない限り、同じ行のサブセットが SQL Server により返されます。REPEATABLE の repeat_seed に異なる値を指定した場合は普通、テーブルの異なる行のサンプルが SQL Server により返されます。挿入、更新、削除、インデックスの再構築、インデックスの断片化の解消、データベースの復元、およびデータベースのアタッチ操作は、テーブルへの変更と見なされます。

A. 行の率を選択する

Person.Contact テーブルには 19,972 の行が含まれています。次の例では、約 10 パーセントの行が返されます。返される行の数は、通常、ステートメントが実行されるたびに変わります。

USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) ;

B. シード値で行の率を選択する

次の例では、実行するたびに同じ行のセットが返されます。205 というシード値は任意に選択されたものです。

USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact 
TABLESAMPLE (10 PERCENT) 
   REPEATABLE (205) ;

C. 行の数を選択する

次の例では、約 100 の行が返されます。実際に返される行の数は大きく変動します。5 などの小さな数を指定すると、サンプルで結果が得られない場合もあります。

USE AdventureWorks ;
GO
SELECT FirstName, LastName
FROM Person.Contact 
TABLESAMPLE (100 ROWS) ;

参照

その他の技術情報

FROM (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 12 月 12 日

新しい内容 :
  • 例を追加しました。

2006 年 4 月 14 日

変更内容 :
  • TABLESAMPLE を使用する場合の推奨事項を変更し、TABLESAMPLE の結果が個別行レベルではランダムではないことを明確にしました。TABLESAMPLE を使用せずに個別行レベルでランダム サンプルを返す方法を示すコード例を追加しました。