Sql server 提高“事务最后一小时”(或“日期间隔”)查询的效率

Sql server 提高“事务最后一小时”(或“日期间隔”)查询的效率,sql-server,Sql Server,发现对这个非常大的表~1亿条记录的查询效率很低,通常为20-30秒,但可能更高,但不确定如何处理: SELECT @TRXCOUNT = count(1) FROM inbound.[Transaction] WITH (NOLOCK) WHERE CreatedTimeStamp BETWEEN DATEADD(HH, - 1, SYSDATETIME()) AND SYSDATETIME() 执行计划显示索引扫描非聚集成本为93%您可以尝试两件事: 计算DATEADDHH,-1,SYSDA

发现对这个非常大的表~1亿条记录的查询效率很低,通常为20-30秒,但可能更高,但不确定如何处理:

SELECT @TRXCOUNT = count(1)
FROM inbound.[Transaction] WITH (NOLOCK)
WHERE CreatedTimeStamp BETWEEN DATEADD(HH, - 1, SYSDATETIME()) AND SYSDATETIME()

执行计划显示索引扫描非聚集成本为93%

您可以尝试两件事:

计算DATEADDHH,-1,SYSDATETIME before的值,将其存储在变量中,并在查询中使用变量。我知道,这不重要,但你可以随时检查。 检查你在CreatedTimeStamp上的索引是否正常你有一个索引,对吗?。我需要你的帮助。
你可以尝试两件事:

计算DATEADDHH,-1,SYSDATETIME before的值,将其存储在变量中,并在查询中使用变量。我知道,这不重要,但你可以随时检查。 检查你在CreatedTimeStamp上的索引是否正常你有一个索引,对吗?。我需要你的帮助。
从您的评论听起来,您没有基于CreatedTimeStamp的索引。将其包含在另一个索引中并不能提高查询的效率-目前仍然需要进行表扫描


我建议您添加一个新索引,例如称为IX_Inbound_Transaction_CreatedTimeStamp。不需要对其进行聚类,因为查询只需要查看索引。

从您的评论中可以看出,您没有基于CreatedTimeStamp的索引。将其包含在另一个索引中并不能提高查询的效率-目前仍然需要进行表扫描


我建议您添加一个新索引,例如称为IX_Inbound_Transaction_CreatedTimeStamp。不需要对其进行聚类,因为索引是查询需要查看的全部内容。

大于可能比介于两者之间更快

SELECT @TRXCOUNT = count(1)
FROM inbound.[Transaction] WITH (NOLOCK)
WHERE CreatedTimeStamp > SYSDATETIME() - INTERVAL 30 MINUTE

语法可能不准确。mySQL与SQL之比大于或快于两者之间

SELECT @TRXCOUNT = count(1)
FROM inbound.[Transaction] WITH (NOLOCK)
WHERE CreatedTimeStamp > SYSDATETIME() - INTERVAL 30 MINUTE

语法可能不准确。mySQL vs SQL

CreatedTimeStamp列上有索引吗?我有三个索引;其中一个创建了作为“包含”列的DtimeStamp。在另一个例子中,它被列为SSMS索引属性的常规选项卡上的两个“索引键列”之一。CreatedTimeStamp列上有索引吗?我有三个索引;其中一个创建了作为“包含”列的DtimeStamp。在另一个例子中,它被列为SSMS索引属性的常规选项卡上的两个“索引键列”之一。我怀疑在你的情况下,它也不应该是重复的CreatedTimeStamp实体是最有可能的。谢谢-这是我想的,所以我没有点击按钮。需要很长时间,所以我们将看看结果如何。谢谢。使用索引在查询时间上没有差别,但是使用索引并用'GETDATE'替换SYSDATETIME,差别是巨大的——有人知道为什么吗?谢谢事实上,它不仅仅取代了SYSDATETIME,它还有更多的功能。如果函数使用一致,查询仍然很快。如果我和DATEADD中的GETDATE比较,它仍然很快。但是这很慢:DATEADDMINUTE,-5,SYSDATETIME和GETDATE我猜这与必须执行两次转换有关;由于精度的原因,也许一种方法比另一种方法容易得多。我觉得应该有一种方法为类似的东西创建一个过滤索引,它过滤只包括最新的数据,而不索引过去一个小时内没有创建的9900万条记录。但这似乎并不存在。看起来像是浪费。不,不是。我怀疑在你的情况下,它也不应该是重复的CreatedTimeStamp实体是最有可能的。谢谢-这是我想的,所以我没有点击按钮。需要很长时间,所以我们将看看结果如何。谢谢。使用索引在查询时间上没有差别,但是使用索引并用'GETDATE'替换SYSDATETIME,差别是巨大的——有人知道为什么吗?谢谢事实上,它不仅仅取代了SYSDATETIME,它还有更多的功能。如果函数使用一致,查询仍然很快。如果我和DATEADD中的GETDATE比较,它仍然很快。但是这很慢:DATEADDMINUTE,-5,SYSDATETIME和GETDATE我猜这与必须执行两次转换有关;由于精度的原因,也许一种方法比另一种方法容易得多。我觉得应该有一种方法为类似的东西创建一个过滤索引,它过滤只包括最新的数据,而不索引过去一个小时内没有创建的9900万条记录。但这似乎并不存在。看起来像是浪费。