SQL Server : Optimal performance clustered indexing and expected indexsize

标签 sql sql-server date indexing sql-server-2014

我正在为 SQL Server 2014 中的工作实现一个新协议(protocol)(从 2010 年开始),我需要为研究人员构建理想的数据库结构。

设置

  • 1700 万行/天 ~ 2 GB 原始数据 ~ 520 GB/年
  • 22 列
  • 预计对所有列都有超快的查询
  • 最常见的查询类似于以下内容

    select something, date, product 
    from mytable
    where product = '45' and date between '20100811' and '20140811' 
    

表格结构:

Date     | Product | Time          | something | something | something | something
----------------------------------------------------------------------------------    
20140811 | 45      | "14:55:46:13" |

我的表格在使用日期和时间时具有独特的组合。

问题

将日期放在单独的表中而不是放在一个巨大的表中会使查询受益吗?即在要求的日期执行连接操作。

在日期和时间上使用聚集索引是否正确?如果是这样,我应该如何使我的非集群化,以便达到最佳效果?

提前谢谢您!

最佳答案

Is it right to use clustered index on date and time?

这并不罕见,特别是如果您的绝大多数查询将按日期过滤并且您有大量临时查询。

也就是说,我通常只在主键上建立索引。当然,假设主键是标识或序列,而不是随机 GUID。

Most frequent query will be something along the lines of

对于该特定查询,您希望非聚集索引首先位于“产品”上,然后位于“日期”上。这将使您能够准确定位到正确的行(索引查找)。如果先执行“日期”,然后执行“产品”,则必须扫描日期范围内的所有记录(索引扫描)。索引的产品部分实际上不会产生影响,因为很少有记录具有相同的日期。

当有疑问时,将几十行数据写成一棵树。然后假装你是一台计算机并查找数据。如果您发现深入每个分支寻找可能的匹配项很乏味,那么您的数据库服务器也会如此。但是,如果您可以直接沿着树向下走到第一行,侧向走,拾取好的行,而不需要跳过坏的行,那么您就得到了一个好的索引。

Expected to have super-fast queries on all columns

这不会发生。聚集列存储可以为您提供对所有列的不错的查询(假设您没有做像 SELECT * 这样的愚蠢的事情),但是为了“超快”,您需要覆盖索引。并且您无法为每个可能的查询创建覆盖索引。

关于SQL Server : Optimal performance clustered indexing and expected indexsize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25247205/

相关文章:

javascript - 获取javascript日期对象中的天数

mysql - SQL唯一varchar区分大小写问题

mysql - 带外键的sql循环

php - 具有 2 个条件的同一张表上的 SQL JOIN

sql - 使用 count 函数合并多个查询

sql-server - 有人知道将一行转换为 INSERT 语句的过程吗?

php - SQL - 获取日期范围内的记录,包括。当日记录

arrays - 使用 matlab 将 yyyy-mm-dd hh :mm:ss. ms 转换为 yyyy-mm-dd hh:mm:ss

sql - 获取数字周围的上限值和下限值

php - 将日期添加到当前日期