代码之家  ›  专栏  ›  技术社区  ›  Raj

更改SQL Server 2000中现有表的索引

  •  1
  • Raj  · 技术社区  · 16 年前

    以下是场景:

    SQL Server 2000(8.0.2055)

    表目前有4.78亿行数据。主键列是具有标识的int。对具有非聚集索引的其他两列施加了唯一约束。这是一个供应商应用程序,我们只负责维护数据库。

    现在,供应商建议执行以下操作“以提高性能”

    1. 删除pk和聚集索引
    2. 删除具有唯一约束的两列上的非聚集索引
    3. 使用非聚集索引重新创建pk
    4. 在具有唯一约束的两列上创建聚集索引

    我不相信这是正确的做法。我有许多顾虑。

    通过删除pk和索引,您将创建一个包含4.78亿行数据的堆。然后在两列上创建聚集索引将是一项非常艰巨的任务。创建另一个具有相同结构和新索引方案的表,然后复制数据,删除旧表并重命名新表是一种更好的方法吗?

    我也不确定存储的进程将如何反应。他们是否会继续使用缓存的执行计划,因为没有显式地重新编译它们。

    我只是无法理解这种变化会带来什么样的“性能改进”。我认为这实际上会产生相反的效果。

    欢迎有任何想法。

    事先谢谢,

    拉吉

    3 回复  |  直到 16 年前
        1
  •  2
  •   gbn    16 年前

    所有存储的进程将自动重新编译。不管怎样,当状态发生变化,并且在索引维护之后,都会发生这种情况。

    在某些时候,您必须重新组织4.78亿行(删除/创建索引)或移动(新表)。不幸的是,两种方法都不如另一种好。不过,我感到您的痛苦:我们有同样大的表,其中有挂起的新列和索引更改。

    这就是说,在删除/创建聚集索引时,应该执行步骤2-1-4-3,以避免不必要的非聚集索引维护。

    并删除唯一约束。聚集索引可以是唯一的和聚集的。唯一的常量只是另一个不必要的索引。

    至于性能优势,也许可以问供应商为什么。

        2
  •  2
  •   marc_s MisterSmith    16 年前

    我要认真研究的一件事是,与int标识(4字节)相比,其他两列的类型是什么?它们有多大??

    我问的原因是: 群集键 也将添加到表中的所有非聚集索引中-如果有近5亿行,它将使 巨大的差异 集群键是单个4字节int,还是两个16字节guid。

    注意,这不仅存在于磁盘上—页面全部加载到SQL Server的RAM中—因此,通过潜在地增加集群密钥,由于非集群索引需要的磁盘(和RAM)上的页面数量更多,您将受到性能惩罚。

    我能看到实际进行这些更改的唯一令人信服的原因是,如果通过使用这两个其他列对表进行集群,您可以从查询性能方面获得一些好处,例如,如果由于表现在是cl,一些最频繁的查询速度会更快。被这两列所包围。这真的很难知道,除非你知道访问和查询模式是什么……

        3
  •  0
  •   Jeremy    16 年前

    创建另一个具有相同结构和新索引方案的表,然后复制数据,删除旧表并重命名新表是一种更好的方法吗?

    我相信这就是SQL企业管理器在幕后所做的,不管怎样,如果您使用可视化工具来实现这一点的话。如果您更改了模式,例如在表中间添加一列,或者更改了主键,那么会有一个小按钮允许您“编写更改脚本”。如果查看此脚本,则可以看到Enterprise Manager将采取哪些步骤来执行您请求的操作。