Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于行版本的SSIS ETL模式偶尔会丢失行,如何更正?_Sql Server_Ssis - Fatal编程技术网

Sql server 基于行版本的SSIS ETL模式偶尔会丢失行,如何更正?

Sql server 基于行版本的SSIS ETL模式偶尔会丢失行,如何更正?,sql-server,ssis,Sql Server,Ssis,我们一直在使用基于rowversion的SSIS模式来同步两个数据库之间的记录,方法是只查看源中自上次运行包以来插入或更新的行。注意:永远不会从源表中删除数据,这是此SSIS模式的先决条件 然而,最近我们发现,尽管每天都在运行导入,但实际上从上个月开始,我们的导入却遗漏了行,将它们完全排除在数据仓库之外! 这就是我正在寻找的解决方案。我们如何改变ETL模式来避免这个问题,而不必每天从源代码中读取每一行? 通过互联网搜索,我们找到了为什么会发生这种情况的解释,但并没有找到解决办法。该漏洞似乎与以下

我们一直在使用基于rowversion的SSIS模式来同步两个数据库之间的记录,方法是只查看源中自上次运行包以来插入或更新的行。注意:永远不会从源表中删除数据,这是此SSIS模式的先决条件

然而,最近我们发现,尽管每天都在运行导入,但实际上从上个月开始,我们的导入却遗漏了行,将它们完全排除在数据仓库之外! 这就是我正在寻找的解决方案。我们如何改变ETL模式来避免这个问题,而不必每天从源代码中读取每一行?

通过互联网搜索,我们找到了为什么会发生这种情况的解释,但并没有找到解决办法。该漏洞似乎与以下事实有关:SQL列rowversion在插入/更新开始时获取其值,而不是在提交时获取,这可能导致行在包执行时不可用,但在rowversion值小于存储的ETLRowversion值的情况下稍后提交,所以下次作业运行时,它们会被跳过

简言之,我们目前的模式是这样的:(为了简单起见,我省略了涉及索引维护等的步骤。)

  • 使用
    min\u active\u rowversion()
    调用
    @MaxRv
    从源数据库获取上一个活动的rowversion
  • 获取上次成功执行SSIS任务时的rowversion值(存储在数据仓库中名为
    ETLRowversions
    的表中)。称之为
    @LSERV

  • 从源表
    中读取行,其中rowversion为>=@LSERV且rowversion为不使用
    rowversion
    。它只适用于乐观并发。它不能保证有连续的值。SQL Server至少从2005年开始提供,速度快得多,还可以跟踪删除的行。如果我们遵循这样的模式,我们会在刷新窗口开始时向后偏移(即从变量@LSERV中减去X,其中X很小,但足以提供一个提取和下一个提取之间的重叠)。启用更改跟踪,服务器自动存储新行、修改行和删除行的PK值。它可以返回自特定数据库版本以来修改的所有PK值,这意味着您可以轻松地仅请求自上次加载以来更改的PK。您可以将这些结果与源表合并,以仅加载修改的行。这比使用不可索引的rowversion时所需的完整表扫描快得多。BTW
    rowversion
    是不可索引的,因为它不用于querying@BarneyLrowversion不用于查询。无论窗口有多小或多大,数据都可能是错误的。不要介意只选择几个值所需的全表扫描