2009-07-10 18 views
8

例えば、かなりのクエリにスキーマの所有者を含むことデシベルのパフォーマンスを向上させることを受け入れているようだ。:SQL Serverのパフォーマンスと、完全修飾テーブル名

SELECT x FROM [dbo].FooSELECT x FROM Foo

これは、SQL Serverが接続コンテキストでユーザーに属するFooテーブルを検索するため、ルックアップを保存することになっています。これに何らかの真実があるの

SELECT x FROM MyDatabase.[dbo].Foo 

今日は、私はあなたがあなたの接続文字列で選択したデータベースを照会している場合でも、常にデータベース名を含むことは、パフォーマンスを同じ方法で改善することが言われましたか?これはコーディング標準として理にかなっていますか?これのどれも(最初の例でさえ)測定可能な利益に変換されますか?

データベースサーバーで追加の辞書を検索すると、Webサーバー(または他のクライアント)で膨大なSQLと余分な連結が発生しているのですか?

+2

違いがある場合は、すべてのクエリにデータベース名が含まれているため、メンテナンスの問題が発生します。データベースの名前を変更するのが非常に難しくなります。 – adrianbanks

+0

あなたのメンテナンスによって異なります。私の特定の手順の中で完全修飾名を持つことは、テスト環境内の別のDBに接続しても同じように機能することを保証します - 私の特定のシナリオでは、私はテスト環境を望みます。格納されたprocに関する限り、「生産」の結果を生成する。おそらくベストプラクティスではありませんが、われわれのデータストアの広範な見通しは、独立したTESTドメインで完全に再現されたカウンターパーツをクリーンなサンドボックス状態にしていないため、多くのTEST/DEV環境最高でも、偽のデータと生産データが混在しています。 – bkwdesign

答えて

11

ことの一つは、このバインディングのコンパイルではなく、実行一つであることです。したがって、同じクエリを100万回実行すると、最初の実行だけが検索時間にヒットし、残りのものは同じプランを再利用し、プランは事前バインドされます(名前はすでにオブジェクトIDに解決されています)。

+0

+1正確:コンパイルのオーバーヘッドを節約します。 – gbn

1

試してみますか?数百万回のクエリをループして、どれが最初に終了するかを確認してください。

私はそれが二重の負荷だと思っています。 MS SQLの開発者は、検索アルゴリズムやストレージ・メソッドの効率を研究するために何百万時間を費やすだけで、完全修飾テーブル名を指定しないユーザーが邪魔になることはありませんか?ばかばかしい。

0

スペンサーは言ったように、試してみてください。もちろん、毎回キャッシュをクリアして、結果が妨げられる可能性があります。

http://www.devx.com/tips/Tip/14401

それはどんなapprecible違いを作った場合、私も驚いされるだろう。

1

デフォルトのスキーマが同じ場合、SQL Serverは特別なルックアップを行いません。それが含まれていない場合、それはたくさん使われているクエリです。

データベース名はクエリのパフォーマンスには影響しません。私はこれがManagement StudioのEstimated Execution Planで見られると思います。

4

この場合、個人的には、これが原因で発生する可能性のあるわずかなパフォーマンスの向上以上の可読性を好みます。

SELECT * FROM Foo 

よりもスキャンする非常に簡単に思える:心に留めておくべき

SELECT * FROM MyDatabase.[dbo].Foo 
関連する問題