快速读取而无需为写入付出代价

Jef*_*aes 7 performance index sql-server

我们有一个包含金融交易的大型附加表。平均每分钟插入 1000 个事务。由于现在有越来越多的用例,我们实际上想要读取、搜索和聚合这些事务,因此快速读取会非常好。

我们希望保证非常快的写入,并且添加索引来覆盖一些读取会减慢写入速度。

好消息是我们可以负担得起陈旧的数据。我正在考虑每n分钟创建一个数据副本到读取优化表(带有索引),这也允许定期批量复制(从而限制操作数?)

我正在寻找有关这是否是有效策略的意见。如果您认为这是一个不错的策略,您是否有实施选项指针?如果没有,有哪些替代方案?

Rem*_*anu 6

对于 SQL Server 2014 及更高版本,我的建议相当激进:切换到聚集列存储索引。即使在适度的硬件上,1000 条记录/分钟也完全在列存储批量加载能力的范围内。请参阅聚集列存储索引:数据负载优化 – 最小日志记录SQL Server 聚集列存储元组移动器。由于列存储和批处理的固有优势,聚集列存储的查询性能相当惊人。但在时间序列(您的数据可能是)上更是如此,因为很可能会消除段

在SQL Server上二零一六年,有一些具体的改进,针对你的情况,看实时运行分析使用内存技术,并加快业务分析使用内存技术

对于 SQL Server 2012 及更早版本,我的建议是升级到 2014 或 2016。

无论如何,我会回避事务复制,原因有二:

还需要考虑日志传送或 AlwaysOn 可读辅助只能卸载查询处理,而不是架构要求(即索引)。在副本上查询所需的任何索引都必须在原始数据库上创建,并且在写入时付出代价。

当然,我假设您进行了尽职调查并且您的写入现在优化,即。应用数据加载性能指南所有建议,您的上传是批量和最少记录的。

  • 请注意,这假定企业 (4认同)

Dan*_*her 2

在不涉及明显的硬件可能性和高可用性解决方案的情况下,我会考虑构建一个“临时表”,它具有最低限度的索引,甚至是一个堆,您可以在其中以最大性能卸载传入事务。

然后,计划/循环过程可以将该数据异步移动到主事实表中,该事实表可以具有更适合报告的索引。同一流程还可以在另一个表中维护聚合,因此您可以直接根据这些聚合构建报告。关键是异步的,所以我不会使用触发器或索引视图,而是使用诸如反复运行存储过程的 SQL Server 代理作业之类的东西。

优点:

  • 快如闪电的插入(写入事务时几乎没有任何等待时间)
  • 事实表中每批插入的行数越大,应该提供更好的写入性能
  • 允许事实表上有更好/更多的索引
  • 聚合表将提供相当好的报告性能

缺点:

  • 当异步进程轮询临时表时,它可能会被锁定一小段时间。
  • 从插入到数据可用之间略有延迟。
  • 增加了复杂性

哦,如果您使用的是 SQL Server 2014/2016 Enterprise Edition,您的临时表可能位于内存中。