在SQL Server中的guid类型列上使用非聚集索引

Chr*_*ian 15 t-sql sql-server indexing optimization foreign-keys

我想优化我的团队用于应用程序的数据库的性能.

我一直在寻找添加外键的区域,然后索引这些列以提高连接的性能.但是,我们的许多表都是在一个GUID类型的id上连接,在插入项目时生成,而与其他表中的该项目相关联的数据通常具有item_id包含GUID的列.

我已经读过,将聚簇索引添加到GUID类型列是一个非常糟糕的决定,因为索引需要不断重建才能生效.但是,我想知道,在上述场景中使用非聚集索引是否有任何不利影响?或者假设它有助于提高性能是否合理?如果需要,我可以提供更多信息.

Rem*_*anu 18

<anytype>到目前为止,a的索引是改进连接和单例查找的最佳选择.缺乏此索引,查询将始终必须以(通常)糟糕的性能结果端到端地扫描整个表,并且并发耗尽.

这是事实,uniqueidentifier使得选择不当为你提到的原因指标,但绝不这是否意味着你应该创建这些索引.如果可能,建议将数据类型更改为INT或BIGINT.使用NEWSEQUENTIALID()UuidCreateSequential生成它们将有助于碎片问题.如果所有备选方案都失败了,您可能需要比其他索引更频繁地执行索引维护(重建,重组)操作.但绝不是这些缺点中的任何一个都超过了首先获得索引的好处!

  • 是的,从索引结构和健康*的角度来看,非顺序uniqueidentifier上的NC索引更好地作为聚簇索引*.但是,如果uniquiedtifier ID列是大多数查找(搜索)发生一个,那么它应该是聚簇的,即使以结构不良(碎片)索引为代价,因为它具有NC索引并且必须查找其余的每行的列*可以*打败它的目的.见http://www.sqlskills.com/blogs/kimberly/category/the-tipping-point.aspx (2认同)

pap*_*zzo 5

两种表现:
-插入
-选择

索引应该改进 select

索引会减慢插入速度。
如果插入是有序的,则索引不会产生碎片。
如果插入不按顺序,索引将会碎片。
索引碎片会减慢插入和选择的速度。
通过维护可以对索引进行碎片整理。

将非聚集索引添加到引用 FK 的列将有助于连接。
由于该列很可能未排序,因此它是 GUID 的事实没有任何损失。

在 FK 表本身上,GUID 不适合 PK(聚集索引)。
使用 GUID 作为 PK,在插入时索引片段。
Int 或顺序 ID 是更好的候选者,因为它们不会在插入时使 PK 碎片化。
但没什么大不了的,只需对这些表进行碎片整理即可。