Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2016中调试与存储过程执行有关的奇怪场景_Sql_Sql Server_Stored Procedures_Sql Server 2016_Query Performance - Fatal编程技术网

在SQL Server 2016中调试与存储过程执行有关的奇怪场景

在SQL Server 2016中调试与存储过程执行有关的奇怪场景,sql,sql-server,stored-procedures,sql-server-2016,query-performance,Sql,Sql Server,Stored Procedures,Sql Server 2016,Query Performance,在我们的组织中,我们在Azure上有SQL Server VM,其始终处于可用性组中,具有2个节点 场景: 我们有一个称为“SP_xyz”的过程,它包含一个select查询,很少有内部联接来获取凭证持有者列表。加载一段时间后,该存储过程(SP)开始运行缓慢,因此我们对其进行了优化,并将该SP重新投入生产,并且在一段时间内运行良好 几个月后,随着负载增加,该SP再次出现缓慢问题,我们再次分析了该SP并进行了优化。现在谜团来了,只是为了交叉验证新优化的SP,我们在生产中使用_test创建了相同的SP

在我们的组织中,我们在Azure上有SQL Server VM,其始终处于可用性组中,具有2个节点

场景:

  • 我们有一个称为“SP_xyz”的过程,它包含一个select查询,很少有内部联接来获取凭证持有者列表。加载一段时间后,该存储过程(SP)开始运行缓慢,因此我们对其进行了优化,并将该SP重新投入生产,并且在一段时间内运行良好

  • 几个月后,随着负载增加,该SP再次出现缓慢问题,我们再次分析了该SP并进行了优化。现在谜团来了,只是为了交叉验证新优化的SP,我们在生产中使用_test创建了相同的SP。新的SP是“SP_xyz_测试”

  • 当我们在prod中使用旧SP(SP_xyz)运行缓慢的同一组参数运行此新的_测试SP时,新优化的SP以毫秒为单位给出结果,而旧SP则以几秒钟为单位

  • 令我们惊讶的是,下一次运行旧SP时,它也开始以毫秒为单位给出结果。这让我们非常害怕,因为在生产中会出现这样的问题,因为我们有大约300多个SQL存储过程

  • 我们确实分析了一些我们能想到的事情,以找到根本原因:

  • 索引重建
  • 统计数据更新
  • 正如我们所知,SP执行计划将特定于SP名称。但我们现在想知道的是,旧SP是如何变得更快的

    但所有这些事情都已安排好并在生产环境中运行,旧SP开始运行缓慢。但是新的测试SP运行的运动变得非常快


    我们是否遗漏了任何内容,以前是否有人遇到过此问题?

    我认为根据您提供的详细信息,不清楚。但由于您使用的是sqlserver 2016。。可以使用querystore随时间跟踪语句或存储过程的执行

    随着时间的推移,一个查询可能会有不同的计划,一个计划可能会执行得更好,而另一个计划可能不会。因此,当您启用查询存储时,您可以在“回归查询”部分中看到随时间推移的所有计划更改,这可以帮助您分析为什么一个计划比另一个计划花费更多的时间。至少这是一个起点

    下面是一个查询,其中包含不同的计划(点表示一段时间内的新计划)和图形上绘制的位置表示所用的时间


    我认为您提供的详细信息并不清楚。但由于您使用的是sqlserver 2016。。可以使用querystore随时间跟踪语句或存储过程的执行

    随着时间的推移,一个查询可能会有不同的计划,一个计划可能会执行得更好,而另一个计划可能不会。因此,当您启用查询存储时,您可以在“回归查询”部分中看到随时间推移的所有计划更改,这可以帮助您分析为什么一个计划比另一个计划花费更多的时间。至少这是一个起点

    下面是一个查询,其中包含不同的计划(点表示一段时间内的新计划)和图形上绘制的位置表示所用的时间


    不确定你是否得到了答案

    我想这是典型的执行计划过时的情况,因为您的过程是动态的

    尝试
    重新编译
    选项

    CREATE PROCEDURE SP_xyz
    WITH RECOMPILE
    AS
    BEGIN
     .......
    END
    GO
    

    不确定你是否得到了答案

    我想这是典型的执行计划过时的情况,因为您的过程是动态的

    尝试
    重新编译
    选项

    CREATE PROCEDURE SP_xyz
    WITH RECOMPILE
    AS
    BEGIN
     .......
    END
    GO
    

    事实上,这不是我想要的。这是sql server中存储过程的基本情况。我的问题是,在不改变任何东西的情况下,如何在同一个db服务器上运行具有不同名称的优化Sp,Sp就可以开始更快地运行。我认为参数嗅探可能是一个问题here@TT--如果标题没有摘要,则表示抱歉。我把标题放在我能想到的地方。我将尝试为不同的参数集修改它的发生情况…这实际上不是我想要的。这是sql server中存储过程的基本情况。我的问题是,在不改变任何东西的情况下,如何在同一个db服务器上运行具有不同名称的优化Sp,Sp就可以开始更快地运行。我认为参数嗅探可能是一个问题here@TT--如果标题没有摘要,则表示抱歉。我把标题放在我能想到的地方。我将尝试为不同的参数集修改它的发生情况……这将有助于确定前后的查询计划。但是在生产中,我们没有启用查询存储来捕获计划。所以我们没有数据可以核实。但在此之前,是什么导致更改查询计划是我的基本问题?查询计划更改可能是由于多种原因造成的..统计信息过期/统计信息重新编译,表更改..重新编译提示..我所知不多,但所有这些事情都在服务器上定期发生,而此SP运行缓慢。我们用不同的名称测试了优化的sp(_test),这有助于识别前后的查询计划。但是在生产中,我们没有启用查询存储来捕获计划。所以我们没有数据可以核实。但在此之前,是什么导致更改查询计划是我的基本问题?查询计划更改可能是由于多种原因造成的..统计信息过期/统计信息重新编译,表更改..重新编译提示..我所知不多,但所有这些事情都在服务器上定期发生,而此SP运行缓慢。我们用不同的名称测试了优化的sp(_test),移动速度变快了。我们尝试了此选项,但没有成功。无论如何,即使它有效,我们如何确保在生产中需要定期重新编译多少SP。而且,这也不可行。因为我们不能在所有运行缓慢的SP中使用此选项,因为存储过程在性能方面的整体理念受到了影响。我们尝试了此选项,但没有成功。无论如何,即使我们如何确保在生产中