我们存储过程如下。执行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
--说明:
[email protected] 查询记录数,为0或者空表示全部
[email protected] 查询的字段
[email protected] 查询的表
[email protected] 查询条件
[email protected] 排序
--时间: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 @[email protected]
end
IF LEN(@sCondition)>2
BEGIN
SET @sCond1=' WHERE [email protected]
END
ELSE
BEGIN
SET @sCond1=''
END
IF LEN(@sCondition)>2
BEGIN
SET @sCond1=' WHERE [email protected]
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 [email protected]
END
ELSE IF (@iAsc=0 and @iDesc>0) OR ((@iAsc>0 AND @iDesc>0) AND (@iAsc>@iDesc))
BEGIN
SET @sOrder=' ORDER BY [email protected]
END
ELSE
BEGIN
SET @sOrder=''
END
END
SET @sSQL='SELECT [email protected] +' [email protected]+' FROM [email protected]+' [email protected]+' [email protected]
EXEC(@sSQL)
------解决方案--------------------
最好不用动态查询.
如果一定要将条件引入到存储过程内部,可以考虑利用引入的参数进行条件分支程序,并将一部分参数作为查询参数,直接用语句查询,这样才能充分利用存储过程的预编译功能.论坛里好多答题都喜欢用动态,其实它对查询效率影响是非常大的.
------解决方案--------------------
没有进一步的信息,从字面上来看:
1.拼接查询字串,应该参数化,减少重编译来减少cpu利用
2.打印出几次最终的查询语句,用优化顾问检查一下索引,并做相应调整
3.将exec改成sp_executesql