SQL 服务器快速维护

SQL Server express maintenance

我目前正在尝试使用 SQL Server 2012 Express 开发与 SCADA 应用程序相关的数据记录解决方案。 SCADA 应用程序配置为在 SQL 服务器上执行存储过程以将数据推送到数据库中。

恕我直言,数据流非常繁重(经过一些调整后,每天 1.4 - 1.9 m 行,平均长度为 43 字节)。存储数据的table在三列上有一个聚簇索引。现在我们的重点是尽可能紧凑地存储这些数据,并且不会产生太多碎片(SELECTS 目前不是主要关注点)。

目前DB占用~250MB(我已经为DB预分配了5120MB),并且只保存这个数据table另一个table可以忽略,事务日志。

我的问题是:

  1. 如何在此数据库上设置索引维护?作为 Express 版本,我无法使用 SQL 服务器代理。我将使用任务调度程序,但我应该使用重建还是重组?使用小于 100 的填充因子是否可取?我是否应该将任务调度程序配置为每隔一段时间调用一次,以便任务只会重新组织(碎片低于 30%)?在达到最大存储 space?

    之后,重建是一项越来越昂贵的操作(重建第 x 天索引,与每 2 天只重建一次相比,第 x+1 天重建花费的时间是否更少)
  2. 再次使用 SQL Server Express 版本将数据容量限制为 10 GB。我正在尝试尽可能多地挤压那个数量。我打算构建一个环形缓冲区 - 我可以设置数据库以便在我进入事件日志后更改数据库扩展等消息失败存储过程将使用更新最旧的值作为插入数据的方法(我担心即使是更新也需要一些新的 space,到那时我将不得不以某种方式积极缩小数据库)?

  3. 我也考虑过使用压缩的win分区来存储DB的文件,并使用免费的无限数据库如MySQL来存储,以及SQL服务器仅作为前端 - SCADA 应用程序必须配置 SQL 服务器。值得考虑吗?

  4. 为了优化插入,我使用了一个全局临时数据库,它最多可容纳 1k 行(按顺序计数)作为缓冲区的一种形式,然后将数据推送到主数据库中 table 并截断温度 table。那有效率吗?我是否应该考虑使用事务来提高效率——我已经尝试在存储过程中开始命名事务(如果它不存在并且序列达到 1k 时提交 tran)?将阈值增加到 10k 行是否会减少碎片?

如果您认为我不熟悉数据库,那么您是对的。 Atm 只有一个 scada 应用程序使用 SQL 服务器,但实际应用程序是冗余设置的,所以最后一切都将占用两倍的资源(并且 SCADA 应用程序的每个实例都将获得自己的存储空间)。另外我需要提一下,我不能只升级到高级版本的 SQL 服务器,但我可以自由使用任何免费软件。

大部分答案都跨越了 4 个数字,所以我只是将回复放在项目符号中以提供帮助:

  • 索引可能应该保留,但在您的情况下,它们可能会让人望而却步。除了table上的聚簇索引外,索引一般(非聚簇类型)都是为了查询数据。

  • 如果应用程序按照您描述的那样进行插入,我会设计一个两步过程。首先,一个没有非聚集索引的基本 table 来接受插入。其次,table 您将查询数据。然后,根据您的查询需要,使用计划任务调用存储过程以将交易数据从 table 1 传输到 table 2 可能每小时或每天(并从 table 1 转移到 table 2 - 这绝对应该在交易中完成)。

    • 否则,每次插入不仅要插入table的原始数据,还要插入索引的记录。

    • 由于插入的数量,可能应该避免高填充因子(可能设置为小于 50%)。高 (100%) 填充因子意味着非聚集索引不会在 table 的页面中留下任何 space 以实际插入记录。您插入的每条记录都意味着 table 的页面必须重新组织。具有高填充因子将在 table 的每一页中留下 space,因此可以将新记录插入索引而无需重新组织它们。

  • 为了优化您的插入,我将使用上面的两步过程将记录直接插入您的第一个 table。如果您可以让您的应用程序使用 SQL 批量复制,我也会探索它。

  • 要优化 space,您可以探索以下几点:

    • 您需要实时访问所有记录吗?或许您可以与企业合作制定一项数据保留政策,其中您将数据库中的每条记录保留 24 小时,然后按分钟或其他方式保留 1 周的摘要,每小时保留 2 周,每天保留 6 个月等。您可以通过每日备份来增强这一点,这样您就可以在需要时完整地恢复任何特定的一天。
  • 考虑将数据库级别从完全恢复更改为简单或批量日志记录。这可以通过您可能正在执行的批量插入来控制您的事务日志。

  • 您将不得不努力工作来管理您的事务日志。经常检查点和事务日志备份。