SQL Server 2012中表的索引

SQL Server 2012中表的索引,sql,sql-server,indexing,Sql,Sql Server,Indexing,我有一个关于索引的问题。我有一张这样的桌子: id BIGINT PRIMARY KEY NOT NULL, cust_id VARCHAR(8) NOT NULL, dt DATE NOT NULL, sale_type VARCHAR(10) NOT NULL, sale_type_sub VARCHAR(40), amount DOUBLE PRECISION NOT NULL 这个表有几百万行。假设查询通常会按日期范围、销售类型、高于或低于特定值的金额过滤结果,并且连接将发生在客户id

我有一个关于索引的问题。我有一张这样的桌子:

id BIGINT PRIMARY KEY NOT NULL,
cust_id VARCHAR(8) NOT NULL,
dt DATE NOT NULL,
sale_type VARCHAR(10) NOT NULL,
sale_type_sub VARCHAR(40),
amount DOUBLE PRECISION NOT NULL
这个表有几百万行。假设查询通常会按日期范围、销售类型、高于或低于特定值的金额过滤结果,并且连接将发生在客户id上。。。你们都认为什么是理想的指数结构


我不确定聚集索引是最好的,还是每列上都有单独的索引?两者都有?

为表查找索引的最佳方法是sql server profiler。

sql server中任何重要的表都应该始终具有一个精心选择的、良好的群集键—它使许多事情更快、更高效。从表结构中,我将使用
ID
作为集群键

接下来,您说连接发生在
cust\u id
——因此我将在
cust\u id
上放置一个索引。这通常会加快连接速度,是一个普遍接受的建议

其次,这实际上取决于您的查询。它们是否都在
WHERE
子句中使用相同的列?或者您是否会得到使用
dt
的查询,以及其他分别使用
sale\u type
的查询

关键是:索引越少越好——因此,如果可能的话,我会尝试找到一个能够满足您所有需求的复合索引。但是,如果您在三列上有一个索引(例如,在
(sale\u type,dt,amount)
,则该索引可用于查询

  • 使用
    WHERE
    子句中的所有三列
  • WHERE
    子句中使用
    sale\u type
    dt
  • 仅在
    WHERE
    子句中使用
    sale\u type
但是它可以用于单独使用
dt
amount
的查询。复合索引总是要求您使用索引定义中最左边的n列,否则无法使用

因此,我的建议是:

  • ID
  • cust\u id
    上为联接定义非聚集索引

  • 检查您的系统,看看您还有哪些其他查询—选择时使用了哪些条件,这些查询执行的频率有多高?不要过度优化一个月执行一次的查询—但一定要花时间在每小时执行几十次的查询上


一次添加一个索引-让系统运行一段时间-您是否衡量了查询时间的改进?是否感觉更快?如果是,请保留该索引。如果不是,请再次删除该索引。反复迭代,直到您对整个系统性能满意为止。

这实际上听起来是一种为表查找索引的绝对糟糕的方法。旁注:我想建议不要对货币值使用
DOUBLE
,因为这样不安全,容易出现舍入错误。使用
DECIMAL(p,s)
相反。我同意,对不起,这只是我拥有的字段的一个快速演示。这是非常了不起的,非常感谢。我在各种文档中阅读过类似的建议,但这与我的真实示例有关,完全有道理。谢谢!@JeffreyKramer:不客气。SQL Server中的索引不是一个精确的sci这取决于很多因素,大量的经验和试验和错误,非常解释性的答案。另外,您可以考虑对该表进行分区。也可以帮助索引存储在不同的磁盘上。