大型系统的就是在相同结果集情况下,尽可能减少逻辑IO。
http://www.it55.com在线教程
1.1 where条件的列上都得有统计信息。
没统计信息SQLServer就无法估算不同查询计划开销优劣,而只能采用最稳妥的Scan(不管是table scan还是clustered index scan)。一般情况下我们不会犯这种错误——where条件里不使用非索引列是个常识。索引上的统计信息是无法删除的。 免费资源http://www.it55.com
1.2 尽量不使用不等于(!=)或者NOT逻辑运算符。
这条规则被广为传颂,原因据联机文档和百敬优化。如下:
create table tb1
(
col1 int identity(1,1) primary key, 免费壁纸下载http://www.it55.com
col2 int not null, 免费壁纸下载http://www.it55.com
col3 varchar(64) not null
) 免费网页模版下载http://www.it55.com
create index ix_tb1_col2 on tb1
免费设计素材下载http://www.it55.com
(
col2
) 精美韩国模版下载http://www.it55.com
create index ix_tb1_col3 on tb1 IT资讯之家 http://www.it55.com
(
col3 免费设计素材下载http://www.it55.com
) 免费资源http://www.it55.com
declare @f int 免费网页模版下载http://www.it55.com
set @f = 0 vd;k;l http://www.it55.com rdfg
while @f < 9999 免费壁纸下载http://www.it55.com
begin 精美韩国模版下载http://www.it55.com
insert into tb1 (col2, col3) values(1, 'ssdd')
set @f = @f + 1 http://www.it55.com/
end
insert into tb1 (col2, col3) values(0, 'aadddd')
IT资讯之家 http://www.it55.com
insert into tb1 (col2, col3) values(2, 'bbddd') 免费设计素材下载http://www.it55.com
insert into tb1 (col2, col3) values(3, 'bbaaddddddaa')
通过上述代码,各位可以看到数据分布。col2值为1的有9999条;col2值为0、2、3的分别有1条。
按照本条规则,!= 和NOT带来的应该是个scan操作,但实际情况是:免费资源http://www.it55.com
SQL2k5很聪明,它依据统计信息免费矢量图片素材下载http://www.it55.com
1.3 查询条件中不要包含运算
这些运算包括字符串连接(如:select * from Users where UserName + ‘pig’ = ‘张三pig’),通配符在前面的Like运算(如:select * from tb1 where col4 like ‘%aa’),使用其他用户自定义函数、系统内置函数、标量函数等等(如:select * from UserLog where datepart(dd, LogTime) = 3)。
SQLServer在处理以上语句时,一样没办法估算开销。最终结果当然是clustered index scan或者table scan了。
(编辑:IT资讯之家 www.it55.com )