sql-server - 需要有关正确 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 的情况下,用户在任何时候都不能对此表(或任何其他表)进行任何类型的查询。
解决方案
如果查询始终提供TenantId
第一个选项,则读取次数最少,因为 a 的所有记录Tenant
都将位于同一页面上(大部分情况下)*。
如果您需要频繁查询给定时间范围内的所有票证(而不是偶尔的临时查询),则索引TicketDate
可能会有所帮助,但这取决于几件事。
如果表上有另一个唯一键,您始终可以指定唯一聚集索引,(TenantId,TicketDate,<other key column<s>)
但它会产生基本相同的结果。
*随着时间的推移,聚集索引可能会出现碎片(这样做是为了不影响插入性能)。这通常不会对查询性能产生太大影响,但如果确实如此,您可以定期重建或重组聚集索引。
推荐阅读
- python - 为什么 gurobi 模型不可行?
- linux - 如何使用 ftrace 捕获所有生成的事件而不会造成任何损失
- reactjs - 自动化反应 stopPropagation 和 preventDefault
- oracle - 在 Oracle xmltype 中选择子节点
- r - 将 ElasticSearch 数据加载到 R 中
- html - 如何在多行文本“Something to break”上插入换行符?
- poc - 我的 MessagesBloc 类做错了什么,我应该如何创建它?
- sql - SQL print 使用计数内的条件逐行计数
- html - Bootstrap 4 修复表格的垂直溢出
- google-cloud-platform - gcloud 如何在未启用 Resource Manager API 的情况下列出项目?