Sql server 存储过程运行速度很快,但可能非常慢

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

我有一个在应用程序中运行的存储过程。它通常在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].[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 ) )