我有两台服务器。
捡来的垃圾,用胶带和泡泡糖拼凑起来的。它是戴尔 R620 和 Gen 8 HPE 部件的混合体,具有 40 个内核/1.5 TB 内存。运行 ubuntu 22.04 和 sql server 2022 Dev 版本。Raid 10 3.7 TB SSD。MDOP 设置为 16。
另一个是托管在三头集群 Xenon Gold 上的虚拟机,所有一切都由 SSD Nas 负责。服务器 2019,SQL Server 标准 2022。分配了 128 GB/16 个核心。MDOP 也设置为 16。数据库是从测试服务器备份/恢复的。
主表存储实时流数据,平均每天新增 1 亿到 2 亿条记录,目前接近 300 亿行,共 4 列。主表设置了列存储索引,数据通过时间戳字段进行排序和填充。
在测试服务器上执行一个简单的查询需要几秒到几分钟的时间,但在即将成为生产的服务器上则需要几分钟到将近一个小时的时间。
测试服务器显示所有 16 个核心均已使用。在生产服务器上,它仅使用两个核心。如果我运行同一查询的多个实例,则生产服务器将在每个执行的查询中额外消耗两个核心。这可以一直进行,直到 CPU 利用率达到 100%。
我正在测试的查询select top 100 * from mlinkdatacsunixtime order by serialtime desc
在测试服务器上运行时间为 1 分钟到 1.5 分钟。在生产中则需要 11 分钟。
我已经检查过:VM 插槽与核心数。每个插槽 2 个/8 个核心。已验证的 SQL Server 显示所有 16 个都处于在线状态且可见。匹配了两个 SQL 实例之间的所有选项。仔细检查了服务器和 DB MDOP 设置。多次执行查询以尝试将表加载到内存中。表大约有 50 GB,在测试多个查询后,Prod 服务器显示仅使用了 128 GB 中的 63 GB。测试服务器徘徊在 250 GB 左右,但其他项目还有很多。
真的希望有人能告诉我,我错过了一些愚蠢的事情。
我的下一个测试是使用 sql Dev 版本重建服务器,看看它是否符合 sql 标准。我最后的救命稻草是试图说服系统管理员和管理层让我在生产中运行 linux 服务器。
有根据的猜测是,微软讨厌您使用标准版,并且您的批处理模式查询被限制为 DOP 2。
SQL Server 标准版中的列存储索引有多有用?