我目前正在尝试使用SQL Server 2012 Express开发与SCADA应用程序相关的数据记录解决方案。 SCADA应用程序配置为在SQL Server上执行存储过程以推送数据库中的数据。
数据流imho非常繁重(每天1.4 - 1.9 m行,经过一些调整后平均长度为43个字节)。存储数据的表在三列上有一个聚簇索引。目前我们的重点是尽可能紧凑地存储这些数据,而不会产生太多碎片(SELECTS现在不是主要的兴趣)。
目前,数据库占用约250 MB(我已为数据库预先分配了5120 MB),并且只保留了此数据表中另一个可以忽略的表和事务日志。
我的问题是:
如何在此DB上设置索引维护?作为Express版本,我无法使用SQL Server代理。我将使用任务计划程序,但是我应该使用重建还是重新组织?建议使用低于100的填充系数吗?我是否应该将任务调度程序配置为每隔一段时间调用一次,以便任务只会重新组织(碎片低于30%)?正在重建越来越昂贵的操作(第x天索引被重建,第一天x + 1将花费更少的时间进行重建,而不是仅在2天内重建一次),在达到最大存储空间后?
再次使用SQL Server Express版本将数据容量限制为10 GB。我试图在这个数量上尽可能多地挤压。我计划构建一个环形缓冲区 - 我可以设置数据库,以便在我进入事件日志后,alter database expand等消息失败,存储过程将使用最旧值的更新作为插入方式数据(我担心即使更新也会占用一些新空间,此时我不得不以某种方式积极缩小数据库)?
我还考虑使用压缩的win分区来存储数据库的文件,并使用免费的无限制数据库(如MySQL)进行存储,而SQL Server仅作为前端 - 必须配置SCADA应用程序与SQL Server。这值得考虑吗?
为了优化插入,我使用一个全局临时数据库来保存最多1k行(用序列计数)作为缓冲区的形式,然后将数据推入主表并截断临时表。这有效吗?我是否应该考虑事务处理效率 - 如果它不存在,我试图在存储过程中开始命名事务,如果序列达到1k,则提交tran?将阈值增加到10k行会导致碎片减少吗?
如果您认为我不熟悉数据库,那么您是对的。 Atm只有一个使用SQL Server的scada应用程序,但实际的应用程序是冗余设置的,所以最后一切都需要两倍的资源(并且SCADA应用程序的每个实例都将获得自己的存储)。另外我需要提一下,我不能只升级到SQL Server的高级版本,但我可以自由使用任何一款免费软件。
答案 0 :(得分:0)
大多数答案都跨越4个数字,所以我只是将响应放在子弹中以帮助:
应该保留索引,但在您的情况下,它们可能会令人望而却步。除了表上的聚簇索引外,索引通常(非聚簇类型)用于查询数据。
如果应用程序按照您的描述进行尽可能多的插入,我将设计一个两步过程。首先,没有非聚簇索引的基本表接受插入。其次,您要查询数据的表。然后,根据您的查询需要,使用计划任务调用存储过程来将表1中的事务数据传输到表2(也可以每小时或每天)(并且在传输到表2后也从表1中删除原始数据 - 这应该是在交易中完成。)
否则,每个插入不仅必须插入表的原始数据,还要插入索引的记录。
由于插入物的数量,应该避免高填充因子(可能设置为小于50%)。高(100%)填充因子意味着非聚簇索引不会在表的页面中留下任何实际插入记录的空间。您插入的每条记录都意味着必须重新组织表格的页面。具有高填充因子将在表的每个页面中留出空间,因此可以在索引中插入新记录而无需重新组织它们。
为了优化插入,我将使用上面的两步过程将记录直接插入到第一个表中。如果您可以让您的应用程序使用SQL批量复制,我也会探索它。
为了优化空间,您可以探索以下几点:
考虑将数据库级别从完全恢复更改为简单或批量记录。这可以使用您可能正在执行的批量插入来控制事务日志。
您必须努力管理事务日志。采用频繁的检查点和事务日志备份。