【发布时间】:2015-04-23 08:42:11
【问题描述】:
我有一个带有 GUID PK 的数据库,我了解添加 INT IDENTITY 列(例如 ClusterID)然后在其上创建聚集索引可以带来性能优势。
对于连接,使用ClusterID 列作为外键会带来性能优势。尤其是在父/子情况下,子表可以在父ClusterID 上具有聚集索引。
但是在合并复制方案中这是不可能的,因为 ClusterID 列不一定是唯一的。
所以我想知道在这种情况下如何最好地获得性能优势。
例如:
表A
- ID guid(主键)
- ClusterID int 标识(聚集索引)`
表B
- ID guid(主键)
- TableAID guid(TableA 的外键)
- TableAclusterID int(聚集索引)`
我想我会使用触发器来使 TableAClusterID 保持最新状态。
然后一个查询如
select *
from TableB B
where B.TableAClusterID = @TableAClusterId
将受益于提高的性能。
这是怎么做到的?
【问题讨论】:
-
您所说的性能优势是什么?插入性能?碎片化?
-
为什么 ClusterID 在合并复制方案中不是唯一的?如果您使用自动身份范围管理,则可以保证 ID 是唯一的。
-
@Ben - 尽管sqlskills.com/blogs/kimberly/… 接近,但我找不到一篇总结它的文章,但从我所读到的内容来看,所有性能通常会通过聚集索引提高,即使列是'未使用数据。
-
@marc_s 可能更适合回答这个问题,因为他回答了很多关于此的问题。
-
如果您不确定您所期望的确切好处,您如何知道您是否得到了它?我的建议是不要仅仅因为您在某处听到这是个好主意就这样做......对于插入性能,您真的只需要索引按插入顺序排列。身份可以做到这一点,但时间戳也是如此。同样,除非你确定你知道你期望获得什么,否则不要这样做。相反,请查看执行慢的查询的查询计划,并从中设计索引。
标签: sql-server