由于群集索引??????
,更新SQL查询是否正常答案 0 :(得分:6)
你最好说'慢'而不是'慢'。当数据被写入聚簇索引,并且它没有进入表的最末端时,需要对数据进行处理以使其适应,就像将CD添加到大量字母表中一样CD比把它放在顶部要快得多。
答案 1 :(得分:2)
如果您根本没有任何聚簇索引,那么您所拥有的就是“堆”。您也有一堆麻烦,因为表中数据的顺序是随机的 - 从表中选择数据将慢。如果你比INSERT
做更多SELECT
s,那可能没问题,但通常情况并非如此。
聚集索引是否使INSERT
更慢或取决于:
表格的填充因子(即数据中是否有足够的空白以允许插入新数据而不会移动所有内容)。
选择哪些列作为群集密钥。
如果您使用标识列作为群集密钥,那么您可能会发现插入性能非常好,因为总是会在末尾添加新条目。如果使用当前日期(当然也会不断增加),同样可能适用于日期时间列。
您需要保持群集密钥的大小,因为这是存储在每个其他索引中的数据的索引。例如,如果您的群集密钥由3个整数和一个日期时间组成,那么除了您尝试索引的任何数据之外,所有其他索引中的每个条目都将包含所有数据。出于这个原因,一个标识列实际上是一个非常好的集群密钥选择,因为它很好&小。
任何情况下的完美集群密钥只能通过大量的思考和大量的测试(具有真实的大型数据集)来选择。拥有一个好的群集密钥可以对SELECT
性能产生巨大的差异 - 这通常会超过INSERT
性能的任何降级。
答案 2 :(得分:1)
由于聚簇索引(特别是在巨大的表上),插入和更新较慢 - 但选择速度更快。
使索引非群集通常可以提高插入和更新性能,从而保持选择性能(与聚簇索引相比,选择通常更少性能使用非聚集索引但是有些东西必须给予。)
答案 3 :(得分:1)
定义慢,当然聚集索引总是比非聚集索引慢......
答案 4 :(得分:1)
聚簇索引指示表如何物理存储在磁盘上,因此更新具有聚簇索引的表可能要求移动表的重要部分以为新记录腾出空间,那很慢。
您可以通过为索引设置适当的fillfactor来缓解此问题。当你向中间添加一条记录时,你不得不重新摇晃整个桌子,这并不是那么糟糕;它通常只有几页。 Fillfactor确定在创建新页面之前填充每个页面的大小,以及作为新插入的摆动空间留下多少。索引上的较低fillfactor将为新记录留出更多空间,因此平均提供更快的插入时间,代价是更多磁盘空间和更多页面,因此读取速度更慢。但如果你做的更新比阅读更多,那么它可能是值得的。