【发布时间】:2018-09-06 15:08:52
【问题描述】:
我正在从包含以下类型列的复合键更改 SQL Server 2014 数据库的主键:
VARCHAR(10), INT, DATETIME
到一个复合键包含
INT, DATETIME
其中第二个键中的INT 是一个新列,是VARCHAR(10)、INT 的先前组合的哈希。我还不能更改主键,所以在添加新列后,我创建了一个索引,将来会是新的主键 (INT, DATETIME):
CREATE UNIQUE NONCLUSTERED INDEX MyIndex
ON MyTable(MyIdCol, MyDateCol)
此时,我将阅读器切换为使用此索引而不是主键来获取数据。一切正常,但性能严重下降(时间增加了一倍多)。
此时,我尝试将 (INT, DATETIME) 设为新的主键。查询速度提高了 30-40%,但老实说,我认为在这个新主键上查询会比在其中包含 VARCHAR 的旧主键快得多(当然我可能在我的基准测试中搞砸了- 数据库模式非常复杂,需要 24 小时来设置测试用例)。
不幸的是,我刚刚在生产环境中删除了主键 - 我需要一个同时拥有旧主键和新唯一索引的阶段,因此我需要在查找该索引时获得类似的性能。我需要关于看什么的方向。老实说,我不完全理解为什么在 INT,DATETIME 上查询甚至只是作为索引而不是主键比 VARCHAR,INT,DATETIME 主键慢得多。
【问题讨论】:
-
您能否获取查询的实际执行计划并将其粘贴到此站点:brentozar.com/pastetheplan
-
有执行计划吗?选择代码?表 DDL?
-
@MJH 查询作为 XML 执行。以下是实际的执行计划:brentozar.com/pastetheplan/?id=BJzNLaRwm
-
@MJH 这是使用将成为新主键的索引进行查询时的执行计划。
-
@IvanStarostin brentozar.com/pastetheplan/?id=BJzNLaRwm(见上文)
标签: sql sql-server database tsql