以前、TABLESAMPLE 句のデータ取得はどのように動作しているか という投稿をしました。
この TABLESAMPLE と TOP 句を組み合わせる場合の注意点について少し書いてみたいと思います。
■TOP 句と組み合わせる場合の注意点
以下のようなクエリを実行してみます。
USE TEST |
一時テーブルに TABLESAMPLE で 100 行取得した結果のうち TOP 1 件のみを格納するという処理を 10 回実行しています。
この時の結果ですが以下のようになります。
実行するごとに異なるページが取得されるのですが、[slot_id] は 常に 0 になります。
SQL Server のページですが単純な構成として書くと以下のように各行が格納されます。
# 実際にはオフセットで各行を認識しています。
TABLESAMPLE はページをサンプリングして情報の取得を行います。
そのため ORDER BY で適切なソートをしないとページの最初のスロット (slot_id = 0) が取得される確率が高いと思います。
# TOP 1 なので最初のスロットが取得された状態になります。
スロットをランダムで取得したい場合は、
USE TEST |
というように NEWID でソートをするというようなクエリにする必要があると思います。
このクエリを実行するとスロットが分散して取得されます。
TABLESAMPLE でデータを取得する場合は、どのスロットのデータが取得されているかを意識したほうが良さそうですね。