SQL ステートメント「SELECT [結果] FROM [テーブル] WHERE [条件] FETCH FIRST [n] ROWS ONLY」を使用する適切なタイミングは次のとおりです。
質問
単により具体的な select ステートメントを作成するよりも、特定の数の行のみを選択する方が良いかどうかはよくわかりません。かなり単純な何かが欠けているような気がしますが、それを理解できません。私は SQL の経験が 6 か月未満で、大雑把なものでした。非常に単純な質問で申し訳ありませんが、明確な答えが見つかりませんでした。
解決
私は 2 つの一般的な用途を知っています。
ページング :必ず順序を指定してください。順序が指定されていない場合、多くの DB 実装ではクエリの実行に便利な順序が使用されます。この「最適な」順序付け動作により、非常に予測できない結果が生じる可能性があります。
SELECT top 10 CustomerName
FROM Customer
WHERE CustomerID > 200 --start of page
ORDER BY CustomerID
サブクエリ:サブクエリを発行できる多くの場所では、結果が単一の値である必要があります。多くの場合、top 1 は max よりも速いだけです。
--give me some customer that ordered today
SELECT CustomerName
FROM Customer
WHERE CustomerID =
(
SELECT top 1 CustomerID
FROM Orders
WHERE OrderDate = @Today
)
他のヒント
通常、カスタムページング。
次の理由でステートメントを使用しています:
-
すべての行をDBからクライアントに転送することなく、最も関連性の高い結果(上位100件など)のみを表示します。この場合、ORDER BYも使用します。
-
一致する行があり、いくつかの例があるかどうかを知りたいだけです。この場合、結果を順序付けせず、再度、FETCH FIRSTは、DBに大量の行を転送してクライアントで破棄する準備をさせるよりもはるかに安価です。これは通常、ソフトウェア開発中に特定のSQLが正しいかどうかを確認する必要がある場合です。
ユーザーに値を表示する場合、必要なのはN行だけです。通常、データベースサーバーは最初のN行をすべての行をフェッチするよりも速くフェッチできるため、画面の再描画は少し速くなります。
Oracleには、FIRST_ROWSと呼ばれる、データを迅速に戻すことが、すべてを効率的に戻すよりも重要であることを示唆するヒントさえあります。
SQLの設計者はあなたに同意します。そのため、標準SQLには最初にtop / limit / fetchなどが含まれていません。
Googleの検索結果とそこにあるページの数を、通常の結果として考えてください。
明らかに、彼らの場合にはそれ以上のものがありますが、それはアイデアです。
ページングを除いて、テーブルから最大または最小の[ここにメトリックを挿入]行が必要な場合は、[任意のメトリック]で順序付けし、1行に制限することは、MIN / MAXを使用してサブクエリを実行するよりも優れています。エンジンによって異なる可能性があります。