代码之家  ›  专栏  ›  技术社区  ›  J.C.

SQL Server-PK delete性能差

  •  4
  • J.C.  · 技术社区  · 16 年前

    我在sqlserver2008r2中有一个表,包含大约400行(几乎没有任何内容)-它在主键(即标识)上有一个聚集索引。大约13个其他表通过引用完整性(没有级联删除或更新)引用该表。

    DELETE FROM [TABLE] WHERE [TABLE].[PK_WITH_CLUSTERED_INDEX] = 1
    

    该指数严重分散-90%。我重建并重新组织了该索引(以及该表上的其他索引),但我不能将其低于50%。

    我没有做的一件事是完全删除聚集索引并重新添加它。这本身就是一个问题,因为当其他表引用PK索引时,SQL Server不允许您删除它。

    有什么想法吗?

    更新

    我应该把这个写进我原来的帖子里。执行计划将“罪魁祸首”归咎于聚集索引删除-70%。在引用该表的13个表中,执行计划说没有一个表超过了整个查询的3%——几乎所有的表都是索引查找。

    4 回复  |  直到 16 年前
        1
  •  4
  •   Adrian Smith    16 年前

    如果删除行,则数据库必须检查13个表中没有一个引用该行。那些引用要从中删除的表的其他表的外键列上是否有足够的索引?

        2
  •  1
  •   J.C.    16 年前

    首先,我几乎用尽了上面问题中的所有选项以及相关的答案。我在一个看似微不足道的问题上运气不佳。

    我决定做的是:

    1. 添加临时唯一索引(so SQL 服务器将允许我删除
    2. 删除聚集索引。
    3. 重新添加聚集索引。

    实际上,我删除并重新添加了聚集索引。我唯一能从中得到的东西是索引的一部分或者它的物理存储位置被“损坏”(我使用这个词很松散)。

        3
  •  0
  •   Codism    16 年前

    可能是生产过程中另一个耗时的过程锁定了表。

        4
  •  0
  •   HLGEM    16 年前

    另一个想法是,表上有删除触发器吗?可能是它引起了这个问题吗?