首页 > 解决方案 > 需要有关正确 SQL Server 多列索引定义的建议

问题描述

我们的数据库 (SQL Server Azure) 是多租户的,其中每一行都有一个六字符的租户 ID。主事务表称为 LoadTicket,聚簇索引为:

CREATE CLUSTERED INDEX IDX_LoadTicket
  ON FWT.dbo.LoadTicket (TenantID, TicketDate DESC)
GO

但考虑到平均租户每天生产 120 张门票(有些生产超过 1000 张),更好的指数定义是:

CREATE CLUSTERED INDEX IDX_LoadTicket
  ON FWT.dbo.LoadTicket (TicketDate DESC, TenantID)
GO

请记住,按日期和租户查询最近的结果是我们整个系统中最常用的查询。在没有租户 ID 的情况下,用户在任何时候都不能对此表(或任何其他表)进行任何类型的查询。

标签: sql-server

解决方案


如果查询始终提供TenantId第一个选项,则读取次数最少,因为 a 的所有记录Tenant都将位于同一页面上(大部分情况下)*。

如果您需要频繁查询给定时间范围内的所有票证(而不是偶尔的临时查询),则索引TicketDate可能会有所帮助,但这取决于几件事。

如果表上有另一个唯一键,您始终可以指定唯一聚集索引,(TenantId,TicketDate,<other key column<s>)但它会产生基本相同的结果。

*随着时间的推移,聚集索引可能会出现碎片(这样做是为了不影响插入性能)。这通常不会对查询性能产生太大影响,但如果确实如此,您可以定期重建或重组聚集索引。


推荐阅读