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

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) ]

注意

TABLESAMPLE は SQL Server 2005 で導入されました。以前のバージョンからアップグレードされたデータベースに対して TABLESAMPLE を使用する場合は、データベースの互換性レベルを少なくとも 90 に設定する必要があります。データベースの互換性レベルを設定する方法については、「ALTER DATABASE (Transact-SQL)」を参照してください。

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

  • サンプルは、個別行レベルで真のランダム サンプルである必要がない。

  • テーブルの個々のページの行が、同じページの他の行と相関していない。

重要な注意事項重要

真にランダムな個別行のサンプルが必要である場合は、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 で使用できる唯一のサンプリング メソッドであり、既定では適用されます。

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

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

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

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

重要な注意事項重要

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

REPEATABLE オプションの使用

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

A. 行の率を選択する

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

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

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

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

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

C. 行の数を選択する

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

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

関連項目

参照