日期:2014-05-17 浏览次数:20521 次
create table TestSniff
(
id int,
cloumn1 varchar(50),
cloumn2 varchar(50),
cloumn3 varchar(50),
cloumn4 varchar(50)
)
truncate table TestSniff
--生成不均匀的数据分布,id=10的占整个表的10%
declare @i int
set @i=1
while @i<10000
begin
if(@i%10=0)
begin
insert into TestSniff values(10,NEWID(),NEWID(),NEWID(),NEWID())
end
else
begin
insert into TestSniff values(@i,NEWID(),NEWID(),NEWID(),NEWID())
end;
set @i=@i+1
end
--id上建索引
create index index_id on testSniff(id)
set statistics profile on
set statistics io on
--因为10的分布占了整个表的10%,
--select * from TestSniff where id=10;走表扫描是正确的选择
--为了验证,看了一下强制走索引,其代价也明显大于表扫描
--select * from TestSniff with(index(index_id)) where id=10;
select * from TestSniff where id=10;
--这没问题,第一次执行,产生了一个缓存计划
create proc usp_testSniff(@i int)
as
declare @tmp int
set @tmp=@i
select * from TestSniff where id = @tmp --option(recompile)
--注意,执行select * from TestSniff where id=10;之后没有清楚计划缓存
--先执行了select * from TestSniff where id=10;
--那道理讲,缓存中已经有了执行计划,但是执行存储过程中,又重新编译了,
--选择了一个并不合理的执行计划
exec usp_testSniff 10
--再次执行
exec usp_testSniff 10
--这次才利用到计划缓存,可惜是上次生成的不合理的计划缓存
SELECT* from @tb OPTION(RECOMPILE)
--为什么 Estimated Rowcount为1024?
--因为总共就插入了1024行,插入之后再次评估它的行数,就能得它比较准确的值。
SELECT* from @tb where [C1] like '1' OPTION(RECOMPILE)
--为什么 Estimated Rowcount为102.4?
--对于不模糊的like,Estimated Rowcount=total count *10%=1024*10%=102.4
Estimated Ro