发表于 2015-7-2 10:14:37

SQL Server中存储过程比直接运行SQL语句慢的原因

在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点:1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据 库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL语句和程序代码语句的分离,可以提高程序代码的 可读性。
3.       存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。
4.       安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:
A.       系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。
B.       扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
C.       用户自定义的存储过程,这是我们所指的存储过程常用格式
    模版:Create procedure procedue_name [@parameter data_type]
    {recompile|encryption} as sql_statement
    解释:output:表示此参数是可传回的
with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。

   但是最近我们项目组中有人写了一个存储过程,其计算时间为1个小时47分钟,而有的时候运行时间都超过了两个小时,同事描述说如果将存储过程中的语句拿出来直接运行也就10分钟左右就运行完毕,我没当回事,但是今天我自己写的存储过程也遇到了这个问题,在查找资料后原因终于找到了原因,原来是Parameter sniffing问题。
    下面看我是如何将运行一个小时以上的存储过程优化成在一分钟之内完成的:
原存储过程
CREATE PROCEDURE .
@THEDATE VARCHAR(30)
AS
BEGIN
    IF @THEDATE IS NULL
    BEGIN
       SET @THEDATE=CONVERT(VARCHAR(30),GETDATE()-1,112);
    END


    DELETE FROM RPT_IM_USERINFO_DAILY WHERE THEDATE=@THEDATE;

    INSERT RPT_IM_USERINFO_DAILY (THEDATE,ALLUSER,NEWUSER)
    SELECT AA.THEDATE,ALLUSER,NEWUSER
    FROM
    ( ( SELECT THEDATE,COUNT(DISTINCT USERID) ALLUSER
       FROM FACT
       WHERE THEDATE=@THEDATE
      GROUP BY THEDATE
       ) AA
       LEFT JOIN
       (SELECT THEDATE,COUNT(DISTINCT USERID) NEWUSER
      FROM FACT T1
      WHERE NOT EXISTS(
                         SELECT 1
                         FROM FACT T2
                         WHERE T2.THEDATE=@thedate then null else thedate end) as dates,
            count(case when thedate=@thedate then thedate else null end) as today
       from   FACT
       group by userid
    )as fact
GO
测试结果为30ms以下。
  from:http://blog.iyunv.com/emili/archive/2008/03/17/2192081.aspx
页: [1]
查看完整版本: SQL Server中存储过程比直接运行SQL语句慢的原因