azure - 如何避免键查找

标签 azure azure-sql-database clustered-index non-clustered-index

我的数据库需要将 GUID 作为其主键,因为它与多个脱机数据库同步,因此 IDENTITY 列不是一个选项,因为它会导致同步冲突。

由于 GUID 会导致表碎片较多,因此我们选择向所有表 CREATEDDATETIME 添加另一列(时间戳),并将 CREATEDDATETIME 作为聚集索引,而 GUID 列已成为非聚集索引。

问题是 CREATEDDATETIME 几乎不会在 WHERE 子句中使用,因此执行计划中的几乎所有查询都会在聚集索引 CREATEDDATETIME 上显示 KEY LOOKUP 以获取其数据。我想知道是否可以通过以下两种方式之一来提高性能:

  1. 对于所有非聚集索引,例如 GUID 列上的索引,我也 包括 CREATEDDATETIME 列?或;

  2. 我将每个非聚集索引作为复合键 确保聚集索引是其中的一部分,即 GUID + CREATEDDATETIME

哪个可能更好?

最佳答案

当您最终需要的信息在叶级别不可用时,就会发生键查找,因此必须转到聚集索引来获取它。想象一下以下查询:

select a, b, c
from dbo.yourTable
where GUID = <some guid>;

如果索引中包含a、b和c列,则可以避免键查找。请注意,聚集键自动成为每个非聚集索引中的包含列(这是有道理的 - 否则它如何能够进行键查找?)。因此,根据实际选择的内容包含列,我认为您会看到关键查找从查询计划中消失。

关于azure - 如何避免键查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34468381/

相关文章:

sql - 在大型表上建立外键索引的最佳实践

Azure 管道 YAML : Unexpected value 'variables'

azure - 如何在警报监视时间段之外的 Azure Log Analytics 中获取相应 IIS 停止日志的 IIS 启动日志

azure - 使用 Terraform 更新 Azure KeyVault 的防火墙规则

azure - 在 Azure Function 中使用 CosmosDbTrigger 检测 Cosmos DB 中的更新和删除

Azure 自动化 Runbook 无缘无故停止

sql-server - `primary key`关键字与SQL Server中的聚集索引有何关系?

azure - 使用 Azure Functions SQL 扩展返回标识值

azure - 无法从 Azure 容器实例连接到 Azure SQL 数据库

View 上的sql server聚集索引