为什么INT不比UNIQUEIDENTIFIER更有效(根据执行计划)?

cjk*_*cjk 6 sql-server

我有一个父表和子表,其中将它们连接在一起的列是UNIQUEIDENTIFIER类型.

子表在列上有一个聚簇索引,它将它连接到父表(它的PK,它也是聚簇的).

我已经创建了这两个表的副本,但是将关系列更改为INT,重建了索引,使它们基本上是相同的结构,并且可以以相同的方式查询.

当我从父表中查询已知的20条记录时,从子表中提取所有相关记录,我得到两者相同的查询成本,即批次的50/50成本.

如果这是真的,那么我改变所有这些表的巨型项目似乎毫无意义,除了加速插入.任何人都能提供有关情况的任何信息吗?


编辑:

问题不在于哪个更有效,但为什么查询执行计划将两个查询显示为具有相同的成本?

Rem*_*anu 4

聚集索引中键的查找与 4 字节键、16 字节键或 160 字节键的查找基本相同。即使不涉及 IO,将槽与谓词进行比较的成本只是查询总体成本中的噪声(执行准备、准备执行上下文、打开行集、定位页面等)。

虽然没有人会争辩 GUID 和 INT 是平等的,但仅比较 20 次搜索并不能揭示差异。您可以立即测量的一件事是空间:聚集索引上每行每个非叶页节省 12 字节,再加上非聚集索引上每个叶页节省 12 字节,总计将超过数百万行和数十个表,索引。更少的空间意味着更少的 IO、更好的内存缓存性能、更好的整体性能,这是可以测量的,但您需要测量实际负载,而不是微不足道的 20 行查找。

在实验室条件下,您将能够测量寻求 INT 或 GUID 之间的原始速度差异,但这不应该是您的重点。INT 与 GUID 的争论并不是由搜索中 5% 的性能增益之类的东西驱动的,而是由空间节省和导致碎片的 GUID 随机性驱动的,这两者都非常容易测量指标,这些指标本身就为 INT 提供了坚实的理由理由,无需引入寻求性能的论点。