2

我正在使用 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](日期时间类型)是 [MessagesLog] 表中的聚集唯一索引。[RecordID](bigint 类型)是我的聚集索引中的第二个索引键列。

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

4

1 回答 1

2

一项性能改进将是CONVERTvarchar在声明datetime之前SELECT

目前,您正在为每条记录进行 2 次转换。如果您有数千行会导致性能下降。

尝试:

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

更好的办法是将存储过程参数更改为DATETIME类型,这样甚至不需要这种转换。但这可能需要在此查询范围之外进行更改(例如,如果您varchar在调用此存储过程时显式设置类型参数)。

ALTER PROCEDURE [dbo].[getMessagesByDates]
      (@orderdateFirst DATETIME, 
       @orderdateLast DATETIME)      
AS
BEGIN
于 2013-02-21T09:35:35.883 回答