zoukankan      html  css  js  c++  java
  • sp_executesql是参数部分的长度定义发生变化能否重用执行计划

    准备工作

    create table dbo.ta(id varchar(10) ,c char(10))
    go
    insert dbo.ta 
    select ROW_NUMBER() over(order by c1.name) id,'x' from sys.columns c1 cross join sys.columns c2
    go
    create index index1 on dbo.ta(id)
    go
    dbcc freeproccache
    go

    接下来要用select *from ta where id='1'的方式执行两次,看看是否重用了存储过程

    dbcc freeproccache
    go
    DECLARE @value varchar(1);
    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);

    /* Build the SQL string one time.*/
    SET @SQLString =
         N
    'select * from dbo.ta 
           WHERE id = @id
    ';
    SET @ParmDefinition = N'@id varchar(1)';
    /* Execute the string with the first parameter value. */
    SET @value = '1';
    EXECUTE sp_executesql @SQLString@ParmDefinition,
                          
    @id = @value;
    go
    DECLARE @value varchar(2);
    DECLARE @SQLString nvarchar(500);
    DECLARE @ParmDefinition nvarchar(500);

    /* Build the SQL string one time.*/
    SET @SQLString =
         N
    'select * from dbo.ta 
           WHERE id = @id
    ';
    SET @ParmDefinition = N'@id varchar(2)';
    /* Execute the string with the first parameter value. */
    SET @value = '10';
    EXECUTE sp_executesql @SQLString@ParmDefinition,
                          
    @id = @value;
    go

    查看执行计划


    SELECT  execution_count,
        
    SUBSTRING(st.text, (qs.statement_start_offset/2)+1
            ((
    CASE qs.statement_end_offset
              
    WHEN -1 THEN DATALENGTH(st.text)
             
    ELSE qs.statement_end_offset
             
    END - qs.statement_start_offset)/2+ 1AS statement_text
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    where st.text  not like '%dm_exec_sql_text%'

    执行结果如下:

    execution_count      statement_text
    -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1                    select * from dbo.ta
           WHERE id = @id
    1                    select * from dbo.ta
           WHERE id = @id

    (2 行受影响)

    说明长度发生变化无法重用计划

  • 相关阅读:
    2017博普杯 东北大学邀请赛(B. Drink too much water)(贪心+树链剖分)
    AGC018D Tree and Hamilton Path(树+树的重心)
    BZOJ2843:极地旅行社
    P++ 1.0.5
    BZOJ1052:[HAOI2007]覆盖问题
    BZOJ3098:Hash Killer II
    BZOJ2784:[JLOI2012]时间流逝
    BZOJ2282:[SDOI2011]消防
    BZOJ1875:[SDOI2009]HH去散步
    Codeforces 504 A (Round #285 div.1 A) Misha and Forest
  • 原文地址:https://www.cnblogs.com/qanholas/p/2313561.html
Copyright © 2011-2022 走看看