2011-09-09 8 views
5

テーブルの外部キーにインデックスを追加すると、私の同僚の視界が遅くなっているのがわかります。このビューは、外部結合と内部結合の複数のパックド・ビューで構成されています。私は、問題がどこにあるかを理解するためにそれらを一つずつ削除しようとしましたが、特定のビューから来ているようには見えませんが、それらのすべてからより多くのことを言うことはできません。インデックスはどのようにしてselect文を遅くすることができますか?

インデックスの挿入速度が遅くなったり、ハードドライブ上でサイズが大きくなっていることがわかっていましたが、ビューの速度を落とす原因となることはありませんでした。真実は私がそうするときである:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
GO 

select top 20 * from MyView 

インデックスでは20秒、無しでは9秒かかる。

CREATE NONCLUSTERED INDEX [IX_MyField] ON [dbo].MyTable 
(
    [MyField] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
+1

あなたは何が起こっているかを見るためにクエリプランを見ましたか? –

+0

理論的には、索引によってプランを構築するときにオプティマイザはより多くのオプションを検討します。テーブル・スキャンが必要な場合は、パフォーマンスを低下させる可能性があります。しかし、私はこれまでに測定可能な効果があるとは思わない。影響を受けるクエリを投稿できますか? – JohnFx

+0

ビューがビューを呼び出すビュー(または誤解したビュー)だとお考えでしたか?もしそうなら、すぐにそれを止める必要があります。これらのビューは、すべての下位ビューを動作させるために完全に実現しなければならず、大量のデータが含まれている場合は非常に遅くなります。それはビューを他のビューを呼び出すSQLの反パターンです。 – HLGEM

答えて

9

他のインデックスや統計情報が古くなっている可能性があります。それらが最新でない場合、クエリアナライザは新しいインデックスを使用して準最適な実行計画を選択している可能性があります。

は、実行してみましょう:あなたのテーブルの上に

UPDATE STATISTICS WITH (FULLSCAN)

+1

それは夢中!あなたは私の週を救った! – Arthis

+1

喜んで助けてくれてうれしいです。このような問題は、何度も働く苦痛です。 – JNK

2

MyTableから他の列を選択していますか?もしそうなら、あなたはおそらくブックマークルックアップ(またはRIDルックアップ)をしているでしょう。つまり、追加のデータをテーブルに戻すことになります。

索引のINCLUDE句に追加で選択する列を配置する必要があります。

実行計画を有効にして両方のクエリを実行し、2を比較して、クエリのどの部分がより長くかかるかを特定します。

+0

あなたの説明のおかげで、それは私の問題を解決しませんでしたが、インデックスがどのように機能しているかを少し理解してくれました。良い一日を! – Arthis

関連する問題