Stu*_*ler 6 performance sql-server-2005 query
我在 SQL Server 2005 中有两个日期时间列,我需要在没有日期时间的时间部分的情况下进行查询。目前,我的查询看起来像这样(只是一个例子):
WITH Dates AS (
SELECT [Date] = @StartDate
UNION ALL SELECT [Date] = DATEADD(DAY, 1, [Date])
FROM Dates WHERE [Date] < @EndDate
)
SELECT DISTINCT ID
FROM table t
CROSS APPLY DATES d
WHERE d.[Date] BETWEEN CONVERT(DATETIME, CONVERT(VARCHAR, t.StartDate, 103)) AND CONVERT(DATETIME, CONVERT(VARCHAR, t.EndDate, 103))
Run Code Online (Sandbox Code Playgroud)
现在这会导致完整的聚集索引扫描(惊喜,惊喜)。我正在想办法让这个更快(实际查询需要 3 分钟:O)。我曾想过执行以下操作,但由于时间不够,还没有尝试过:
最简单的方法是更新列并删除所有时间信息,但我不能这样做:(
有任何想法吗?
更新
感谢您到目前为止的所有答案。我认为问题的重点被忽略了,因为我对自己想要什么有点不清楚。我的错。我只是想优化查询的日期转换部分,因为我处理的数据量实际上很小(在一年长的日期范围内交叉应用后 < 500,000)。很抱歉对此造成混淆。
对于那些为我优化其余查询的人,我可以通过使用看到人们在说什么,< >
但请考虑以下几点:
就个人而言,鉴于上述情况,我永远无法找到< >
工作的解决方案。我可以让它正常工作并且不会错过任何东西的唯一方法是使用 CTE 并说明 where d.[Date] BETWEEN t.StartDate AND t.EndDate
。
我希望这能解决问题。再次感谢。
您可以执行第 1 步和第 2 步:但是按照此使用 DATEADD/DATEDIFF 技术:如何在没有时间部分的情况下获取当前日期
您很可能无法为计算列建立索引,因为它对 varchar 方法没有确定性
归档时间: |
|
查看次数: |
1031 次 |
最近记录: |