Jef*_*aes 7 performance index sql-server
我们有一个包含金融交易的大型附加表。平均每分钟插入 1000 个事务。由于现在有越来越多的用例,我们实际上想要读取、搜索和聚合这些事务,因此快速读取会非常好。
我们希望保证非常快的写入,并且添加索引来覆盖一些读取会减慢写入速度。
好消息是我们可以负担得起陈旧的数据。我正在考虑每n分钟创建一个数据副本到读取优化表(带有索引),这也允许定期批量复制(从而限制操作数?)
我正在寻找有关这是否是有效策略的意见。如果您认为这是一个不错的策略,您是否有实施选项指针?如果没有,有哪些替代方案?
对于 SQL Server 2014 及更高版本,我的建议相当激进:切换到聚集列存储索引。即使在适度的硬件上,1000 条记录/分钟也完全在列存储批量加载能力的范围内。请参阅聚集列存储索引:数据负载优化 – 最小日志记录和SQL Server 聚集列存储元组移动器。由于列存储和批处理的固有优势,聚集列存储的查询性能相当惊人。但在时间序列(您的数据可能是)上更是如此,因为很可能会消除段。
在SQL Server上二零一六年,有一些具体的改进,针对你的情况,看实时运行分析使用内存技术,并加快业务分析使用内存技术。
对于 SQL Server 2012 及更早版本,我的建议是升级到 2014 或 2016。
无论如何,我会回避事务复制,原因有二:
还需要考虑日志传送或 AlwaysOn 可读辅助只能卸载查询处理,而不是架构要求(即索引)。在副本上查询所需的任何索引都必须在原始数据库上创建,并且在写入时付出代价。
当然,我假设您进行了尽职调查并且您的写入现在已优化,即。应用数据加载性能指南中的所有建议,您的上传是批量和最少记录的。
在不涉及明显的硬件可能性和高可用性解决方案的情况下,我会考虑构建一个“临时表”,它具有最低限度的索引,甚至是一个堆,您可以在其中以最大性能卸载传入事务。
然后,计划/循环过程可以将该数据异步移动到主事实表中,该事实表可以具有更适合报告的索引。同一流程还可以在另一个表中维护聚合,因此您可以直接根据这些聚合构建报告。关键是异步的,所以我不会使用触发器或索引视图,而是使用诸如反复运行存储过程的 SQL Server 代理作业之类的东西。
优点:
缺点:
哦,如果您使用的是 SQL Server 2014/2016 Enterprise Edition,您的临时表可能位于内存中。