以下のリンクでフィルタリングされた統計を調べていました。
http://blogs.msdn.com/b/psssql/archive/2010/09/28/case-of-using-filtered-statistics.aspx
データは大きく歪んでおり、1 つのリージョンの行が 0 で、残りはすべて異なるリージョンからのものです。以下は、問題を再現するためのコード全体です
create table Region(id int, name nvarchar(100))
go
create table Sales(id int, detail int)
go
create clustered index d1 on Region(id)
go
create index ix_Region_name on Region(name)
go
create statistics ix_Region_id_name on Region(id, name)
go
create clustered index ix_Sales_id_detail on Sales(id, detail)
go
-- only two values in this table as lookup or dim table
insert Region values(0, 'Dallas')
insert Region values(1, 'New York')
go
set nocount on
-- Sales is skewed
insert Sales values(0, 0)
declare @i int
set @i = 1
while @i <= 1000 begin
insert Sales values (1, @i)
set @i = @i + 1
end
go
update statistics Region with fullscan
update statistics Sales with fullscan
go
set statistics profile on
go
--note that this query will over estimate
-- it estimate there will be 500.5 rows
select detail from Region join Sales on Region.id = Sales.id where name='Dallas' option (recompile)
--this query will under estimate
-- this query will also estimate 500.5 rows in fact 1000 rows returned
select detail from Region join Sales on Region.id = Sales.id where name='New York' option (recompile)
go
set statistics profile off
go
create statistics Region_stats_id on Region (id)
where name = 'Dallas'
go
create statistics Region_stats_id2 on Region (id)
where name = 'New York'
go
set statistics profile on
go
--now the estimate becomes accurate (1 row) because
select detail from Region join Sales on Region.id = Sales.id where name='Dallas' option (recompile)
--the estimate becomes accurate (1000 rows) because stats Region_stats_id2 is used to evaluate
select detail from Region join Sales on Region.id = Sales.id where name='New York' option (recompile)
go
set statistics profile off
私の質問は、両方のテーブルで以下の統計が利用可能であることです
sp_helpstats 'region','all'
sp_helpstats 'sales','all'
テーブル領域:
statistics_name statistics_keys
d1 id
ix_Region_id_name id, name
ix_Region_name name
テーブル販売:
statistics_name statistics_keys
ix_Sales_id_detail id, detail
1.以下のクエリで見積もりがうまくいかなかった理由
select detail from Region join Sales on Region.id = Sales.id where name='Dallas' option (recompile)
--the estimate becomes accurate (1000 rows) because stats Region_stats_id2 is used to evaluate
select detail from Region join Sales on Region.id = Sales.id where name='New York' option (recompile)
2.著者ごとにフィルター処理された統計を作成したとき、見積もりを正しく表示できましたが、フィルター処理された統計を作成する必要があるのはなぜですか。単純な統計を作成した場合でも、同じ結果が得られたので、クエリにフィルター処理された統計が必要であるとどのように言えますか.
これまでに出くわした最高の
もの
しかし、フィルタリングされた統計がここで違いを生んだ理由をまだ理解できていません
前もって感謝します。 更新:7/4
マーティンとジェームズが答えた後に質問を言い換えると:
1.kimberelyスクリプト以外 にデータの歪みを回避する方法はありますか?推定するもう 1 つの方法は、値の行数をカウントすることです。
2.経験上、データの歪みに関する問題に直面したことがありますか?私はそれが大きなテーブルに依存していると思います.しかし、私はいくつかの詳細な回答を探しています.
3. SQL がテーブルをスキャンするための IO コストを取得する必要があります。また、統計情報の更新をトリガーするときに発生するクエリに対して、いくつかのブロッキングが発生することもあります。
理由は、DTA 入力にも基づくいくつかの条件に基づいて、フィルター処理された統計を作成することを考えているからです。
再度、感謝します