我需要从我的表中返回数据(今天)。我正在使用这个查询来完成工作,但没有我想要的那么快。
当前查询
WHERE (CallDetail.DNIS='456456') AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)
我使用的另一个查询会在几秒钟内返回过去几周的数据。
WHERE (CallDetail.LocalName='Name') AND (CallDetail.ConnectedDate Between DATEADD(wk,-1,GetDate()) And GetDate())
我可以使用更有效的查询来返回今天的数据吗?
答案 0 :(得分:0)
而不是转换两次从GETDATE()返回日期部分,这会减慢查询
WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > CAST(FLOOR(CAST(GETDATE() AS FLOAT))AS DATETIME)
使用更快的方式只返回GETDATE()
中的日期部分WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
答案 1 :(得分:0)
如果要加快查询速度,请考虑索引。对于此查询,最有效的索引将在CallDetail(DNIS, ConnectedDateTimeGmt)
上。
您的第二个查询可能运行得更快,因为您有CallDetail(ConnectedDate)
或CallDetail(LocalName)
的索引。
仅仅在getdate()
而不是在字段名称上执行日期算术(这可能会妨碍索引的使用)。如果您使用的是更新版本的SQL Server,则转换的最可读方法是cast(getdate() as date)
。但是,加快查询速度的方法是明智地使用索引。
答案 2 :(得分:0)
你使用交叉连接来计算这个只有一次,不知道这会如何影响你的表现,但我过去曾经使用过它,而且似乎总是碰到指数。
SELECT *
FROM [MyData]
CROSS JOIN (DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) AS CURRDATE) XJOIN
WHERE (CallDetail.DNIS='456456')
AND CallDetail.ConnectedDateTimeGmt > XJOIN.CURRDATE