Sql server SQL Server express维护

Sql server SQL Server express维护,sql-server,database,sql-server-express,Sql Server,Database,Sql Server Express,我目前正在尝试使用SQL Server 2012 Express开发与SCADA应用程序相关的数据记录解决方案。SCADA应用程序配置为在SQL Server上执行存储过程,以将数据推送到数据库中 数据流imho相当繁重(经过一些调整后,每天1.4-1.9m行,平均长度为43字节)。存储数据的表在三列上有一个聚集索引。目前,我们的重点是尽可能紧凑地存储这些数据,而不产生太多的碎片(选择现在不太重要) 目前数据库占用了大约250 MB(我已经为数据库预先分配了5120 MB),并且只保存这个数据表

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

数据流imho相当繁重(经过一些调整后,每天1.4-1.9m行,平均长度为43字节)。存储数据的表在三列上有一个聚集索引。目前,我们的重点是尽可能紧凑地存储这些数据,而不产生太多的碎片(选择现在不太重要)

目前数据库占用了大约250 MB(我已经为数据库预先分配了5120 MB),并且只保存这个数据表、另一个可以忽略的表以及事务日志

我的问题是:

  • 如何在此数据库上设置索引维护?作为Express edition,我不能使用SQL Server代理。我将使用任务计划程序,但我应该使用重建还是重新组织?是否建议使用小于100的填充系数?我是否应该将任务调度器配置为每隔一段时间调用一次,以便任务只重新组织(碎片小于30%)?在达到最大存储空间后,重建是否是一项成本越来越高的操作(重建第x天索引,第x+1天重建所需的时间是否比每两天重建一次要少)

  • 同样,SQL Server Express edition将数据容量限制为10 GB。我正在尽我所能挤出那么多。我正计划构建一个环形缓冲区-我可以设置DB,以便在我进入事件日志后,收到alter database expand等失败的消息。存储过程将使用更新最旧的值作为插入数据的手段吗(我担心的是,即使是更新也会占用一些新的空间,在这一点上,我将不得不以某种方式积极收缩数据库)

  • 我还考虑过使用压缩的win分区来存储数据库的文件,并使用免费的无限制数据库(如MySQL)进行存储,SQL Server仅作为前端-SCADA应用程序必须配置SQL Server。这值得考虑吗

  • 为了优化插入,我使用了一个全局临时数据库,它最多可以容纳1k行(按顺序计数)作为一种缓冲区,然后将数据推到主表中,并截断临时表。这样做是否有效?如果我考虑事务以提高效率,我尝试在存储过程中启动一个命名事务,如果它不存在,如果序列达到1K,则TRAN将阈值提高到10K行LEA。减少碎片


  • 如果你认为我不熟悉数据库,那么你是对的。Atm只有一个scada应用程序使用SQL Server,但实际的应用程序是冗余设置的,因此最终一切都将占用两倍的资源(scada应用程序的每个实例都将有自己的存储)。我还需要指出的是,我不能只升级到SQL Server的高级版本,但我可以自由使用任何一款免费软件。

    大多数答案都跨越了4个数字,因此我只需在项目符号中添加回复以帮助:

    • 可能应该维护索引,但在您的情况下,它们可能是禁止的。除了表上的聚集索引外,索引通常(非聚集类型)用于查询数据

      • 由于没有代理可以使用,要让计划任务执行此工作,请使用sqlcmd实用程序()。可能必须安装命令行工具,但您可以编写一个批处理脚本来运行SQL命令
    • 如果一个应用程序能像你描述的那样进行大量的插入,我将设计一个两步流程。首先,一个没有非聚集索引的基本表来接受插入。其次,一个你将要查询数据的表。然后,使用一个计划任务调用一个存储的进程来将事务数据从表1传输到表2,可能是每小时或每天一次ur查询需要(并且在传输到表2后从表1中删除原始数据-这肯定应该在事务中完成)

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

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

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

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

      • 您是否需要所有可实时访问的记录?也许您可以与业务部门合作创建一个数据保留策略,在该策略中,您可以将数据库中的每个记录保留24小时,然后按分钟或其他方式汇总一周,每小时备份两周,每天备份6个月,等等。您可以通过每天备份来增强这一点,以便可以如果需要,将任何一天全部储存起来
    • 考虑将数据库级别从完全恢复更改为简单或大容量日志。这可以通过您可能正在执行的大容量插入来控制您的事务日志

      • 更多信息:
    • 你必须努力工作来管理你的事务日志。经常进行检查点和事务日志备份


    您在一篇文章中提出了四个问题。请在一篇文章中提出一个问题。当server agent不工作时,您可以使用批处理文件计划您的过程或任何sql命令,并从windows任务中运行它