Sql server 存储过程运行速度很快,但可能非常慢
我有一个在应用程序中运行的存储过程。它通常在500毫秒内完成,但有时可能需要5秒钟。如何消除5秒跑步?非常感谢您的帮助Sql server 存储过程运行速度很快,但可能非常慢,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,我有一个在应用程序中运行的存储过程。它通常在500毫秒内完成,但有时可能需要5秒钟。如何消除5秒跑步?非常感谢您的帮助 --Table definition: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N'[dbo].[EventValue]') AND type in (N'U')) DROP TABLE [dbo].[EventValue] GO CREATE TABLE [dbo].[Event
--Table definition:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N'[dbo].[EventValue]') AND type in (N'U'))
DROP TABLE [dbo].[EventValue]
GO
CREATE TABLE [dbo].[EventValue](
[MetricId] [int] NOT NULL,
[AttributeId] [int] NOT NULL,
[DataRunId] [int] NOT NULL,
[CurrentDataTime] [bigint] NOT NULL,
[AType] [bit] NOT NULL,
[Mm] [int] NOT NULL,
[ReceivedDataTime] [bigint] NOT NULL,
[ValueList] nvarchar(4000) NULL,
[MState] [int] NULL,
[OId] [int] NULL,
[EventStartTime] [bigint] NULL,
[EventEndTime] [bigint] NULL,
[EventEST] [bigint] NOT NULL,
[EventEE] [int] NULL
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_EventValue_DataRunId_EventEndTime] ON [dbo].[EventValue]
(
[DataRunId] ASC,
[EventEndTime] ASC
)
INCLUDE ( [CurrentDataTime]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX [IX_EventValue_DataRunId_CurrentDataTime ] ON [dbo].[EventValue]
(
[DataRunId] ASC,
[CurrentDataTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_EventValueEventEST] ON [dbo].[EventValue]
(
[EventEST] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DataRun]') AND type in (N'U'))
DROP TABLE [dbo].[DataRun]
GO
CREATE TABLE [dbo].[DataRun](
[Id] [int] IDENTITY(1,1) NOT NULL,
[PersonId] [uniqueidentifier] NOT NULL,
[WallTime] datetime2(7) NOT NULL,
[DataTimeSeed] [bigint] NOT NULL,
CONSTRAINT [PK_TimeMapping] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
在[小学]
去
将两个插入合并为一个插入,如下所示
INSERT INTO @EventValueResultSet(....)
SELECT ....
....
FROM dbo.EventValue EV WITH (NOLOCK))
INNER JOIN dbo.DataRun_ DR WITH (NOLOCK)
ON EV.dataRunId = DR.Id
AND DR.PersonId = @PersonId
WHERE PhysioCurrentDataTime BETWEEN @blockStartTime AND @endTime
OR ( ( CurrentDataTime < @blockStartTime )
AND ( EventEndTime = 0
OR EventEndTime >= @blockStartTime ) )
你真的需要诺洛克吗?您对丢失和/或重复的数据满意吗?我还注意到您正在强制执行索引提示…这可能是一个非常糟糕的选择,因为您告诉编译器您比sql更了解查询所使用的索引。这应该是最后的手段。
INSERT INTO @EventValueResultSet(....)
SELECT ....
....
FROM dbo.EventValue EV WITH (NOLOCK))
INNER JOIN dbo.DataRun_ DR WITH (NOLOCK)
ON EV.dataRunId = DR.Id
AND DR.PersonId = @PersonId
WHERE PhysioCurrentDataTime BETWEEN @blockStartTime AND @endTime
OR ( ( CurrentDataTime < @blockStartTime )
AND ( EventEndTime = 0
OR EventEndTime >= @blockStartTime ) )