大きなテーブルからN行のバッチを選択する必要があります。
私はこれを行う2つの方法を知っています。
SET ROWCOUNT
SET ROWCOUNT ####
SELECT something FROM table WHERE clauses
SET ROWCOUNT 0 -- rowcount is only needed for the one query above.
TOP
SELECT TOP ### something FROM table WHERE clauses
注:
SELECT
ステートメントです。この制限は他のステートメントには適用されません(したがって 通常の理由 選択するrowcountovertopdon適用されません)。研究完了:
一般的に言えば...パフォーマンスは同じでなければなりません。
技術的に言えば...それはクエリに依存します。たとえば、派生テーブルの範囲内でTOP
を使用すると、オプティマイザがクエリをどのようにフラット化するかによって、パフォーマンスが異なる場合があります。
特定のクエリの質問に回答するには、次のオプションを有効にしていくつかのテストを実行します。
set showplan on
set statistics io,time on
go
-- set rowcount XXX
select [top] ...
-- set rowcount 0
go
クエリを数回実行して、データがディスクからプルされていることを確認し、メモリ内のデータクエリを相互に比較できるようにします。
明らかに、2xクエリプランとIOとタイミングを比較する必要があります(timesは、ブロッキングの期間や待機キューの待機に費やされた時間に基づいて大きく異なる可能性があることに注意してください)データサーバーエンジンで実行します)。 IOは繰り返し実行で同等でなければなりませんが、タイミングについては、各クエリを数回実行して平均を求めることになるでしょう。
SET ROWCOUNT ####
SELECT something FROM table WHERE clauses
SET ROWCOUNT 0 --
このクエリでは、オプティマイザーはクエリプランに "SET ROWCOUNT ####
"の部分を含めないため、コストはかかりません。
使用することはめったになく、基準を特定することができないため、使用する理由はあまりありません。
SELECT TOP ### something FROM table WHERE clauses
通常、TOP
にはorder clause
が付いていますが、必須ではありません。
TOP
は評価されたクエリプランであるため、コストがかかります。
そのため、SET rowcountのパフォーマンスは少し向上します。
主な違い
TOPは、使用されているクエリに対してのみ機能します。
SET ROWCOUNT
は現在のスコープで機能します。すべてのクエリは、トリガーを含むそのスコープ内のSET ROWCOUNT
の影響を受けます。
、
SET RowCount 2
そして実際には(ロジックによって)4行がトリガーで影響を受けるはずですが、SET RowCount 2のために2行のみが影響を受けます
したがって、SET ROWCOUNTを使用するのは安全ではありません。
SET ROWCOUNT
は次のバージョンで廃止される予定です。