我正在尝试将我的数据仓库中的几个非常大的表迁移到新的分区方案(旧的分区方案是基于一个RANGE LEFT
函数,没有定期拆分,最近的数据在最后一个文件组中是头重脚轻的) . 这些表足够大(50 亿行,400 GB 数据空间),我不敢尝试重建聚集索引,因为担心日志空间不足。
我试图通过将多个INSERT...(WITH TABLOCK) SELECT...WHERE <check constraint predicate> (OPTION MAXDOP 4)
语句运行到相同的暂存表中来加载新表,方案中每个文件组一个,稍后我将切换到替换表中。我通过各个 SSA 作业协调此虚假批量加载的执行,以利用预读/旋转木马。
所有作业在相对较小的表上都运行良好,所有作业都将同时运行。然而,在第一个大表上,大多数 SSA 作业都RESOURCE_SEMAPHORE
在等待,而第一个分区的作业正在运行。
如果我的服务器有 768 GB RAM、24 个内核(超线程)并且它在 400 GB 的表上工作,我应该MAXDOP
向下调整以释放更多授权或启用资源调控器以减少最大授权以获得更多 SSA 作业启动和并行工作?
我最初尝试了BULK_LOGGED
恢复模式,但去了SIMPLE
. 交易规模依然庞大;我生成了超过 1 TB 的日志复制 15 GB(如果数据集未排序,一定是由于页面拆分,我正在使用页面压缩,并且我运行的不是MAXDOP 1
)。
我正在使用 FTDW 设备(本地 SSD 阵列运行大约 5 GB/s 的吞吐量,PureStorage 阵列峰值为 11 GB/s)所以希望磁盘延迟不会成为问题。我正在用 SMO 编写 SSA 作业。
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 2016 年 10 月 28 日 18:17:30 版权所有 (c) 微软公司 企业版:基于内核的许可(64 位) 在 Windows Server 2012 R2 Standard 6.3(内部版本 9600:)上
如果您在这里查看我的回答,我提到了一个新的(大概)查询提示
MAX_GRANT_PERCENT
,您可以使用它来进一步控制查询级别的内存授予。文档在这里。
假设查询在
default
池中并且您没有更改它,现在它们可以请求您 768 GB RAM 的 25%。那是很多内存。您必须尝试降低百分比,直到找到并发性和不溢出磁盘占用率之间的平衡。
希望这可以帮助!