web-dev-qa-db-ja.com

「SET ROWCOUNT」と「TOP」のパフォーマンスに違いはありますか?

大きなテーブルからN行のバッチを選択する必要があります。

私はこれを行う2つの方法を知っています。

  1. SET ROWCOUNT

    SET ROWCOUNT ####
    SELECT something FROM table WHERE clauses
    SET ROWCOUNT 0 -- rowcount is only needed for the one query above.
    
  2. TOP

     SELECT TOP ### something FROM table WHERE clauses
    

2つのソリューション間にパフォーマンスの違い(または他のものを選択する他の理由)はありますか?

注:

  • 問題がある場合、Sybase ASEはバージョン15です。
  • クエリは単一のSELECTステートメントです。この制限は他のステートメントには適用されません(したがって 通常の理由 選択するrowcountovertopdon適用されません)。
  • 行の順序は関係ありません

研究完了:

  • この SO Q&A は、サポートする参照なしに違いはないと主張する回答を受け入れました。そして、MS SQLサーバーの可能性のある測定されていない違いを示す別の答え(参照はMicrosoftからのものであるため、Sybaseには当てはまりません)。
2
DVK

一般的に言えば...パフォーマンスは同じでなければなりません。

技術的に言えば...それはクエリに依存します。たとえば、派生テーブルの範囲内でTOPを使用すると、オプティマイザがクエリをどのようにフラット化するかによって、パフォーマンスが異なる場合があります。

特定のクエリの質問に回答するには、次のオプションを有効にしていくつかのテストを実行します。

set showplan on
set statistics io,time on
go
-- set rowcount XXX
select [top] ...
-- set rowcount 0
go

クエリを数回実行して、データがディスクからプルされていることを確認し、メモリ内のデータクエリを相互に比較できるようにします。

明らかに、2xクエリプランとIOとタイミングを比較する必要があります(timesは、ブロッキングの期間や待機キューの待機に費やされた時間に基づいて大きく異なる可能性があることに注意してください)データサーバーエンジンで実行します)。 IOは繰り返し実行で同等でなければなりませんが、タイミングについては、各クエリを数回実行して平均を求めることになるでしょう。

1
markp-fuso
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は次のバージョンで廃止される予定です。

0
KumarHarsh