最近の記事「アプリケーションで遅く、SSMSで速い?」で、 SQL Server MVPの Erland Sommarskog氏が クエリ プランに影響する様々なこと、 Dynamic SQLのコンパイル、最終的にSQL Serverデータベースのパフォーマンスに影響する他の要因について研究している。彼の研究は、様々な概念、パラメータ スニッフィングようなシナリオ、クエリ プラン キャッシング、ブロッキング、保存された設定、リンクしたサーバーの課題などに及んでいる。
この記事から幾つか面白いものを引用する。
プロシージャが最初に実行される時のパラメーター値は、その後の実行に大きな影響を及ぼす。もしある理由でこの最初の値セットが特殊であった場合、キャッシュしたプランは、その後の実行にとって最適なものではないだろう。これがパラメータ スニッフィングが重要な理由である。
時々フォーラムやニュースグループで、ストアドプロシージャが遅いが、プロシージャの外で同じクエリを走らせると速い、と言っている人々を目にする。自分で問題解決をしようと考えたら、変数を定数で置き換える。しかし、これまで見てきたように、スタンドアローンクエリの結果は、非常に違う。SQL Serverは変数ではなく定数で、もっと正確な見積りをすることができる。なのでもっと正確なプランが手に入る。
(リンクしたサーバーにとって)重要なのはリモートサーバーに対するパーミッションであり、クエリが走っているローカルサーバーに対するものではない。また、リンクされたサーバーが他のSQL Serverインスタンスの時は、この問題ははっきりする。リンクされたサーバーがOracle、MySQLあるいはAccessの場合には、この問題は起きない。
この記事はまた、ボトルネックや潜在的問題ばかりでなく、関連しているSQLクエリを見つけ出す色々な方法について説明している。
-
Management Studio内からクエリプランやパラメーターを得る
-
それらをクエリキャッシュから直接得る
-
それらをTraceから得る
-
テーブルとインデックス定義を得る
-
統計情報を見つけ出す
氏はまたパラメータ スニッフィングの問題を修正する様々な方法を挙げている、例えば、再コンパイルの強制、インデックス化のレビュー、OPTIMIZE FORの使用、最後に、色々なシナリオで適用できる、単に悪いSQLの修正などである。
最後に、この記事は動的なSQLやいかに似たような原理が動的SQLクエリのパフォーマンスに影響するかについて述べている。この記事は開発者やDB管理者のようなSQL Serverで開発している誰もが、絶対に読むべきである。