Sql server 长延迟执行存储过程
当我对服务器生产8核上的数据库执行SQL查询时,大约需要7秒钟才能得到2244行 我有一个与前面的SQL查询相同的存储过程,当我对数据库执行它时,大约需要1分20秒才能获得相同的2244行 我有一个具有相同SQL查询的表值函数,当我对数据库执行它时,大约需要1分20秒才能获得相同的2244行 因此: SQL查询:7秒 存储过程:1分20秒。 表值功能:1分20秒 现在最奇怪的部分是: 在具有相同数据库的测试服务器4核上的相同场景中,我得到以下分数: SQL查询:1分20秒。 存储过程:7秒。 表值功能:7秒Sql server 长延迟执行存储过程,sql-server,Sql Server,当我对服务器生产8核上的数据库执行SQL查询时,大约需要7秒钟才能得到2244行 我有一个与前面的SQL查询相同的存储过程,当我对数据库执行它时,大约需要1分20秒才能获得相同的2244行 我有一个具有相同SQL查询的表值函数,当我对数据库执行它时,大约需要1分20秒才能获得相同的2244行 因此: SQL查询:7秒 存储过程:1分20秒。 表值功能:1分20秒 现在最奇怪的部分是: 在具有相同数据库的测试服务器4核上的相同场景中,我得到以下分数: SQL查询:1分20秒。 存储过程:7秒。 表
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select * ...
有什么东西我忘记了,导致了这么长时间的延迟吗?根据我的经验
1使用前,请尝试将您的参数放入局部变量
create procedure [dbo].[usp_test](@Id varchar(20))
as
begin
select * from Test
where Id = @Id
end
到
2使用重新编译提示。这将得到更适合基于参数值的查询的新查询计划
exec dbo.usp_test 1 with recompile
参考号
:
:根据我的经验
1使用前,请尝试将您的参数放入局部变量
create procedure [dbo].[usp_test](@Id varchar(20))
as
begin
select * from Test
where Id = @Id
end
到
2使用重新编译提示。这将得到更适合基于参数值的查询的新查询计划
exec dbo.usp_test 1 with recompile
参考号
:
:经过长时间的测试和研究,我真的认为这是一个参数嗅探问题,因为我已经做了以下测试: 正常执行SQL查询:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select * ...
像这样执行TVF:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select *
from fn_generar_reporte_cred(@field_1, @field_2, @field_3, @field_4, @field_5,
@field_6, @field_7, @field_8, @field_9)
CREATE PROCEDURE [dbo].[pa_reporte_cred_ss](
@field_1_ss INT,
@field_2_ss NVARCHAR(MAX),
@field_3_ss NVARCHAR(MAX),
@field_4_ss NVARCHAR(MAX),
@field_5_ss NVARCHAR(MAX),
@field_6_ss NVARCHAR(MAX),
@field_7_ss NVARCHAR(MAX),
@field_8_ss DATE,
@field_9_ss DATE
) AS
BEGIN
declare @field_1 int
declare @field_2 NVARCHAR(MAX)
declare @field_3 NVARCHAR(MAX)
declare @field_4 NVARCHAR(MAX)
declare @field_5 NVARCHAR(MAX)
declare @field_6 NVARCHAR(MAX)
declare @field_7 NVARCHAR(MAX)
declare @field_8 DATE
declare @field_9 DATE
SELECT @field_1 = @field_1_ss, @field_2 = @field_2_ss, @field_3 = @field_3_ss,
@field_4 = @field_4_ss, @field_5 = @field_5_ss, @field_6 = @field_6_ss,
@field_7 = @field_7_ss, @field_8 = @field_8_ss, @field_9 = @field_9_ss
SELECT * ...
像这样执行TVF:1分20秒
select *
from fn_generar_reporte_cred(1, null, null, null, null, null, null, dateadd(month, -1, getdate()), getdate())
CREATE PROCEDURE [dbo].[pa_reporte_cred](
@field_1 INT,
@field_2 NVARCHAR(MAX),
@field_3 NVARCHAR(MAX),
@field_4 NVARCHAR(MAX),
@field_5 NVARCHAR(MAX),
@field_6 NVARCHAR(MAX),
@field_7 NVARCHAR(MAX),
@field_8 DATE,
@field_9 DATE
) AS
BEGIN
SELECT * ...
正常执行SP:1分20秒
select *
from fn_generar_reporte_cred(1, null, null, null, null, null, null, dateadd(month, -1, getdate()), getdate())
CREATE PROCEDURE [dbo].[pa_reporte_cred](
@field_1 INT,
@field_2 NVARCHAR(MAX),
@field_3 NVARCHAR(MAX),
@field_4 NVARCHAR(MAX),
@field_5 NVARCHAR(MAX),
@field_6 NVARCHAR(MAX),
@field_7 NVARCHAR(MAX),
@field_8 DATE,
@field_9 DATE
) AS
BEGIN
SELECT * ...
正常执行SP,内部更改:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select *
from fn_generar_reporte_cred(@field_1, @field_2, @field_3, @field_4, @field_5,
@field_6, @field_7, @field_8, @field_9)
CREATE PROCEDURE [dbo].[pa_reporte_cred_ss](
@field_1_ss INT,
@field_2_ss NVARCHAR(MAX),
@field_3_ss NVARCHAR(MAX),
@field_4_ss NVARCHAR(MAX),
@field_5_ss NVARCHAR(MAX),
@field_6_ss NVARCHAR(MAX),
@field_7_ss NVARCHAR(MAX),
@field_8_ss DATE,
@field_9_ss DATE
) AS
BEGIN
declare @field_1 int
declare @field_2 NVARCHAR(MAX)
declare @field_3 NVARCHAR(MAX)
declare @field_4 NVARCHAR(MAX)
declare @field_5 NVARCHAR(MAX)
declare @field_6 NVARCHAR(MAX)
declare @field_7 NVARCHAR(MAX)
declare @field_8 DATE
declare @field_9 DATE
SELECT @field_1 = @field_1_ss, @field_2 = @field_2_ss, @field_3 = @field_3_ss,
@field_4 = @field_4_ss, @field_5 = @field_5_ss, @field_6 = @field_6_ss,
@field_7 = @field_7_ss, @field_8 = @field_8_ss, @field_9 = @field_9_ss
SELECT * ...
谢谢大家的帮助 经过长时间的测试和研究,我真的认为这是一个参数嗅探问题,因为我已经做了以下测试: 正常执行SQL查询:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select * ...
像这样执行TVF:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select *
from fn_generar_reporte_cred(@field_1, @field_2, @field_3, @field_4, @field_5,
@field_6, @field_7, @field_8, @field_9)
CREATE PROCEDURE [dbo].[pa_reporte_cred_ss](
@field_1_ss INT,
@field_2_ss NVARCHAR(MAX),
@field_3_ss NVARCHAR(MAX),
@field_4_ss NVARCHAR(MAX),
@field_5_ss NVARCHAR(MAX),
@field_6_ss NVARCHAR(MAX),
@field_7_ss NVARCHAR(MAX),
@field_8_ss DATE,
@field_9_ss DATE
) AS
BEGIN
declare @field_1 int
declare @field_2 NVARCHAR(MAX)
declare @field_3 NVARCHAR(MAX)
declare @field_4 NVARCHAR(MAX)
declare @field_5 NVARCHAR(MAX)
declare @field_6 NVARCHAR(MAX)
declare @field_7 NVARCHAR(MAX)
declare @field_8 DATE
declare @field_9 DATE
SELECT @field_1 = @field_1_ss, @field_2 = @field_2_ss, @field_3 = @field_3_ss,
@field_4 = @field_4_ss, @field_5 = @field_5_ss, @field_6 = @field_6_ss,
@field_7 = @field_7_ss, @field_8 = @field_8_ss, @field_9 = @field_9_ss
SELECT * ...
像这样执行TVF:1分20秒
select *
from fn_generar_reporte_cred(1, null, null, null, null, null, null, dateadd(month, -1, getdate()), getdate())
CREATE PROCEDURE [dbo].[pa_reporte_cred](
@field_1 INT,
@field_2 NVARCHAR(MAX),
@field_3 NVARCHAR(MAX),
@field_4 NVARCHAR(MAX),
@field_5 NVARCHAR(MAX),
@field_6 NVARCHAR(MAX),
@field_7 NVARCHAR(MAX),
@field_8 DATE,
@field_9 DATE
) AS
BEGIN
SELECT * ...
正常执行SP:1分20秒
select *
from fn_generar_reporte_cred(1, null, null, null, null, null, null, dateadd(month, -1, getdate()), getdate())
CREATE PROCEDURE [dbo].[pa_reporte_cred](
@field_1 INT,
@field_2 NVARCHAR(MAX),
@field_3 NVARCHAR(MAX),
@field_4 NVARCHAR(MAX),
@field_5 NVARCHAR(MAX),
@field_6 NVARCHAR(MAX),
@field_7 NVARCHAR(MAX),
@field_8 DATE,
@field_9 DATE
) AS
BEGIN
SELECT * ...
正常执行SP,内部更改:7秒
declare @field_1 int = 1
declare @field_2 NVARCHAR(MAX) = null
declare @field_3 NVARCHAR(MAX) = null
declare @field_4 NVARCHAR(MAX) = null
declare @field_5 NVARCHAR(MAX) = null
declare @field_6 NVARCHAR(MAX) = null
declare @field_7 NVARCHAR(MAX) = null
declare @field_8 DATE = dateadd(month, -1, getdate())
declare @field_9 DATE = getdate()
select *
from fn_generar_reporte_cred(@field_1, @field_2, @field_3, @field_4, @field_5,
@field_6, @field_7, @field_8, @field_9)
CREATE PROCEDURE [dbo].[pa_reporte_cred_ss](
@field_1_ss INT,
@field_2_ss NVARCHAR(MAX),
@field_3_ss NVARCHAR(MAX),
@field_4_ss NVARCHAR(MAX),
@field_5_ss NVARCHAR(MAX),
@field_6_ss NVARCHAR(MAX),
@field_7_ss NVARCHAR(MAX),
@field_8_ss DATE,
@field_9_ss DATE
) AS
BEGIN
declare @field_1 int
declare @field_2 NVARCHAR(MAX)
declare @field_3 NVARCHAR(MAX)
declare @field_4 NVARCHAR(MAX)
declare @field_5 NVARCHAR(MAX)
declare @field_6 NVARCHAR(MAX)
declare @field_7 NVARCHAR(MAX)
declare @field_8 DATE
declare @field_9 DATE
SELECT @field_1 = @field_1_ss, @field_2 = @field_2_ss, @field_3 = @field_3_ss,
@field_4 = @field_4_ss, @field_5 = @field_5_ss, @field_6 = @field_6_ss,
@field_7 = @field_7_ss, @field_8 = @field_8_ss, @field_9 = @field_9_ss
SELECT * ...
谢谢大家的帮助 你能把你的两个存储过程的查询发到你的问题中吗?嗨@JohnOdom,正如我解释的,只有一个存储过程。我无法发布SQL查询,因为企业策略。嗯……您尝试过使用CLR集成吗?我刚刚从文章中了解到,扩展存储过程已被弃用,如果可能的话,应该避免使用。感谢您的澄清:。试着检查一下这是否有帮助。也许将您的问题迁移到该站点将帮助您更快地获得所需的答案,尽管这个问题现在听起来更像是我链接中问题的重复。听起来参数嗅探可能是一个问题。试着解决这个问题。你能把你的两个存储过程的查询发布到你的问题中吗?嗨@JohnOdom,正如我解释的,只有一个存储过程。我无法发布SQL查询,因为企业策略。嗯……您尝试过使用CLR集成吗?我刚刚从文章中了解到,扩展存储过程已被弃用,如果可能的话,应该避免使用。感谢您的澄清:。试着检查一下这是否有帮助。也许将您的问题迁移到该站点将帮助您更快地获得所需的答案,尽管这个问题现在听起来更像是我链接中问题的重复。听起来参数嗅探可能是一个问题。尝试解决这个问题。当我直接在SQL查询上使用option recompile时,执行它需要1分20秒。当我对存储过程使用带有重新编译的提示时,执行它会持续花费1分20秒。?可能是执行长延迟任务的重新编译操作吗?当我直接在SQL查询上使用option recompile时,执行它需要1分20秒。当我对存储过程使用带有重新编译的提示时,执行它会持续花费1分20秒。?可能是执行长延迟任务的重新编译操作吗?