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生成它们将有助于碎片问题.如果所有备选方案都失败了,您可能需要比其他索引更频繁地执行索引维护(重建,重组)操作.但绝不是这些缺点中的任何一个都超过了首先获得索引的好处!
两种表现:
-插入
-选择
索引应该改进 select
索引会减慢插入速度。
如果插入是有序的,则索引不会产生碎片。
如果插入不按顺序,索引将会碎片。
索引碎片会减慢插入和选择的速度。
通过维护可以对索引进行碎片整理。
将非聚集索引添加到引用 FK 的列将有助于连接。
由于该列很可能未排序,因此它是 GUID 的事实没有任何损失。
在 FK 表本身上,GUID 不适合 PK(聚集索引)。
使用 GUID 作为 PK,在插入时索引片段。
Int 或顺序 ID 是更好的候选者,因为它们不会在插入时使 PK 碎片化。
但没什么大不了的,只需对这些表进行碎片整理即可。