0

我编写了一个 .Net 应用程序,它有一个 SQL Server 2008 R2 数据库,表数量相对较少,但在某些表中可能有大约 100,000,000 条记录!为了提高 SELECT 的性能,我创建了必要的索引并且效果很好。但是,众所周知,索引在碎片化时需要重建。

我们在其中一台客户 PC 和我的 Winforms 应用程序上安装了 SQL Server 2008 R2 Express。另外三台 PC 通过常规 LAN 连接到该数据库,一切似乎都很好。

现在,问题是,我想重建索引,例如每次用户开始在任何机器上使用我的程序时。好吧,我可以执行几个 ALTER INDEX,但正如 MS 文档中所述,离线索引会在索引期间锁定表。这意味着当用户启动程序时,其他用户将失去对表的访问权限!我知道有一个 ONLINE 选项,但它在 SQL Server 的 Express 版本中不起作用。

在其他始终运行真实服务器的环境中,我会创建一个代理作业,它会在夜间重建索引。

我怎么解决这个问题?

4

1 回答 1

1

如果没有正常的 24/7 服务器运行,很难在不打扰用户的情况下自动进行此类维护。我不认为将这项工作放在应用程序启动时是一个好主意,因为它可以在没有真正原因的情况下真正一起启动很多次,并且如果表很大,还会显着减慢启动速度,除了让其他人像你一样说。

我会选择2个选择:

  • 在“服务器”上设置一个作业以在 SQL Server 启动或计算机启动时进行重建。当用户第一次打开电脑时,它会减慢电脑的初始化速度,但一旦完成,它应该可以正常工作,并且很可能会产生与夜间工作类似的结果。
  • 在应用程序中添加一个选项,以便在用户想要执行重新索引作业时手动启动它,并警告这将需要一些时间,并且在此过程中其他任何人都无法使用它。虽然这提供了最大的灵活性,但它依赖于用户在开始注意到延迟时这样做。
于 2013-07-13T07:45:14.433 回答