1

データベースに行が存在するかどうかを確認する必要があります。ただし、最高のパフォーマンスを提供するこれを行う方法を見つけようとしています。これは、例で最もよく要約されています。

次のテーブルがあるとします。

dbo.Person(
FirstName varchar(50),
LastName varchar(50),
Company varchar(50)
)

このテーブルには数百万の行があると仮定しますが、列だけCompanyにインデックスがあります。

FirstNameLastName、の特定の組み合わせが存在するかどうかを調べたいCompany。私はこれができることを知っています:

IF EXISTS(select 1 from dbo.Person where FirstName = @FirstName and LastName = @LastName and Company = @Company)
Begin
....
End

ただし、私が間違っていない限り、完全なテーブル スキャンが実行されます。

私が本当にやりたいのは、インデックスを利用するクエリです。上記の表から、次のクエリはインデックスを使用しているため、優れたパフォーマンスを発揮することがわかります。

Select * from dbo.Person where Company = @Company

そのデータのサブセットのみを検索する方法はありますか? たとえば、次のようなものです。

select * from (
  Select * from dbo.Person where Company = @Company
)
where FirstName = @FirstName and LastName = @LastName

そうすれば、はるかに狭いデータ コレクションに対してのみテーブル スキャンを実行することになります。

上記のクエリが機能しないことはわかっていますが、機能するクエリはありますか?

ああ、ユーザーは読み取りアクセスしかできないため、一時テーブルを作成できません。

4

2 に答える 2

0

IF EXISTS( ...)最速のフォームです。オプティマイザーは、インデックスがより高速になると計算した場合、フィルター条件を満たすために使用可能なインデックスを使用します。 IF EXISTS行が見つかるとすぐに終了します。

統計が最新であることを確認してください...

于 2010-05-17T04:04:14.740 に答える
0

FWIW、これは有効なSQLです。

select *
from (select * from dbo.Person where Company = @Company) t
where t.FirstName = @FirstName and t.LastName = @LastName

そして、エイリアスだけがクエリと異なります。ミッチが彼の投稿で言っているように、それIF EXISTSはより速くなるでしょう。

クエリアナライザーを使用して、オプティマイザーが何を行うかを決定できます。

于 2010-05-17T04:11:59.663 に答える