日期:2014-05-19  浏览次数:20467 次

关于优化的小问题,我是个新手能帮我看看我写的存储过程吗?
我在编写存储过程时有个小问题,当我调用存储过程时将原来的ID码转换成了char字符型,而我本来的设计是直接读取int   整形,而为了方便调用复杂的查询语句不得不见其转换成字符型+CAST   (   @DLID   AS   VARCHAR(10)   )+ ',这将影响数据的查询速度,请问有什么好办法吗?  

SET   QUOTED_IDENTIFIER   ON  
GO
SET   ANSI_NULLS   ON  
GO


CREATE       proc   sp_DL_Date_Day  
(
@b   datetime,
@e   datetime,
@DLID   int

)
as
begin
declare   @sql   varchar(8000)
set   @sql   = 'select   ZLID   中类ID,CatCName '
select   @sql=@sql+   ',sum(CASE   CatDate   when   ' ' '
  +   convert(varchar(10),   TrueDate,120)+
  ' ' 'then   Cost   else   0   end)[ '
  +   convert(varchar(10),TrueDate,120)   +   '] '
from   (select   TrueDate   from   SDate   where   TrueDate   > =   @b   and   TrueDate   <=   @e)   as   a

set   @sql   =   @sql   +   ',   sum(Cost)   总计花费  
from   ((select   *   from   AD_CBD   where   CatDate   > =   ' ' '
+CAST   (   @b   AS   VARCHAR(10)   )+ ' ' 'and   CatDate   <= ' ' '
+CAST   (   @e   AS   VARCHAR(10)   )+ ' ' '   )   as   b  
inner   join   AD_Cat   as   p  
on   b.CatID   =   p.CatID)
where   DLID   = '   +CAST   (   @DLID   AS   VARCHAR(10)   )+ '
Group   by   p.ZLID,CatCName
order   by   sum(Cost)   Desc '

exec(@sql)  
end


GO
SET   QUOTED_IDENTIFIER   OFF  
GO
SET   ANSI_NULLS   ON  
GO




------解决方案--------------------
寫的不是很複雜,感覺語句上沒有多少可以優化的地方。
------解决方案--------------------
比较值为CAST ( @DLID AS VARCHAR(10) )这不会影响效率,而且你的是动态语句,编译后应该没有什么影响
这里的内嵌的查询不要用 *,指定需要的列,比如就需要CatID
in比这个要差
如果效率确实不高,可以建临时表(带索引)或索引视图来提高效率