Joe Phillips Asked: 2012-01-24 14:58:59 +0800 CST2012-01-24 14:58:59 +0800 CST 2012-01-24 14:58:59 +0800 CST 我可以在不影响性能的情况下将“包含的列”添加到索引吗? 772 我有一个包含 6300 万叶级行的非聚集索引。目前它没有任何包含的列。我想在网站在线时添加一个包含的列。如果我通过 SSMS GUI 执行此操作,这会显着影响性能吗? index sql-server-2008-r2 2 个回答 Voted Best Answer Remus Rusanu 2012-01-24T16:23:29+08:002012-01-24T16:23:29+08:00 你为什么要通过 SSMS GUI 做任何事情??? 尝试通过脚本以专业人士的身份进行操作。您最好的选择是使用 drop existing 在线创建索引,在此过程中更改定义以匹配新的所需架构: create index ... on ... include ... with (online = on, drop_existing = on); 显然,这会受到 ONLINE 操作的通常限制,并且会导致由 ONLINE 索引创建/重建操作引起的正常开销。但好消息是该操作将在线,不会阻止现有查询,并且在构建新索引时旧索引将可用于查询。最后会有一个查询耗尽阶段,当所有查询在交换索引时都会阻塞,但这应该是一个非常快的操作(只要没有长时间运行的用户事务阻塞交换本身)。 JNK 2012-01-24T16:26:48+08:002012-01-24T16:26:48+08:00 是通过 GUI 还是通过脚本来完成并不重要。我相信它将考虑索引上已有的选项,除非您指定ONLINE关闭或打开。 但是,不管你怎么做,它肯定会影响性能。主要是通过 IO 和文件增长,但它会在旧索引的基础上构建一个新版本的索引,然后在完成后删除旧索引。这将占用其他操作的资源。ONLINE = ON如果但会影响服务器上的其他内容,它不会阻止对当前索引的访问。 另请注意ONLINE,仅适用于 SQL Server 的 Developer 或 Enterprise 版本。 更新:数据中心版也提供 ONLINE
你为什么要通过 SSMS GUI 做任何事情???
尝试通过脚本以专业人士的身份进行操作。您最好的选择是使用 drop existing 在线创建索引,在此过程中更改定义以匹配新的所需架构:
显然,这会受到 ONLINE 操作的通常限制,并且会导致由 ONLINE 索引创建/重建操作引起的正常开销。但好消息是该操作将在线,不会阻止现有查询,并且在构建新索引时旧索引将可用于查询。最后会有一个查询耗尽阶段,当所有查询在交换索引时都会阻塞,但这应该是一个非常快的操作(只要没有长时间运行的用户事务阻塞交换本身)。
是通过 GUI 还是通过脚本来完成并不重要。我相信它将考虑索引上已有的选项,除非您指定
ONLINE
关闭或打开。但是,不管你怎么做,它肯定会影响性能。主要是通过 IO 和文件增长,但它会在旧索引的基础上构建一个新版本的索引,然后在完成后删除旧索引。这将占用其他操作的资源。
ONLINE = ON
如果但会影响服务器上的其他内容,它不会阻止对当前索引的访问。另请注意
ONLINE
,仅适用于 SQL Server 的 Developer 或 Enterprise 版本。更新:数据中心版也提供 ONLINE