私はこのクエリを実行する場合予期しない推定行(SQL Server 2000の)
select user from largetable where largetable.user = 1155
(私はちょうどその最も単純なケースにこれを削減するために、ユーザーを照会しています注意してください)
と見実行計画は、インデックスシーク[largetableがユーザーにインデックスを持っている]計画されている、と推定行が正しい29
ですが、私がしなければ
select user from largetable where largetable.user = (select user from users where externalid = 100)
[サブコードの結果は、ハードコードしたときと同じように単一の値1155になります]
クエリオプティマイザは結果の117,000行を見積もります。対象となる行には約6,000,000行、ユーザーには1700行あります。クエリを実行すると、巨大な推定行にもかかわらず正しい29行が返されます。
関連インデックスの両方のテーブルでfullscanを使用して統計情報を更新しました。統計情報を見ると、正しいものとして表示されます。
注目すべきは、与えられたユーザーのために、3,000行を超えないことです。
したがって、推定された実行計画には、そのような推定行が非常に多く表示されるのはなぜですか?オプティマイザは、統計情報に基づいて、サブクエリによって選択されるユーザーがわからなくても29の対応する行を持つ結果、または3,000行の最大値を探していることを知っていないはずです。なぜこの巨大な見積もりですか?問題は、この大きな見積もりが、シークの代わりにスキャンを実行する大きなクエリの別の結合に影響を与えることです。サブクエリで大きなクエリを実行すると、1分40秒かかります。ハードコードされた1155で実行すると2秒かかります。これは私にとって非常に珍しいです...
おかげで、
クリス
はい、また、結合として書き直しても同じ問題が発生します。 – Querylous