2012-05-07 7 views
0

こんにちは私はSQL mangement studio 2008R2を使用しています。複数のSELECT文を含むクエリのパフォーマンスが悪い

いくつかのvarbinary(max)フィールドがnullのtblScanのscanidsを取得するためのクエリがあります。私のクエリは:

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

私はSQLで私のクエリを実行すると、私はこのクエリを初めて実行すると半分かかる。 私のクライアントでは、タイムアウト例外が発生します。私はSQL管理スタジオでクエリを1回実行していない場合。

このクエリを最適化する最適な方法は何ですか?それとも、接続文字列のタイムアウトを増やすだけですか?

編集:

これは私のテーブルの設計である:

SCANID - int型
スカンデート - 日時
scanFileMeasurements - varbinary型(MAX)
MEMBERID - int型
scanFileFace - varbinary型(MAX)
scanFileAvatar - varbinary型(MAX)
- varbinary型(MAX)事前に

ありがとう!

+0

2回目の実行が速くなる理由は、クエリキャッシュのおかげです:)最初のクエリが遅い理由を理解するには、現在のテーブル構造などの詳細情報を表示する必要があります。 –

+0

@Jackテーブルデザインを追加しました – dg90

答えて

1

materialized viewを採用しようとする可能性があります。要するに、それはテーブルとして動作し、基になるデータが変更されたときに変更されるインデックス付きビューですが、基になるテーブルの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) 

は、それ以外の場合は、(少なくともSQL Server 2005の私の経験では)通常のビューとして機能する、マテリアライズド・ビューをあなたの中から選択したときにNOEXPANDヒントを追加することを忘れないでください。

+0

ニース、ちょうど私が必要なもの!ありがとう;-) – dg90

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 
+0

こんにちはこれらのフィールドはバイナリ(最大)フィールドです。それらのインデックスを配置することはできません... – dg90

1

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

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

+0

+1は、同様のソリューションを投稿しようとしていた – Habib

関連する問題