0

こんにちは、SQL 管理スタジオ 2008R2 を使用しています。

一部の varbinary(max) フィールドが null である tblScan のスキャン ID を取得するクエリがあります。私のクエリは次のとおりです。

select SCANID 
from tblScan 
where scanFileFace is null 
  and scanFileAvatar is null 
  and hair is null

SQL でクエリを実行すると、最初にこのクエリを実行するときに 1 分半かかります。私のクライアントでは、これによりタイムアウト例外が発生します。SQL Management Studio でクエリを 1 回も実行していない場合。

このクエリを最適化する最善の方法は何ですか? または、接続文字列のタイムアウトを増やしても問題ありませんか?

編集:

これは私のテーブルデザインです:

SCANID - int
scanDate - 日時
scanFileMeasurements - varbinary(MAX)
MEMBERID - int
scanFileFace - varbinary(MAX)
scanFileAvatar - varbinary(MAX)
Hair - varbinary(MAX)

前もって感謝します!

4

3 に答える 3

2

scanFileFace 、scanFileAvatar および hair フィールドでインデックスを使用してください。

ターゲット フィールドで値が変更されると自動的に計算される計算列を作成し、この計算フィールドにインデックスを作成します。クエリのパフォーマンスを大幅に向上させます。

alter table tblScan
add ContentLength as ISNULL(DATALENGTH(scanFileFace ),0) persisted

CREATE NONCLUSTERED INDEX [IX_tblScan_ContentLength] ON [dbo].[tblScan] 
(
    [ContentLength] ASC
)

select scanid from tblScan where ContentLength > 0
于 2012-05-07T08:40:27.690 に答える
1

おそらく、インデックス付きの計算されたブール値フィールドが必要です。

挿入するときは、ブール フィールドを既存の条件にします。更新するとき、トリガーでこれを行うことができます

于 2012-05-07T08:59:20.207 に答える
1

具体化されたビューを採用しようとするかもしれません。つまり、テーブルとして動作し、基になるデータが変更されると変化するインデックス付きビューですが、基になるテーブルでの CRUD 操作中にデータが既に準備されているため、select を実行する必要はありません。

create view EmptyScans with schemabinding
as
    select SCANID 
      from dbo.tblScan 
     where scanFileFace is null 
       and scanFileAvatar is null 
       and hair is null
GO
create unique clustered index ix_empty_scans on EmptyScans (ScanID)
GO

select scanid 
  from EmptyScans (noexpand)

マテリアライズド ビューから選択するときに noexpand ヒントを追加することを忘れないでください。そうしないと、通常のビューとして機能します (少なくとも Sql Server 2005 での私の経験では)。

于 2012-05-07T09:58:27.763 に答える