
[英]SQL Server - Avoiding write timeouts on logging table due to reporting queries
[英]avoiding write conflicts while re-sorting a table
我有一张大桌子,需要定期重新排序。 我部分基于此建议,因为我插入的数据顺序不同(按时间)与我对其进行群集的方式(按ID)不同,因此建议不要使用群集键,这可能会导致重新群集以获取有点失控。
因为我每小时写入一次表,所以我很警惕这两个过程的冲突:如果我将CTAS转换为新排序的临时表,然后交换表名,那似乎就像是我打开了写该文件的大门源表不能进入临时表。
我认为我可以在重新排序时触发一个标志,这会导致ETL暂停写入,但是这似乎有点hacky,而且可能很脆弱。
我当时正在考虑利用锁定和事务处理,但这似乎不是正确的用例,因为我认为写入新表时不会锁定要复制的表。 有关如何处理此问题的任何建议?
有一些避免自动重新聚类的原因,但是基本上与您不应该建立作业来频繁重新聚类的原因相同。 您正在使数据库完成所有相同的工作,但没有内置的管理功能。
如果您的表足够大,可以看到按时间进行群集的性能问题,并且您知道ID列是此表(在JOIN和WHERE子句中)被过滤的主要方式,那么这可能是自动选择的一个很好的选择。聚类。
因此,我建议至少测试一下ID上的群集密钥,然后监视/比较性能。
为了简短地回答关于没有冲突的求助的问题,我可以建议:使用时间列对早于给定时间的记录(可能在单独的表中)进行重新排序。 在排序时,您可能会得到一些新记录。 但是您将能够使用该时间列将那些新记录与现在已排序的旧记录结合起来。
我已经在注释中提出了一些有关您要避免的群集的澄清性问题,但是就您的排序而言,您是否考虑过创建一个不错的4XL仓库并利用INSERT OVERWRITE选项重新实现? 它看起来像:
INSERT OVERWRITE INTO table SELECT * FROM table ORDER BY id;
假设您的表的大小不超过数百TB,那么此操作将很快完成(我想在一小时内),并且在此期间插入表的所有数据都会排队等待其完成。
您可能会考虑撤销执行CTAS创建表的新排序副本的同一脚本或过程中原始表的INSERT,UPDATE,DELETE特权。 交换成功后,您可以重新启用用于执行更新的角色的特权。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.