SQL 服务器优化
SQL Server optimization
我的应用程序(工业自动化)在 Dell T330 服务器上使用 SQL Server 2017 标准版,具有以下配置:
- 至强 E3-1200 v6
- 16gb DDR4 UDIMM
- 2 x 2tb HD 7200RPM(突袭 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 来提高性能,尤其是在使用旋转媒体时成本更高。
针对具有传统 tables 的 1-2TB 数据库的报告工作负载(大型扫描)需要快速存储 (SSD) and/or 更多 RAM(数百 GB)才能提供不错的性能。现有的硬件是最坏的情况,因为只有 16GB RAM 不太可能缓存数据,而且单个主轴每秒只能读取大约 150MB。根据我对你问题中的架构的粗略计算,tblHistory 的每月摘要查询将花费大约一分钟的时间来扫描 10 GB 的数据(假设日期列上的聚集索引)。查询持续时间将随着并发查询的数量而增加,因此由于磁盘带宽限制,5 个并发用户 运行 同一查询每个查询至少需要 5 分钟。 SSD 存储每秒可以维持多个 GB,因此,使用相同的查询和 RAM,上述查询的数据传输时间将不到 5 秒。
@ConorCunninghamMSFT 建议的列存储(例如聚集列存储索引)将大大减少从存储传输的数据量,因为只读取查询中指定列的数据和固有的列存储压缩
将减少磁盘上的数据大小和从磁盘传输的数据量。压缩节省将在很大程度上取决于实际列值,但我预计与行存储 table.
相比 space 减少 50% 到 90%
针对测量数据的报告查询可能会指定日期范围标准,因此按日期对列存储进行分区会将扫描限制在指定的日期范围内,而无需传统的 b-tree 索引。分区还有助于通过滑动 window 分区维护(分区 TRUNCATE、MERGE、SPLIT)清除 12 个月的保留标准,从而与删除查询相比大大提高流程的性能。
我的应用程序(工业自动化)在 Dell T330 服务器上使用 SQL Server 2017 标准版,具有以下配置:
- 至强 E3-1200 v6
- 16gb DDR4 UDIMM
- 2 x 2tb HD 7200RPM(突袭 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 来提高性能,尤其是在使用旋转媒体时成本更高。
针对具有传统 tables 的 1-2TB 数据库的报告工作负载(大型扫描)需要快速存储 (SSD) and/or 更多 RAM(数百 GB)才能提供不错的性能。现有的硬件是最坏的情况,因为只有 16GB RAM 不太可能缓存数据,而且单个主轴每秒只能读取大约 150MB。根据我对你问题中的架构的粗略计算,tblHistory 的每月摘要查询将花费大约一分钟的时间来扫描 10 GB 的数据(假设日期列上的聚集索引)。查询持续时间将随着并发查询的数量而增加,因此由于磁盘带宽限制,5 个并发用户 运行 同一查询每个查询至少需要 5 分钟。 SSD 存储每秒可以维持多个 GB,因此,使用相同的查询和 RAM,上述查询的数据传输时间将不到 5 秒。
@ConorCunninghamMSFT 建议的列存储(例如聚集列存储索引)将大大减少从存储传输的数据量,因为只读取查询中指定列的数据和固有的列存储压缩 将减少磁盘上的数据大小和从磁盘传输的数据量。压缩节省将在很大程度上取决于实际列值,但我预计与行存储 table.
相比 space 减少 50% 到 90%针对测量数据的报告查询可能会指定日期范围标准,因此按日期对列存储进行分区会将扫描限制在指定的日期范围内,而无需传统的 b-tree 索引。分区还有助于通过滑动 window 分区维护(分区 TRUNCATE、MERGE、SPLIT)清除 12 个月的保留标准,从而与删除查询相比大大提高流程的性能。