sql - 添加带有月份标识符的列可以提高查询性能吗?

标签 sql sql-server

情况如下。有一个表,每月约有 40 000 000 行乘以 24 个月,所以可以说几乎有 1 000 000 000 行。每行都有一个时间戳列,其中在该列上创建了索引。 最频繁的查询是一次聚合特定月份的数据——例如 2016 年 1 月。如果我们为每个月分配一个单独的标识符,我们称之为“idm”,对于 2016 年 1 月,使其等于 1(2016 年 2 月 = 2 等等on), create index on idm, would have any effect on query performance comparing WHERE statements:

  1. 时间戳 >= '20160101' AND 时间戳 < '20160201'
  2. idm = 1 ? 使用 idm 会更快吗?

最佳答案

如果您在 timestamp 和提议的 idm 列上有一个索引,那么两者可能是相同的。这是一个大概的答案。如果 where 子句中有其他条件,则 idm = 1 性能更好。它允许使用更多优化方法。

但是,索引并不是正确的方法。由于数据和查询的性质,您应该考虑表分区。这将允许单独存储每个月的数据。您可以阅读有关表分区的信息 here .

如果您不想对表进行分区,我建议将 idmtimestamp 设为聚簇索引。这将有助于查询,即使是 where 子句选择了表中相对较高比例的行。

关于sql - 添加带有月份标识符的列可以提高查询性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142642/

相关文章:

SQL SERVER 2008 的 SQL 查询

sql-server - 通过合并语句记录操作的最佳方法,可能具有识别 TSQL 错误的能力

mysql - 为什么我不断收到此错误 : ERROR 1064 (42000)?

php - mysql:合并两个彼此无关的表?

单独列中的 SQL 联合

php - ms sql row_number() 函数 - 不允许我在同一语句中使用

sql - 如何在 SQL Server 中比较两列是否相等?

mysql - 如何在 MySQL JOIN 中每行返回多个相关项?

sql - 如何将一个表的每条记录中的数据复制到与第一个表相关的另一个表的多个记录中?

sql - 使用 SQL Server 2008 将主键约束删除或更改为 UNIQUE 约束