日期:2014-05-16  浏览次数:20889 次

高手指点,一个优化
表Dlyother,有一个叫Ptypeid的Nvarchar字段,字段上有索引,现在表里这个字段的数据有一般的字符串和'',没有null

Create Procedure a

@ptypeid nvarchar(50)
) 
as

select * from dlyother where (@ptypeid = '%' or ptypeid like @ptypeid)

exec a '00001'
写成这样查询的时候使用的是Ptypeid索引上得扫描,不是查找,Ptypeid上得选择性高,而且数量大,扫描的逻辑读很高
写成 select * from dlyother where ptypeid like @ptypeid
是索引查找,但是由于有'',执行计划估计行和实际行会有较大偏差,(为''的行在估计行中被排除了),执行计划可能出错
------解决方案--------------------
楼主调试一下,看它在执行什么操作,执行计划不是真的运行,所以可能有很小的误差,也有可能有些语法不作检查呀。
------解决方案--------------------
Create Procedure a

@ptypeid nvarchar(50)
)  
as
if @ptypeid = '%'
select * from dlyother 
else
select * from dlyother where ptypeid like @ptypeid

go


------解决方案--------------------
引用:
SQL code
Create Procedure a

@ptypeid nvarchar(50)
)  
as
if @ptypeid = '%'
select * from dlyother 
else
select * from dlyother where ptypeid like @ptypeid

go


++