48

適度に高い間隔でSQLレコードの存在をチェックする.NETコードがいくつかあります。私はこのチェックをできるだけ「安い」ものにしたいと思っています。

私は2つのクエリの特徴を疑問に思っています:

IF EXISTS(SELECT 1
          FROM   BigTable
          WHERE  SomeColumn = 200)
  SELECT 1 AS FOUND
ELSE
  SELECT 0 AS FOUND

VS

SELECT TOP 1 1
FROM   BigTable
WHERE  SomeColumn = 200 

どちらも同様の実行計画を作成します。ただし、SELECT TOP 1 1の実行速度は速いようです。解析するクエリが少なくなり、レコードが見つからない場合は、パイプへの送信が少なくなります。また、IF EXISTSの戻り値をマーシャリングするのではなく、レコードカウントを確認するだけでよいため、クライアントでの実行速度が速いと想定しています。

パフォーマンス上の利点のほとんどはごくわずかです。しかし、両方が一貫して同じ結果を返す場合は、少し速い方法を選択してみませんか?

「SELECTTOP11」は、.NETにレコードが存在するかどうかを確認するための最良の方法ですか?

(.NET 3.5を使用していますが、LINQはアプリケーションの他の場所では使用されていないため、回避しようとしています。移行/書き換えしているレガシーVB6アプリもいくつかあるため、これも実行する必要があります。)

編集:デザインについてもう少し詳しく説明します。このレコードは「ヘッダー」です。このヘッダーが見つかったときに読み取られる/解析される子レコードを持つ別のテーブルがあります。記録がないのは良いことです。やるべきことはありません。

EDIT2:条件を満たすレコードの欠如がより頻繁に発生します。彼らは散発的な波でやってくる。

4

5 に答える 5

40

IF EXISTS(SELECT * ...)これが実際にパフォーマンスの問題を引き起こしていない限り、私はお勧めします。クエリの意図を、他の方法よりもはるかによく理解された方法で表現します。

テーブルの行数が実際に必要COUNT(*)でない限り、(現在の回答のように)避けたいと思います。

結果から行数をチェックする「効率」が必要な場合は、おそらく次のようにします。

select 1 where exists(select * from BigTable where SomeColumn=200)

2番目のクエリと同じ結果セット(0行または1行)を生成します

于 2012-06-13T06:14:54.093 に答える
15

これは、IFステートメントの代わりに必要なものです

  SELECT ISNULL(
     (SELECT TOP 1 1 FROM BigTable where SomeCol = 200), 0);
于 2012-06-13T06:12:21.973 に答える
7

まったく違いはありません。存在は、ステートメントの選択された部分を評価することすらありません。だから、あなたが好きなものを使用してください。

declare @test table (name varchar(20))

-- comment out inserts for testing.
insert into @test (name) values ('bob the builder')
insert into @test (name) values ('bob the builder')

-- for giggles, put 1/0 here. You'll find that divide by zero error.
select 1 from @test

-- notice that you don't receive a divide by zero error.
-- the bit in the select portion is never executed, ever.
if not exists (select 1/0 from @test) select 'Yay!'
if     exists (select 1/0 from @test) select 'Boo!'

実際、これらは同じ意味で使用できます。

... select * ... 
... select 1 ... 
... select top 1 * ... 
... select top 1 1 ... 
... select 'John Jacob Jingleheimer Schmidt' ... 
于 2019-02-06T20:21:53.607 に答える
2

私は間違いなく2番目のオプションに行きます:

SELECT TOP 1 1
FROM   BigTable
WHERE  SomeColumn = 200 

I / OとCPUの数がほぼ同じ場合でも、実行プランはよりシンプルで効率的です。

于 2013-09-30T21:17:36.170 に答える
-16

SQL Serverについてはよくわかりませんが、他のデータベースでは、標準的な方法は次のとおりです。

SELECT COUNT(*) FROM BigTable where SomeCol = 200;

実際の効率は、インデックスなどによって異なります。

于 2012-06-13T06:06:32.113 に答える