数据库 MSSQL2012
 
sql语句:select * from LogLogin
 
存储过程代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE P_TB_Log
AS
declare @sql nvarchar(4000)
BEGIN
 
 SET NOCOUNT ON;
    set @sql = 'select * from LogLogin'
 exec(@sql)
END
GO
 
该表的数据量100万+
 
直接执行sql语句用时7秒
执行存储过程跑了2分钟还没出来结果
 
请教理论上存储过程应该要比直接执行sql语句要快 为什么实际上却慢呢

解决方案 »

  1.   


    好吧 我重启mssql服务 然后重新执行查询结果还是一样
      

  2.   

    肿么现在CSDN一点都不活跃了 
      

  3.   

    set statistics time on看一下
      

  4.   

    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。(1000193 行受影响) SQL Server 执行时间:
       CPU 时间 = 514 毫秒,占用时间 = 7642 毫秒。
    这个是直接执行sql语句的  
    存储过程的还再跑
      

  5.   


    存储过程跑挂了
    你不用动态在存储过程中跑性能怎么样?
    SET ANSI_NULLS ON
     GO
     SET QUOTED_IDENTIFIER ON
     GO
     alter PROCEDURE P_TB_Log
     AS
     BEGIN
      
      SET NOCOUNT ON;
         select * from LogLogin
     END
     GO
    照样跑挂掉
      

  6.   

    没有 我打个SP1的补丁试一下
    恩 打个补丁试一下吧,感觉2012还是有很多BUG的。 
      

  7.   

    没有 我打个SP1的补丁试一下
    恩 打个补丁试一下吧,感觉2012还是有很多BUG的。 
    补丁打过了 还是一样 
      

  8.   

    对啊 不管怎么样 存储过程不会比直接执行sql慢才对
      

  9.   

    数据量也不算多 就100万行 但是直接sql查询只需要7秒 现在的问题是 存储过程去查为什么更慢
      

  10.   

    set statistics time on结果呢?另外看一下等待信息。
      

  11.   

    你这个问题应该和你的SQL Server环境有关系,不是都这样,当你执行proc时,你新开一个session执行下面的代码,看wait_resource内容是什么?select 
    s.session_id, r.blocking_session_id,
    s.host_name, s.login_name, 
    databasename=db_name(r.database_id),r.command, r.status as sqlexecstatus,
    current_execute_sql = substring(t.text,
    r.statement_start_offset / 2 + 1,
    case
    when statement_end_offset = -1 then len(t.text)
    else (r.statement_end_offset - statement_start_offset) / 2+1
    end),
    s.program_name,
    s.status,
    s.cpu_time, memory_usage_kb = s.memory_usage * 8, s.reads, s.writes,
    s.transaction_isolation_level,
    c.connect_time, c.last_read, c.last_write,
    c.net_transport, c.client_net_address, c.client_tcp_port, c.local_tcp_port,
    r.start_time, 
    r.wait_time, r.wait_type, r.last_wait_type, r.wait_resource,
    r.open_transaction_count, r.transaction_id
    from sys.dm_exec_sessions s
    left join sys.dm_exec_connections c
    on s.session_id = c.session_id
    left join sys.dm_exec_requests r
    on s.session_id = r.session_id
    and c.connection_id = r.connection_id
    outer apply sys.dm_exec_sql_text(r.sql_handle) t
    where 1=1
    and s.is_user_process = 1 and command is not null
      

  12.   

    我也感觉SQL2012慢.比SQL2000要明显的慢很多
      

  13.   

    1. 把二者的执行计划贴出来,
    2 然后打开几个开关比较下
    set statistics io on;
    set statistics time on;
    set statistics profile on;