Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提高SQL Server存储过程的性能_Sql_Sql Server 2008 - Fatal编程技术网

提高SQL Server存储过程的性能

提高SQL Server存储过程的性能,sql,sql-server-2008,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] ,[Pr

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

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

一个性能改进是在
SELECT
语句之前将
varchar
转换为
datetime

目前,每个记录进行2次转换。如果有数千行将导致性能下降

尝试:


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


-您应该始终使用最合适的数据类型——毕竟,这就是它们的用途!因此,在您的情况下:将参数类型更改为
DATE
,并停止在日期列上使用
CONVERT
——这将大大加快速度。请发布执行计划。如果
Arrival
是聚集索引,我希望看到一个有效返回100行的索引查找。另外,请澄清什么是“很多时间”。可能查询遇到来自并发未提交事务的阻塞。更好的方法是:使用适当的数据类型(
DATE
DATETIME
)并一起跳过转换!
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
ALTER PROCEDURE [dbo].[getMessagesByDates]
      (@orderdateFirst DATETIME, 
       @orderdateLast DATETIME)      
AS
BEGIN