这个问题主要出于好奇心,因为我有一个工作查询(只是比我想象中的要慢一点)。
我有一个有400万行的表格。这个表格上唯一的索引是一个自增的BigInt ID。查询正在查找其中一列的不同值,但仅限于最近1天。不幸的是,评估的ReportDate列不是DateTime类型甚至不是BigInt,而是格式为YYYYMMDD的char(8)。所以查询速度有点慢。
请注意,上述语句中的日期转换仅是将其转换为YYYYMMDD格式进行比较。
我在想是否有一种方法可以基于我知道我感兴趣的数据仅在表的“底部”来优化此查询。我正在考虑某种递归SELECT函数,该函数逐渐生成一个临时表,可用于最终查询。
例如,在伪SQL中:
我有一个有400万行的表格。这个表格上唯一的索引是一个自增的BigInt ID。查询正在查找其中一列的不同值,但仅限于最近1天。不幸的是,评估的ReportDate列不是DateTime类型甚至不是BigInt,而是格式为YYYYMMDD的char(8)。所以查询速度有点慢。
SELECT Category
FROM Reports
where ReportDate = CONVERT(VARCHAR(8), GETDATE(), 112)
GROUP BY Category
请注意,上述语句中的日期转换仅是将其转换为YYYYMMDD格式进行比较。
我在想是否有一种方法可以基于我知道我感兴趣的数据仅在表的“底部”来优化此查询。我正在考虑某种递归SELECT函数,该函数逐渐生成一个临时表,可用于最终查询。
例如,在伪SQL中:
N = 128
TemporaryTable = SELECT TOP {N} *
FROM Reports
ORDER BY ID DESC
/* Once we hit a date < Today, we can stop */
if(TemporaryTable does not contain ReportDate < Today)
N = N**2
Repeat Select
/* We now have a smallish table to do our query */
SELECT Category
FROM TemproaryTable
where ReportDate = CONVERT(VARCHAR(8), GETDATE(), 112)
GROUP BY Category
这有意义吗?这样的事情是否可能?
这是在MS SQL Server 2008上。