2012-02-14 2 views
0

クエリプランに実行コストの15%が1つのテーブルであるとの問題があります。ただし、この表は非常に小さい(9行のみ)。小さなテーブルのクエリプランに非常に高いコストがあります

明らかに、クエリに含まれる最小のテーブルのコストが最も高い場合は問題があります。

私の推測では、クエリは結果をキャッシュするのではなく、同じテーブルを何度も繰り返してループしているようです。

私はこれについて何ができますか?

申し訳ありませんが、私は(非常に複雑である)正確なコードを貼り付けますが、ここでは似たようであることはできません。

SELECT Foo.Id 
FROM Foo 
-- Various other joins have been removed for the example 
LEFT OUTER JOIN SmallTable as st_1 ON st_1.Id = Foo.SmallTableId1 
LEFT OUTER JOIN SmallTable as st_2 ON st_2.Id = Foo.SmallTableId2 
WHERE (
    -- various where clauses removed for the example 
) 
AND (st_1.Id is null OR st_1.Code = 7) 
AND (st_2.Id is null OR st_2.Code = 4) 
+0

実行計画を確認できますか?テーブルスプールが見えますか?見上げる?そのテーブルのインデックスはどうですか? –

+0

私に推測を聞かせてください。テーブルの統計が更新されないかもしれません。オプティマイザ/クエリプランは、クエリの適切なクエリプランではない可能性があります。 –

答えて

0

まあ、限られた情報で使用可能な、私が提案することができるすべては、あなたが保証するということです比較に使用されるすべての列は適切に索引付けされます。

さらに、実際のパフォーマンスが問題であるかどうかを指定していません。これらのテーブルアクセスがクエリ時間の90%を占めていたとしても、クエリが(たとえば)10分の1秒しかかからない場合は、ほとんど問題にはなりません。

+0

はいゆっくり(5秒間)実行されているため、クエリを調整しています。 – cbp

2

これらの実行計画の統計情報には、塩分が含まれています。このテーブルが他のすべてと比較して「不釣り合いに小さい」場合、これらのコスト統計はおそらく実際に丘の豆を意味するものではありません。

私はそれについて考える...意味... :-) は...それは小さなテーブルの場合、実際にそれ何ですか?おそらく、「どこかのファイルに1つの厄介な4Kのストレージページがあります。私たちは一度にそれを読んで、私たちはそれを持っている、期間。物語の終わり。インデックスには何もありません(実際には...)。いいえ(実際...)が必要です。日の終わりには、DBMSはこれと同様に理解します。ご心配なく。今

その...もう一つ言った:「小さなテーブル」に起因しているようで、「コスト」は、実際には非常に高価なアクセスによって発生さではないことを確認してくださいテーブルはになります。これらのテーブルに適切なインデックスがない場合、または書かれたクエリでそれらを有効に使用できない場合は、実際の問題がです。 、それはで、クエリオプティマイザが実際にあなたに伝えようとしているものです。それはここにあなたの問題を解決するのは難しいクエリプランなし

+0

はい問題は、テーブルに参加していると仮定しています...何が起こっているかは、この小さなテーブルの内容をN回走査していると仮定します。ここで、Nは大きなテーブルの行数です。あなたが言うように、それは赤いニシンかもしれません。私はちょうどこの小さなテーブルを忘れ、私の注意を他の場所に集中させるべきです。 – cbp

+1

テーブル全体を忘れてはいけません。たとえそれが小さなテーブルであっても、全体の実行の15%であれば重要です。私はあなたが別の結合のために何度もスキャンされる可能性があるという点で正しいと思いますが、SQL Serverは意図的にオブジェクトを何千回もスキャンすることはしません。その場合、計画のどこかに問題があります。再び、私の答えで言及したように、鍵は実績と実績を見ています。実績が見積もりよりもはるかに高い場合は、計画が最適以下であることを保証することができます。 –

2

(「これは後方のものは、時にはそれを言う...ちょうどコンピュータだ」)が、あなたの例では1つの明白な手がかりがあります:

AND (st_1.Id is null OR st_1.Code = 7) 
AND (st_2.Id is null OR st_2.Code = 4) 

は、これは、カーディナリティを正確に推定することがほぼ不可能であるため、SQL Serverが最適化することは非常に困難です。クエリプランの要素にカーソルを合わせ、EstimatedRowsとActualRowsとEstimatedExecutionsとActualExecutionsを確認します。私の推測では、これらの方法はオフです。

クエリ全体がどのようなものかはっきりしませんが、ORロジックを使用するのではなく、UNION演算子を使用して2つのクエリとして書き換えることができるかどうかを確認したい場合があります。

+0

ありがとう、代わりにUNIONを使用するのは良いヒントです。 – cbp

関連する問題