我正在使用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类型)是我的聚集索引中的第二个索引键列。
如何改善上述程序的性能? 我正在处理数千行,这需要花费很多时间。
答案 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}}