【发布时间】:2018-06-18 11:04:52
【问题描述】:
我目前正在运行 CREATE PROC 查询来创建一个主存储过程,该过程依次运行 17 个其他存储过程。每个都被一个 INSERT INTO 语句夹在中间,将一行放入审计表中,显示 sproc 在它之前运行的日期时间,然后在它之后添加一个 UPDATE 语句,添加 sproc 完成运行的日期时间。例如;
------------------------------------------------------ STEP 1------------------------------------------------------
INSERT INTO [audit].[Marketing_Prefs_JobRun]
(
[Run_Step],
[Run_Start]
)
VALUES
(
1, -- Run_Step - int
GETDATE() -- Run_Start - datetime
)
GO
EXEC [dbo].[sp_Step_01_Refresh_Branch_4_Quotes]
GO
UPDATE [audit].[Marketing_Prefs_JobRun]
SET
[audit].[Marketing_Prefs_JobRun].[Run_End] = GETDATE()
WHERE [audit].[Marketing_Prefs_JobRun].[Run_Step] = 1
AND (
CAST([Run_Start] AS DATE) = CAST(GETDATE() AS DATE)
AND [Run_End] IS NULL
)
GO
所以在这个 create proc 语句中有以上 17 个。
目前 CREATE PROC 查询为 53 分钟,还在计数中。
在运行执行这 17 个存储过程的基本查询时,使用 PRINT 语句显示每个存储过程的完成时间,整个批处理大约需要 1 小时 10 分钟(或多或少)来运行。
用于创建我的主存储过程的 CREATE PROC 查询是否实际运行在所有 17 个将被调用的存储过程的代码中?我很难想象为什么创建程序需要这么长时间。
【问题讨论】:
-
CREATE PROC通常应该很快。您的 SP 的CREATE声明是什么?你忘了包括它。 -
@Larnu 这简直就是; CREATE PROC [audit].Marketing_Prefs_Run_Log AS SET NOCOUNT ON 然后上面主要问题中的 17 个代码块。
-
上面的代码中有批处理分隔符 (
GO)。如果您的 SP 中有上述代码,那么您的 SP only 将包含INSERT INTO [audit].[Marketing_Prefs_JobRun] ( [Run_Step], [Run_Start] ) VALUES ( 1, -- Run_Step - int GETDATE() -- Run_Start - datetime ) -
是的,当我将 select 语句版本转换为 sproc 时,我才意识到我应该把这些去掉。我已经把它们全部换成了 ;它会立即创建存储空间。小学生错误!
标签: sql-server stored-procedures