SQL Server-导出没有主键的大表


9

我需要在SQL Server和MySQL之间没有主键的情况下同步约5亿行的大型表。该表仅具有聚集的复合非唯一索引。

我确实在服务器之间建立了ODBC连接,但是约800万行的导入需要大约45分钟的时间,因此,我认为较大的单次导入将是不合理的,因为在任何时候都可能发生中断。我无法更改现有的表结构,可以添加其他表。进一步阅读后,对于大表,则不可以选择offset / fetch。由于我没有唯一键,因此“选择...在...和...之间的x”不是一个选项。

如何批量导出保证包含所有行的表?我的问题是,由于集群键不是唯一的,因此其排序后的顺序不能保证物理行在连续查询之间具有相同的顺序,而在所有列之后的排序将花费很长时间。以及您如何建议通过ODBC或CSV文件迁移批次?


这将是重复(常规操作)还是一次操作?
Bogdan Bogdanov

初始导出将是一次性操作,同步更改(例如新记录或更新)应重复进行。CDC不是一种选择,但在初始迁移后将进行进一步调查。
没有人

我认为要获得帮助,您必须详细解释整个过程(看起来您有非常复杂的问题)
Bogdan Bogdanov

您注意到“由于聚簇键不是唯一的,因此在聚簇键之后的顺序不能保证物理行在连续查询之间具有相同的顺序”。由于不保留行顺序(除非有一些序列数据),所以您不能依赖于获取相同的物理行顺序。行顺序既不是默认的插入顺序也不是索引顺序,而是由ORDER BY子句定义。
RLF

是的,RLF,我同意。列都是整数,A,B,C,D,E。聚集键在ABC上。ABC组合不是唯一的,ABCD组合也不是唯一的。“排序”非唯一列是否可以批量导出整个表?而Stack平台的Bogdan Bodganov则不鼓励复杂的问题,最好是解决这个问题。如何在不损失行的情况下尽可能快地批量导出完整的大表?
1

Answers:


0

假设您没有针对源表的更新或删除,则可以尝试以下操作:
1.使用CTAS语法(对于SQLServer是SELECT * into source_table_copy FROM source_table)复制现有表。即使对于大桌子,这种操作也非常快。
2. after insertsource_table将新记录复制到的触发器上添加source_table_copy
3.现在,当所有新记录都source_table进入时source_table_copy,您可以将数据从复制的表批量移至Mysql。例如,如果您有2个服务器之间的链接,则可以在TSQL存储过程的主体内完成所有操作。
例如,一段代码最多可将20条记录移至新服务器

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

也可以使用CURSOR读取数据,然后删除with where current of子句。

**理想情况下,您需要防止应用程序source_table在步骤1期间向其中插入数据。如果绝对不可能,我将使用一个after insert触发器,该触发器在步骤1之前添加,并在完成后立即删除,该触发器将数据复制到其他表中后来与合并source_table_copy


谢谢您的解决方案,我也尝试了一些操作,但是使用了普通的插件。我将尝试使用CTAS语法来查看它是否可以加快速度。后续问题,如果您不介意:“插入后触发器”会影响演奏吗?
1

由于触发器主体非常简单(只需将数据插入到另一个表中),对性能的影响将最小。
a1ex07 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.