2011-10-26 6 views
2

わかりましたが、私はテーブルを持っている:増加クエリの速度

ID Name Description Picture 
1 Alex  Alex desc..  2 
2 Maria  NULL   3 
3 John  John desc.. NULL 

表画面には、IDとvarbinaryのイメージを持っています。

は、私が選択する必要があります。説明が存在する場合は、説明、他の絵 が、私はこれを行う:

select Id, 
     Name, 
     Case when Description is null then pic.Image else Description 
     from person per join picture pic on per.Picture = pic.Id 

だから、説明がnullでない場合は参加不要のように見えます。とにかく この単純なクエリを改善するための提案はありますか?また、クエリの2つのバージョン間のパフォーマンス比較のために使いやすいツールは何ですか?

+1

なぜこのJOINが心配ですか?パフォーマンスに問題がありますか?これは時期尚早の最適化である可能性があります。 2つの整数を結合するだけです。あなたの索引付けが適切であれば、それは心配リストの一番下になければなりません。 –

+0

私はこのようなやり方をしており、より良いアプローチがあればコミュニティに提案してほしいと思っています。そうでなければ、それでいい。 – user194076

答えて

4

私が知る限り、1つのクエリ内で条件付きで結合する方法はありません。私はパフォーマンスが比較方法がわからないんだけど、それは少しクリーナー思わ

SELECT per.ID, per.Name, COALESCE(per.Description, pic.Image) as desc 
FROM Person as per 
LEFT JOIN Picture as pic 
ON per.picture = pic.ID 

:として私はおそらくあなたが持っているもの書き直します。

質問を比較する限り、両方の実行計画を見て、いずれかのスキャンが実行されているかどうかを確認することをおすすめします。また、あなたは必要なインデックスを持っているかどうかを確認する簡単な方法としてDatabase Tuning Advisorを使用することができます

:ここでは、パフォーマンス・チューニングのための実行計画を使用して、上のいくつかの情報があります。

いずれかの最適化に時間をかけすぎないように注意してください。データベースが拡大するにつれて、現在のパフォーマンスとパフォーマンスの両方に注意を払うのは良いことですが、あまりにも多くの時間を費やすことなく、これに多くの時間を費やすのは簡単です。あなたが良いデータベース構造とよく書かれたクエリを持っているなら、将来の最適化はそれほど大きな苦痛ではありません。

+0

ありがとう、私が知りたかったものです。合体により、読みやすくなります。私は最初から高品質の結果を作りたいだけです。 – user194076

1

説明がnullでない場合は、参加が必要です....そして、これがあなたのコードで正しいことですか?

おおよそは、 'select getdate()'ステートメントのペアでそれらをラップし、数式を実行する(または、あなたのために数学を行うためにSQLを書く)ことによってクエリを実行します。

0

ます。また、このような何かを行うことができます:

select Id, Name, Description 
from person 
where description is not null 
union all 
select Id, Name, pic.image 
from person per 
join picture pic on per.Picture = pic.Id 
where description is null 

パフォーマンスが可能だろうか確認してください、しかし、あなたが必要な場合にのみ参加しているのが、UNIONのコストではありません。 Union Allを使用すると、個別の行をソートする必要がなくなり、パフォーマンスが向上します。

関連する問題