带有日期列的建议 SQL Server 2005

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)。我曾想过执行以下操作,但由于时间不够,还没有尝试过:

  1. 使用仅包含日期部分的计算列
  2. 索引表示计算列(不确定这是否可能?)
  3. 使用索引视图(同样,不确定这是否可行,是否可行?)

最简单的方法是更新列并删除所有时间信息,但我不能这样做:(

有任何想法吗?

更新

感谢您到目前为止的所有答案。我认为问题的重点被忽略了,因为我对自己想要什么有点不清楚。我的错。我只是想优化查询的日期转换部分,因为我处理的数据量实际上很小(在一年长的日期范围内交叉应用后 < 500,000)。很抱歉对此造成混淆。

对于那些为我优化其余查询的人,我可以通过使用看到人们在说什么,< >但请考虑以下几点:

  1. 传入的参数是一个日期范围(例如,从1日到本月末)
  2. 表格中的开始日期可以出现在参数日期范围之前或期间(例如,只有结束日期在日期范围内)
  3. 表格中的结束日期可以出现在参数日期范围内或之后(例如,只有开始日期在日期范围内)
  4. 最后,表中的开始和结束日期在参数日期范围内。

就个人而言,鉴于上述情况,我永远无法找到< >工作的解决方案。我可以让它正常工作并且不会错过任何东西的唯一方法是使用 CTE 并说明 where d.[Date] BETWEEN t.StartDate AND t.EndDate

我希望这能解决问题。再次感谢。

gbn*_*gbn 5

您可以执行第 1 步和第 2 步:但是按照此使用 DATEADD/DATEDIFF 技术:如何在没有时间部分的情况下获取当前日期

您很可能无法为计算列建立索引,因为它对 varchar 方法没有确定性