繁体   English   中英

SQL Server 2012中表的索引

[英]Index for table in SQL Server 2012

我对索引有疑问。 我有一张这样的桌子:

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

该表有几百万行。 假设查询通常会按日期范围,销售类型,特定值上下的金额过滤结果,并且联接将发生在cust_id上...大家都认为理想的索引结构是什么?

我不确定聚集索引是最佳索引还是每列上的单个索引? 都?

SQL Server中任何严肃的表都应始终具有精心选择的,良好的群集键-它使许多事情变得更快,更高效。 从您的表结构中,我将使用ID作为聚类键。

接下来,您说联接发生在cust_id -因此我将在cust_id上放置一个索引。 通常,这可以加快加入速度,这是一个普遍接受的建议。

接下来,这实际上取决于您的查询。 他们在WHERE子句中都使用相同的列吗? 还是您获得使用dt查询以及分别使用sale_type查询?

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

  • 使用WHERE子句中的所有三列
  • WHERE子句中使用sale_typedt
  • WHERE子句中仅使用sale_type

不能用于仅使用dtamount查询。 复合索引始终要求您使用索引定义中的最左边n列 -否则将无法使用。

所以我的建议是:

  • ID上定义聚类键
  • cust_id为JOIN定义一个非聚集索引

  • 检查您的系统以查看您还有哪些其他查询-用于选择的标准是什么,这些查询多久执行一次? 请勿过度优化每月执行一次的查询,但要花时间在每小时执行数十次的查询上。

一次添加一个索引-让系统运行一点-您是否衡量查询时间的缩短? 感觉更快吗? 如果是这样:请保留该索引。 如果没有,请重新放置。 进行迭代,直到对整体系统性能满意为止。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM