日期:2014-05-18  浏览次数:20534 次

高分帮助解决2008R2下存储过程速度优化
我们存储过程如下。执行2000条内容20个字段的内容的数据需要3称,执行5万条测试数据带内容需要2万,这是在没有添加任何判断条件的情况。

能让速度达到,1称以内最好。如果大量访问,肯定执行效率就变慢了。

请高手看看,这存储过程有没有速度再提升的优化办法,数据sql2008R2,我的数据量有,10-20万。

/****** Object: StoredProcedure [dbo].[dl_selectInfo] Script Date: 09/02/2011 23:14:53 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
------------------------------------
--用途:查询详细信息 
--项目名称:slectInfomaction
--说明:
--@topNum 查询记录数,为0或者空表示全部
--@sField 查询的字段
--@sTable 查询的表
--@sCondition 查询条件
--@sOrder 排序
--时间:2009-1-14 0:01:43
------------------------------------
ALTER PROCEDURE [dbo].[dl_selectInfo]
(
 @topNum int,
 @sField nvarchar(1000),
 @sTable nvarchar(100),
 @sCondition nvarchar(1000),
 @sOrder nvarchar(100)
)
AS 
 DECLARE @sCond1 nvarchar(1000)
 DECLARE @iAsc int,@iDesc int
 DECLARE @topStr nvarchar(50),@sFieldStr nvarchar(1000),@sOrderTmp nvarchar(1000),@sSQL nvarchar(4000)
 IF @topNum=0 
  begin
  set @topStr=''
  end
 Else
  begin
  set @topStr='top '+ CAST(@topNum AS nvarchar)
  end
 IF @sField='' or len(@sField)<=0
  begin
  set @sFieldStr='*'
  end
 Else
  begin
  set @sFieldStr=@sField
  end
 IF LEN(@sCondition)>2
  BEGIN
  SET @sCond1=' WHERE '+@sCondition
  END
 ELSE
  BEGIN
  SET @sCond1=''
  END
 IF LEN(@sCondition)>2
  BEGIN
  SET @sCond1=' WHERE '+@sCondition
  END
 ELSE
  BEGIN
  SET @sCond1=''
  END
 IF LEN(@sOrder)<4
  BEGIN
  SET @sOrder=''
  END
 Else
  BEGIN
  SET @sOrderTmp=UPPER(@sOrder)
  --SET @sOrderTmp=SUBSTRING(@sOrderTmp,CHARINDEX(UPPER(@sPkey),@sOrderTmp),LEN(@sOrderTmp))
  SET @iAsc=CHARINDEX('ASC',@sOrderTmp)
  SET @iDesc=CHARINDEX('DESC',@sOrderTmp)
  IF (@iAsc>0 and @iDesc=0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc<@iDesc))
  BEGIN
  SET @sOrder=' ORDER BY '+@sOrder
  END
  ELSE IF (@iAsc=0 and @iDesc>0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc>@iDesc))
  BEGIN
  SET @sOrder=' ORDER BY '+@sOrder
  END
  ELSE
  BEGIN
  SET @sOrder=''
  END
  END

SET @sSQL='SELECT '+@topStr +' '+@sFieldStr+' FROM '+@sTable+' '+@sCond1+' '+@sOrder
EXEC(@sSQL)


------解决方案--------------------
最好不用动态查询.
如果一定要将条件引入到存储过程内部,可以考虑利用引入的参数进行条件分支程序,并将一部分参数作为查询参数,直接用语句查询,这样才能充分利用存储过程的预编译功能.论坛里好多答题都喜欢用动态,其实它对查询效率影响是非常大的.
------解决方案--------------------
没有进一步的信息,从字面上来看:
 1.拼接查询字串,应该参数化,减少重编译来减少cpu利用
 2.打印出几次最终的查询语句,用优化顾问检查一下索引,并做相应调整
 3.将exec改成sp_executesql