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这取决于很多因素,大量的经验和试验和错误,非常解释性的答案。另外,您可以考虑对该表进行分区。也可以帮助索引存储在不同的磁盘上。