数据库表针对读取和写入进行了优化

时间:2015-03-16 17:26:20

标签: sql-server optimization

我们有一个Web服务,可将数据泵入3个数据库表和一个Web应用程序,该应用程序在SQL Server + ASP.Net环境中以聚合格式读取该数据。

有很多数据到达数据库表,并且从这些表中读取了大量数据并且速度很快,系统开始出现故障。

表格上有索引,其中一个是唯一的。其中一个表有数十亿条记录,占用几百GB的磁盘空间;另一个表是较小的表,只有几百万条记录。它每天都被清空。

我有哪些选项可以消除同时读取和写入多个数据库表的明显问题?

我对每一个优化技巧感兴趣,虽然我们已经尝试过我们遇到的每一个技巧。

我们无法安装SQL Server Enterprise版本以便能够使用分区和in-memory-optimized tables

编辑: 该系统用于从成千上万的设备中收集健身追踪器数据,并在其仪表板上实时显示数千个数据。

2 个答案:

答案 0 :(得分:3)

过于宽泛的要求和细节给出具体答案。但建议是设置第二个数据库并将日志传送到它。因此原始数据库将是“写入”,新数据库将是“读取”数据库。

缺点

  • 磁盘空间
  • 读取db将按log tranfser的时间长度过时

临   - 可以删除“write”db上的一些索引,这会/可能会提高性能   - 然后,您可以在“读取”数据库中汇总表以提高查询性能

https://msdn.microsoft.com/en-us/library/ms187103.aspx

答案 1 :(得分:2)

这里有一些想法,有些想法比其他想法更复杂,它们的用处在很大程度上取决于问题中未完全描述的用法。免责声明:我不是DBA,但我在数据库项目上与一些优秀的人合作过。

  • [简单]更多系统内存总是有帮助
  • [简单]为tempdb使用多个文件(一个文件组,系统上每个核心有一个文件。即使查询完全在内存中完成,它仍然可以阻止I / O线程)
  • [简单] SIMPLE上的事务日志超过完全恢复
  • [简单]事务日志写入与其余数据分开的主轴。
  • [复杂]您自己将数据拆分为单独的表,然后在查询中将它们合并。
    • [复杂]尝试将未更新的数据放入单独的表中,以便不需要重建静态数据索引。
  • [复杂]如果可能,请确保您正在进行仅附加插入(自动递增PK /聚簇索引应该已经这样做了)。如果可能,请尽量避免更新。
  • [复杂]如果查询不需要绝对最新数据,请更改读取查询以在表上使用WITH NOLOCK并从索引中删除行和页锁。你不会得到不完整的行,但如果你正在阅读的同时写下这些行,你可能会错过几行。
  • [复杂]为表数据和索引数据创建单独的文件组。如果可能,将这些文件组放在单独的磁盘轴上。 SQL Server为每个文件都有单独的I / O线程,因此您可以在一定程度上并行化读/写。
    • 此外,请确保所有大型表都位于不同的文件组中,也位于不同的主轴上。
  • [复杂]删除带有事务锁定的插入
  • [复杂]对数据使用批量插入
  • [复杂]删除不必要的索引
    • 如果不需要排序,则首选列入索引列的列

这是我过去在我所参与的各种数据库项目中所做的事情的通用列表。数据库优化往往高度针对您的情况......这就是DBA有工作的原因。如果您的架构已经支持,那么一些“复杂”的答案可能很简单。