2009-02-28 5 views
4

私はいくつかのクエリにジョインを追加するとすぐに気付きました。これらの実行に要した時間は、複数のクエリを完了するだけではありません。結合を回避する複数のクエリ?

時刻にはページの読み込みと平均20ページの読み込みが含まれます。 2は
235ms

は、私はちょうど代わりに複数のクエリを進めるべきで参加していないと

7-9クエリは、彼らがそのような重要なを持っているように見える考慮ジョイン
159ms

3クエリに参加しますパフォーマンスへの影響?私はおそらくそれらのテスト中に怠惰な読み込みだったので、複数のクエリメソッドを最適化することもできます。

EDIT

私は質問のためにいくつかの偽の情報を作成します。


ID(INT、アイデンティティ、PK、クラスタ化インデックス)
ユーザID(int型、非クラスタ化インデックス)
区分(INT、非クラスタ化インデックス)

表ユーザー
ID(INT、アイデンティティオブジェクト、PK、クラスタ化インデックス)

表カテゴリー
ID(int型、アイデンティティ、PK、クラスタ化インデックス)

かなり簡単です。これは、Objectsテーブルへの二重内部結合クエリです。 3つすべてを個別に照会すると、結合よりも高速に見えます。

2つのクラスタード・インデックス・シークで42%、クラスタード・インデックス・スキャンで23%、残りがトップNソートであることが、照会計画で示されます。

+0

をおそらく役立つだろう面倒なクエリを掲示... –

+0

は、あなたが特定のそれも経験する私たちを与えた偽のスキーマをテストしました減速? –

答えて

5

あなたが何らかの理由で結合を行っている場合は、必ず。通常、テーブルを結合する理由は、関連するデータをプルして処理できるようにするためです。上の質問には、(おそらくループ構造などを介して)そのデータを一緒に戻す必要があるプログラムの時間も考慮されていません。

ここでは、クエリ分析を行う必要があります。私はあなたの特定のSQL風味にあまり慣れていませんが、EXPLAINのようなものでしょう。

私がここに持っている限られた情報に基づいて起こる可能性のある犯人を与えなければならない場合、インデックスが失われてしまいます。あなたが参加しているフィールドは正しく索引付けされていますか?これは、大きなパフォーマンス向上をもたらします。第二に、あなたは適切なフィールドに参加していますか?たとえば、2つの文字列を結合すると、整数やその他の最適化フィールドを結合するよりパフォーマンスが悪くなります。

+0

私はクラスター化されたint identity列のインデックスに参加しています。ええ、LINQ to SQLクエリを使って関連するデータをまとめています。 –

+0

ああ、ページの読み込みまで、私はデータアクセス時間を計時しようとしましたが、それは平均47msで平均75msでした –

1

あなたはそれらを最適化するために何かがあるかどうかを見るために、アナライザの結合を使ってクエリを実行しようとしましたか?

2

実際のクエリプランを見て、レスポンスが異なる理由を理解することをお勧めします。おそらく、それはおそらくインデックスを追加するテーブルスキャンの提案を強調表示されますか?

ドッキングジョインはより高価です。それはあなたがそれらを使用するべきではありませんことを意味しません。

+0

残念ながら私はSQLを共有できません。 –

4

いいえ、あなたは実際に代わり、他の道を行くようにしてください(SQLにLINQ製)...あなたが書いているSQLを確認するために役立つだろう。できるだけ少ない数のクエリを実行するようにしてください。正しく行われたとき、それは最も速いです。

テーブルに適切なインデックスがあることを確認します。たとえば、次のようなクエリの場合:

select a.Some, b.Other 
from TableA a 
inner join TableB b on b.Id = a.Id 

TableB.Idフィールドにインデックスがあることを確認する必要があります。テーブルの主キーは通常、デフォルトでインデックスを取得しますが、他のインデックスは自分で作成する必要があります。

1

クエリアナライザでデータを取得するためにこれらを実行している場合、複数のクエリは問題ありませんが、Webアプリケーションやコンソールアプリケーションから実行している場合は、1つのクエリに最適化します。もう少し時間がかかっても、データベースに複数回ヒットしないので、パフォーマンスが向上します。 DBを落とすことが少ないほど、フロントエンドのパフォーマンスは向上します。私はあなたの質問を1つだけにするために働くでしょう。あなたのテーブルは、正規化され、インデックスをつけて1つのクエリに絞り込むことができるように見えます。

+0

これはウェブアプリケーションで動作していますが、多くのトラフィックが発生すると、結果が異なることがわかりました。 –

1

私はすべての典型的な結合を取り除こうとします。例えば、私は変更することになります。

select t1.id, t1.name, t2.gpa from t1 join t2 on t1.id =t2.id 

このことにより、:

select t1.id, t1.name, t2.gpa from t1, t2 where t2.id = t1.id 
関連する問題