テーブルの外部キーにインデックスを追加すると、私の同僚の視界が遅くなっているのがわかります。このビューは、外部結合と内部結合の複数のパックド・ビューで構成されています。私は、問題がどこにあるかを理解するためにそれらを一つずつ削除しようとしましたが、特定のビューから来ているようには見えませんが、それらのすべてからより多くのことを言うことはできません。インデックスはどのようにして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]
あなたは何が起こっているかを見るためにクエリプランを見ましたか? –
理論的には、索引によってプランを構築するときにオプティマイザはより多くのオプションを検討します。テーブル・スキャンが必要な場合は、パフォーマンスを低下させる可能性があります。しかし、私はこれまでに測定可能な効果があるとは思わない。影響を受けるクエリを投稿できますか? – JohnFx
ビューがビューを呼び出すビュー(または誤解したビュー)だとお考えでしたか?もしそうなら、すぐにそれを止める必要があります。これらのビューは、すべての下位ビューを動作させるために完全に実現しなければならず、大量のデータが含まれている場合は非常に遅くなります。それはビューを他のビューを呼び出すSQLの反パターンです。 – HLGEM