2

私はMicrosoftSQLServer 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

[到着](日時タイプ)は、[MessagesLog]テーブルのクラスター化された一意のインデックスです。[RecordID](bigintタイプ)は、クラスター化インデックスの2番目のインデックスキー列です。

上記の手順のパフォーマンスをどのように改善できますか?私は何千もの行に取り組んでおり、それは多くの時間がかかります。

4

1 に答える 1

2

パフォーマンスの改善の 1 つはCONVERT、ステートメントvarchardatetime前に行うことです。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この sproc を呼び出すときに型パラメーターを明示的に設定する場合)。

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