如果我将表中的列声明为主键,则会为该列创建统计信息,但即使向表中添加了大量数据,这些统计信息也是空的。如果我在添加数据后将主键添加到able,那么stats将填充有意义的信息。为什么预先创建主键不会产生有意义的统计信息,不管我向表中添加了多少数据?
案例1
:下面是使用主键创建表的代码:
create table t
(
col1 int primary key,
col2 int
)
go
--insert 150000 records into table
insert into t (col1, col2)
select top 150000
row_number() over (order by (select null)),
row_number() over (order by (select null))
from
master.dbo.syscolumns
cross join
master.dbo.syscolumns as c
案例2
:下面是创建表的代码,其中的主键是在将数据摄取到表中之后创建的:
create table t
(
col1 int not null,
col2 int
)
go
--insert 150000 records into table
insert into t (col1, col2)
select top 150000
row_number() over (order by (select null)),
row_number() over (order by (select null))
from
master.dbo.syscolumns
cross join
master.dbo.syscolumns as c
alter table t
add constraint pk_col1 primary key (col1)
对于案例1,即使我试图通过对col1进行过滤来搜索索引,即使这样,统计信息也不会更新:
select *
from t
where col1 = 4050
对列进行筛选通常会创建统计信息,即使表是堆:
create table t1
(
col1 int,
col2 int
)
go
--insert 15000 records into table
insert into t (col1, col2)
select top 150000
row_number() over (order by (select null)),
row_number() over (order by (select null))
from
master.dbo.syscolumns
cross join
master.dbo.syscolumns as c
select *
from t1
where col1 = 4050