sql - 递归 SQL 查询加速非索引查询

标签 sql sql-server tsql sql-server-2008 recursion

这个问题很大程度上是出于好奇心,因为我确实有一个有效的查询(只是比我想要的时间要长一点)。

我有一个包含 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 函数,它逐渐增长一个可用于最终查询的临时表。

例如,在 psuedo-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 上。

最佳答案

我可能建议您不需要转换以 YYYYMMDD 格式存储为字符数据的Date;该格式本质上是可以单独排序的。我会将您的日期转换为该格式的输出。

此外,您编写转换的方式是转换每个单独行的当前日期时间,因此即使为整个查询存储该值也可以加快速度......但我认为只需将您要搜索的日期转换为该字符格式就会有所帮助。

当然,我还建议您创建需要创建的索引...但这不是您问的问题:P

关于sql - 递归 SQL 查询加速非索引查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916916/

相关文章:

C# 删除数据库失败

sql - @@SERVERNAME 与服务器属性 ('servername' )

mysql - Kohana - 插入记录忽略重复

php - 如何在不同的 MySQL 表中检索与主键关联的多个条目

sql-server - 两个日期之间的sql,可以为空

tsql - 如何进行复杂的 T-SQL 更新查询?

sql-server - TSQL 父 > 子 > 子子复制(无游标)

sql - T-SQL 获取最后一个日期时间记录

mysql - 为什么我的 SQL 语句会抛出语法错误?

mysql - 如何选择表中其他表中没有的行