8 sql-server statistics sql-server-2014
当用采样和全扫描估计时,NC 索引得到完全不同的统计分布;采样的具有奇异的密度向量。这会导致糟糕的执行计划。
我有一个约 27M 行的表,有一个非聚集索引支持的非空 FK 列。该表按其主键聚集。两列都是 varchar。
我们 FK 列的全扫描统计更新给出了一个正常的密度向量:
All density Average Length Columns
6,181983E-08 45,99747 INSTANCEELEMENTID
3,615442E-08 95,26874 INSTANCEELEMENTID, ID
Run Code Online (Sandbox Code Playgroud)
也就是说,对于INSTANCELEMENTID
我们加入的每个不同的数据,我们预计读取大约 1.7 行。
直方图中的典型 bin 如下所示:
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
FOOBAR 133053 10 71366 1,679318
Run Code Online (Sandbox Code Playgroud)
但是,如果我们进行抽样更新(使用该表的默认样本数为 230k 行),事情就会变得奇怪:
4,773657E-06 45,99596 INSTANCEELEMENTID
3,702179E-08 95,30183 INSTANCEELEMENTID, ID
Run Code Online (Sandbox Code Playgroud)
上的密度INSTANCEELEMENTID
现在大了两个数量级。(然而,两列的密度已被估计为一个非常可接受的值)。
直方图中的典型 bin 现在看起来像这样;
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
FOOBAR 143870,4 766,2573 1247 115,3596
ZOTZOT 131560,7 1 969 135,7092
Run Code Online (Sandbox Code Playgroud)
这是一个完全不同的分布。注意INSTANCEELEMENTID
关联数最高的ID
s有12个,最常见的数是1。 也很奇怪,有些bin得到EQ_ROWS = 1,这发生在大约10%的bin上。
没有可能导致这一点的奇怪行的“不幸”平局。
我是否正确阅读直方图?看起来采样以某种方式不正确地缩放了 EQ_ROWS、DISTINCT_RANGE_ROWS 和 AVG_RANGE_ROWS?
据我所知,这张桌子没有歪斜。我试图通过自己估计值来模拟采样器tablesample
。以正常方式计算这些结果会得到与全扫描版本一致的结果,而不是采样器。
此外,我无法在聚集索引上重现这种行为。
我已将范围缩小到此以重现:
CREATE TABLE F_VAL (
id varchar(100) primary key,
num_l_val int not null
)
set nocount on
declare @rowlimit integer = 20000000;
Run Code Online (Sandbox Code Playgroud)
该表必须足够大才能观察到这一点。我已经看到了这个用uniqueidentifer
和varchar(100)
,但不会int
。
declare @i integer = 1;
declare @r float = rand()
while @i < @rowlimit
begin
set @r = rand()
insert f_val (id,num_l_val)
values (
cast(@i as varchar(100)) + REPLICATE('f', 40 - len(@i)),
case when @r > 0.8 then 4 when @r > 0.5 then 3 when @r > 0.4 then 2 else 1 end
)
set @i = @i + 1
end
create table k_val (
id int identity primary key,
f_val varchar(100) not null,
)
insert into k_val(f_val)
select id from F_VAL
union all select id from f_val where num_l_val - 1 = 1
union all select id from f_val where num_l_val - 2 = 1
union all select id from f_val where num_l_val - 3 = 1
order by id
create nonclustered index IX_K_VAL_F_VAL ON K_VAL (F_VAL)
update statistics K_VAL(IX_K_VAL_F_VAL)
dbcc show_statistics (k_val,IX_k_VAL_F_VAL)
update statistics K_VAL(IX_K_VAL_F_VAL) WITH FULLSCAN
dbcc show_statistics (k_val,IX_k_VAL_F_VAL)
Run Code Online (Sandbox Code Playgroud)
比较两个统计数据;带有采样的那个现在代表了一个完全不同的密度向量,并且直方图 bin 关闭。请注意,该表没有倾斜。
使用int
as 数据类型不会导致这种情况,SQL Server 是否在使用时不检查整个数据点varchar
?
值得一提的是,问题似乎会扩大,提高采样率会有所帮助。
我在我可以访问的最大数据库的一些非聚集索引上看到了同样的密度问题。首先,我将从我对直方图和密度计算所做的一些观察开始:
\n\nStatMan
函数会对丢失的数据进行推断。该行为可能会根据列的数据类型而改变。作为看待该问题的一种方法,假设您从 10000 行表中抽取 100 行,并获得 100 个不同的值。对表中其余数据的一种猜测是,有 10000 个唯一值。另一种猜测是有 100 个不同的值,但每个值都重复 100 次。第二种猜测对你来说可能不合理,我同意。但是,当采样数据返回分布不均匀时,如何平衡这两种方法?该函数中包含微软为此开发的一组算法StatMan
。该算法可能不适用于所有数据中断和所有样本级别。
让我们看一个相对简单的例子。我将使用VARCHAR
表中的列来查看一些相同的行为。不过,我只会在表中添加一个偏态值。我正在针对 SQL Server 2016 SP1 进行测试。从 100k 行开始,列有 100k 唯一值FK
:
DROP TABLE IF EXISTS X_STATS_SMALL;\n\nCREATE TABLE X_STATS_SMALL (\nID VARCHAR(10) NOT NULL, \nFK VARCHAR(10) NOT NULL,\nPADDING VARCHAR(900) NOT NULL,\nPRIMARY KEY (ID)\n);\n-- insert 100k rows\nINSERT INTO X_STATS_SMALL WITH (TABLOCK)\nSELECT N, N, REPLICATE(\'Z\', 900)\nFROM dbo.GetNums(100000);\n\nCREATE INDEX IX_X_STATS_SMALL ON X_STATS_SMALL (FK);\n\n-- get sampled stats\nUPDATE STATISTICS X_STATS_SMALL IX_X_STATS_SMALL;\n
Run Code Online (Sandbox Code Playgroud)\n\n以下是统计数据中的一些示例:
\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 All density \xe2\x95\x91 Average Length \xe2\x95\x91 Columns \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1.00001E-05 \xe2\x95\x91 4.888205 \xe2\x95\x91 FK \xe2\x95\x91\n\xe2\x95\x91 1.00001E-05 \xe2\x95\x91 9.77641 \xe2\x95\x91 FK, ID \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 RANGE_HI_KEY \xe2\x95\x91 RANGE_ROWS \xe2\x95\x91 EQ_ROWS \xe2\x95\x91 DISTINCT_RANGE_ROWS \xe2\x95\x91 AVG_RANGE_ROWS \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 1005 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 10648 \xe2\x95\x91 665.0898 \xe2\x95\x91 1 \xe2\x95\x91 664 \xe2\x95\x91 1.002173 \xe2\x95\x91\n\xe2\x95\x91 10968 \xe2\x95\x91 431.6008 \xe2\x95\x91 1 \xe2\x95\x91 432 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 11182 \xe2\x95\x91 290.0924 \xe2\x95\x91 1 \xe2\x95\x91 290 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 1207 \xe2\x95\x91 445.7517 \xe2\x95\x91 1 \xe2\x95\x91 446 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91\n\xe2\x95\x91 99989 \xe2\x95\x91 318.3941 \xe2\x95\x91 1 \xe2\x95\x91 318 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\nVARCHAR
对于每行具有一个唯一值的均匀分布数据,即使具有直方图列和 14294 行的样本大小,我们也可以获得准确的密度。
现在让我们添加一个偏斜值并再次更新统计数据:
\n\n-- add 70k rows with a FK value of \'35000\'\nINSERT INTO X_STATS_SMALL WITH (TABLOCK)\nSELECT N + 100000 , \'35000\', REPLICATE(\'Z\', 900)\nFROM dbo.GetNums(70000);\n\nUPDATE STATISTICS X_STATS_SMALL IX_X_STATS_SMALL;\n
Run Code Online (Sandbox Code Playgroud)\n\n样本大小为 17010 行时,第一列的密度小于应有的密度:
\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 All density \xe2\x95\x91 Average Length \xe2\x95\x91 Columns \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 6.811061E-05 \xe2\x95\x91 4.935802 \xe2\x95\x91 FK \xe2\x95\x91\n\xe2\x95\x91 5.882353E-06 \xe2\x95\x91 10.28007 \xe2\x95\x91 FK, ID \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 RANGE_HI_KEY \xe2\x95\x91 RANGE_ROWS \xe2\x95\x91 EQ_ROWS \xe2\x95\x91 DISTINCT_RANGE_ROWS \xe2\x95\x91 AVG_RANGE_ROWS \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 10039 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 10978 \xe2\x95\x91 956.9945 \xe2\x95\x91 1 \xe2\x95\x91 138 \xe2\x95\x91 6.954391 \xe2\x95\x91\n\xe2\x95\x91 11472 \xe2\x95\x91 621.0283 \xe2\x95\x91 1 \xe2\x95\x91 89 \xe2\x95\x91 6.941863 \xe2\x95\x91\n\xe2\x95\x91 1179 \xe2\x95\x91 315.6046 \xe2\x95\x91 1 \xe2\x95\x91 46 \xe2\x95\x91 6.907561 \xe2\x95\x91\n\xe2\x95\x91 11909 \xe2\x95\x91 91.62713 \xe2\x95\x91 1 \xe2\x95\x91 14 \xe2\x95\x91 6.74198 \xe2\x95\x91\n\xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91\n\xe2\x95\x91 35000 \xe2\x95\x91 376.6893 \xe2\x95\x91 69195.05 \xe2\x95\x91 54 \xe2\x95\x91 6.918834 \xe2\x95\x91\n\xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91\n\xe2\x95\x91 99966 \xe2\x95\x91 325.7854 \xe2\x95\x91 1 \xe2\x95\x91 47 \xe2\x95\x91 6.909731 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n令人惊讶的是,AVG_RANGE_ROWS
所有步骤的值都非常统一,约为 6.9,即使对于样本无法找到重复值的键桶也是如此。我不知道这是为什么。最可能的解释是,用于猜测缺失页面的算法不能很好地适应这种数据分布和样本大小。
如前所述,可以使用直方图计算 FK 列的密度。的总和DISTINCT_RANGE_ROWS
之和为 14497。直方图有 179 个步长,因此密度应约为 1 / (179 + 14497) = 0.00006813845,这与报告的值非常接近。
使用更大的表进行测试可以显示问题如何随着表变大而变得更糟。这次我们将从 1 M 行开始:
\n\nDROP TABLE IF EXISTS X_STATS_LARGE;\n\nCREATE TABLE X_STATS_LARGE (\nID VARCHAR(10) NOT NULL,\nFK VARCHAR(10) NOT NULL,\nPADDING VARCHAR(900) NOT NULL,\nPRIMARY KEY (ID));\n\nINSERT INTO X_STATS_LARGE WITH (TABLOCK)\nSELECT N, N, REPLICATE(\'Z\', 900)\nFROM dbo.Getnums(1000000);\n\nCREATE INDEX IX_X_STATS_LARGE ON X_STATS_LARGE (FK);\n\n-- get sampled stats\nUPDATE STATISTICS X_STATS_LARGE IX_X_STATS_LARGE;\n
Run Code Online (Sandbox Code Playgroud)\n\n统计对象还不够有趣。密度为FK
1.025289E-06,接近精确值 (1.0E-06)。
现在让我们添加一个偏斜值并再次更新统计数据:
\n\nINSERT INTO X_STATS_LARGE WITH (TABLOCK)\nSELECT N + 1000000 , \'350000\', REPLICATE(\'Z\', 900)\nFROM dbo.Getnums(700000);\n\nUPDATE STATISTICS X_STATS_LARGE IX_X_STATS_LARGE;\n
Run Code Online (Sandbox Code Playgroud)\n\n样本大小为 45627 行时,第一列的密度比以前更差:
\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 All density \xe2\x95\x91 Average Length \xe2\x95\x91 Columns \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 2.60051E-05 \xe2\x95\x91 5.93563 \xe2\x95\x91 FK \xe2\x95\x91\n\xe2\x95\x91 5.932542E-07 \xe2\x95\x91 12.28485 \xe2\x95\x91 FK, ID \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n\n\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91 RANGE_HI_KEY \xe2\x95\x91 RANGE_ROWS \xe2\x95\x91 EQ_ROWS \xe2\x95\x91 DISTINCT_RANGE_ROWS \xe2\x95\x91 AVG_RANGE_ROWS \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 100023 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91 0 \xe2\x95\x91 1 \xe2\x95\x91\n\xe2\x95\x91 107142 \xe2\x95\x91 8008.354 \xe2\x95\x91 1 \xe2\x95\x91 306 \xe2\x95\x91 26.17787 \xe2\x95\x91\n\xe2\x95\x91 110529 \xe2\x95\x91 4361.357 \xe2\x95\x91 1 \xe2\x95\x91 168 \xe2\x95\x91 26.02392 \xe2\x95\x91\n\xe2\x95\x91 114558 \xe2\x95\x91 3722.193 \xe2\x95\x91 1 \xe2\x95\x91 143 \xe2\x95\x91 26.01217 \xe2\x95\x91\n\xe2\x95\x91 116696 \xe2\x95\x91 2556.658 \xe2\x95\x91 1 \xe2\x95\x91 98 \xe2\x95\x91 25.97568 \xe2\x95\x91\n\xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91\n\xe2\x95\x91 350000 \xe2\x95\x91 5000.522 \xe2\x95\x91 700435 \xe2\x95\x91 192 \xe2\x95\x91 26.03268 \xe2\x95\x91\n\xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91 ... \xe2\x95\x91\n\xe2\x95\x91 999956 \xe2\x95\x91 2406.266 \xe2\x95\x91 1 \xe2\x95\x91 93 \xe2\x95\x91 25.96841 \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\x
归档时间: |
|
查看次数: |
256 次 |
最近记录: |