提高SQL Server存储过程的性能
我使用的是Microsoft SQL Server 2008,我有以下存储过程:提高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
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