提高SQL Server存储过程的性能

时间:2013-02-21 09:30:40

标签: sql sql-server-2008

我正在使用Microsoft SQL Server 2008,我有这个存储过程:

ALTER PROCEDURE [dbo].[getMessagesByDates]
      (@orderdateFirst varchar(50), 
       @orderdateLast varchar(50))      
AS
BEGIN
    SET NOCOUNT ON

    SELECT TOP 100 [RecordID]
      ,[MessageID]
      ,[ProcessName]
      ,[ProcessInstanceID]
      ,[Arrival]
      ,[MessageDateTime]
      ,[RecvFileName]
      ,[ArchivePath]
      ,[SubjectID]
      ,[SrcMessageID]
      ,[SourceSystem]
      ,[SourceLocation]
      ,[MsgKey1]
      ,[MsgKey2]
      ,[MsgKey3]
  FROM [Messages].[dbo].[MessagesLog]
  WHERE 
      [Arrival] BETWEEN CONVERT(datetime, @orderdateFirst) 
                    AND CONVERT(datetime, @orderdateLast)
  ORDER BY
      [Arrival] DESC
END

[Arrival](datetime type)是[MessagesLog]表中的聚簇唯一索引。 [RecordID](bigint类型)是我的聚集索引中的第二个索引键列。

如何改善上述程序的性能? 我正在处理数千行,这需要花费很多时间。

1 个答案:

答案 0 :(得分:2)

CONVERT声明之前,varchar datetime SELECT会有DECLARE @orderdateFirstDT DATETIME = CONVERT(DATETIME,@orderdateFirst) DECLARE @orderdateLastDT DATETIME = CONVERT(DATETIME,@orderdateLast) SELECT TOP 100 [RecordID] .......... FROM [Messages].[dbo].[MessagesLog] WHERE [Arrival] BETWEEN @orderdateFirstDT and @orderdateLastDT ORDER BY [Arrival] DESC 一次性能提升。

目前你正在为每条记录制作2个转换。如果您有数千行会导致性能下降。

尝试:

DATETIME

更好的方法是将存储过程参数更改为varchar类型,以便甚至不需要进行此转换。但这可能需要在此查询范围之外进行更改(例如,如果在调用此sproc时明确设置ALTER PROCEDURE [dbo].[getMessagesByDates] (@orderdateFirst DATETIME, @orderdateLast DATETIME) AS BEGIN 类型参数)。

{{1}}