sql-server - SQL Server 优化
问题描述
我的应用程序(工业自动化)在 Dell T330 服务器上使用 SQL Server 2017 Standard Edition,具有以下配置:
- 至强 E3-1200 v6
- 16GB DDR4 UDIMM
- 2 x 2tb HD 7200RPM (Raid 1)
在这家银行,我保存以下表格:
Table: tableHistory
Insert Range: Every 2 seconds
410 columns type float
409 columns type int
--
Table: tableHistoryLong
Insert Range: Every 10 minutes
410 columns type float
409 columns type int
--
Table: tableHistoryMotors
Insert Range: Every 2 seconds
328 columns type float
327 columns type int
--
Table: tableHistoryMotorsLong
Insert Range: Every 10 minutes
328 columns type float
327 columns type int
--
Table: tableEnergy
Insert Range: Every 700 milliseconds
220 columns type float
219 columns type int
笔记:
当我生成报告/图表时,我的应用程序将包含在缓冲区中。因为系统不能同时接入和查阅。因为查询加载良好。
A列,它们是电流、温度、液位等的值。这个信息记录了一年。
问题
使用这种级别的处理,我会遇到任何性能问题吗?
由于需求量大,我是否需要更好的硬件?
我的应用程序会因硬件而在某些时候中断吗?
解决方案
您的问题可能过于宽泛,但我想详细说明评论并提供更多建议。
您需要多少 RAM 才能获得足够的性能取决于报告查询。因素包括触及的行数、执行计划运算符(排序、散列等)、并发查询的数量。更多的 RAM 还可以通过避免 IO 来提高性能,尤其是使用旋转媒体时成本高昂。
针对具有传统表的 1-2TB 数据库的报告工作负载(大型扫描)需要快速存储 (SSD) 和/或更多 RAM(数百 GB)以提供良好的性能。现有的硬件是最坏的情况,因为只有 16GB 的 RAM 不太可能缓存数据,并且单个主轴每秒只能读取大约 150MB。根据我对您问题中架构的粗略计算,每月对 tblHistory 的摘要查询将花费大约一分钟来扫描 10 GB 的数据(假设日期列上有一个聚集索引)。查询持续时间将随着并发查询的数量而增加,因此由于磁盘带宽限制,每个查询至少需要 5 分钟,5 个并发用户运行相同的查询。SSD 存储每秒可以维持多个 GB,因此,使用相同的查询和 RAM,
@ConorCunninghamMSFT 建议的列存储(例如聚集列存储索引)将大大减少从存储传输的数据量,因为仅读取查询中指定的列的数据,并且固有的列存储压缩将减少磁盘上的数据大小和从磁盘转移的金额。压缩节省在很大程度上取决于实际的列值,但与行存储表相比,我预计空间会减少 50% 到 90%。
针对测量数据的报告查询可能会指定日期范围标准,因此按日期对列存储进行分区会将扫描限制在指定的日期范围内,而无需使用传统的 b 树索引。分区还将有助于清除具有滑动窗口分区维护(分区 TRUNCATE、MERGE、SPLIT)的 12 个月保留条件,从而与删除查询相比大大提高进程的性能。
推荐阅读
- php - Smarty (PHP) 数学问题与四舍五入的结果。Prestashop
- machine-learning - 如何区分手写与背景
- spring - 将轮询器添加到 SFTP 出站网关
- python - 考虑到索引位置,首先获取两个数组的 nan
- nativescript - NativeScript Vue 发送带有表单数据的请求(multipart/form-data)
- nosql - 如何在 DynamoDB 中为制造商建模
- python - AWS serverless 函数运行时环境使用的是哪个 python3.6 补丁版本?
- flutter - 如何使用 Flutter 应用程序和 Firebase 保存信用卡以供以后在 Stripe 支付中使用?
- sql - 按聚合函数 SQL 分组
- javascript - 在 C#/ASP.NET/Razor html Web 应用程序中实现 WebcamJS