Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 拉动的最佳方法是什么;三角洲;从高度事务性的数据库将数据导入分析数据库?_Sql_Database_Analytics - Fatal编程技术网

Sql 拉动的最佳方法是什么;三角洲;从高度事务性的数据库将数据导入分析数据库?

Sql 拉动的最佳方法是什么;三角洲;从高度事务性的数据库将数据导入分析数据库?,sql,database,analytics,Sql,Database,Analytics,从高度事务性的数据库中只将增量加载到分析数据库中的最佳方法是什么 注: 我们有一个高度事务性的系统,我们正在用它构建一个分析数据库。目前,我们正在从analytics DB中删除所有事实和维度表,并在午夜加载整个“已处理”数据。这种方法的问题在于,我们每次都会一次又一次地加载相同的数据,同时加载在特定日期添加/更新的少量新数据。我们需要单独加载“Delta”(新插入的行和更新的旧行)。有什么有效的方法可以做到这一点吗?在不知道细节的情况下很难说出一些事情,例如数据库架构、数据库引擎。。。然而,对

从高度事务性的数据库中只将增量加载到分析数据库中的最佳方法是什么

注:
我们有一个高度事务性的系统,我们正在用它构建一个分析数据库。目前,我们正在从analytics DB中删除所有事实和维度表,并在午夜加载整个“已处理”数据。这种方法的问题在于,我们每次都会一次又一次地加载相同的数据,同时加载在特定日期添加/更新的少量新数据。我们需要单独加载“Delta”(新插入的行和更新的旧行)。有什么有效的方法可以做到这一点吗?

在不知道细节的情况下很难说出一些事情,例如数据库架构、数据库引擎。。。然而,对我来说,最自然的方法是使用时间戳。此解决方案假定从事务数据库加载/迁移到分析数据库的实体(表中的单个记录或相关记录组)具有时间戳

此时间戳表示上次创建或更新给定实体的时间。加载/迁移数据时,对于每个时间戳>上次迁移的日期,应仅考虑这些实体。这种方法的优点是非常简单,不需要任何特定的工具。问题是您的数据库中是否已经有时间戳


另一种方法可能是利用某种变化跟踪机制。例如,MMSQL服务器具有类似的功能(请参见此)。然而,我不得不承认我从未使用过它,所以我不确定它是否适合这种情况。如果您的数据库不支持更改跟踪,您可以尝试根据触发器自行创建更改跟踪,但通常这并不容易。

在不了解详细信息的情况下很难说出一些事情,例如数据库架构、数据库引擎。。。然而,对我来说,最自然的方法是使用时间戳。此解决方案假定从事务数据库加载/迁移到分析数据库的实体(表中的单个记录或相关记录组)具有时间戳

此时间戳表示上次创建或更新给定实体的时间。加载/迁移数据时,对于每个时间戳>上次迁移的日期,应仅考虑这些实体。这种方法的优点是非常简单,不需要任何特定的工具。问题是您的数据库中是否已经有时间戳

另一种方法可能是利用某种变化跟踪机制。例如,MMSQL服务器具有类似的功能(请参见此)。然而,我不得不承认我从未使用过它,所以我不确定它是否适合这种情况。如果您的数据库不支持更改跟踪,您可以尝试根据触发器自己创建它,但一般来说这并不容易

我们需要单独加载“Delta”(新插入的行和更新的旧行)。有什么有效的方法吗

您忘记了已删除的行。这就是问题的症结所在。在每个表上都有一个
updated\u at
字段,并使用
updated\u at>@last\u poll\u time
轮询行,或多或少都是有效的,但这样的轮询并不能给您一个事务一致性映像,因为每个表都是在不同的时刻轮询的。跟踪已删除的行会导致应用程序/数据模型层的复杂性,因为行必须在逻辑上删除(
已删除
)或移动到存档表(对于每个表!)

另一种解决方案是在数据库中写入触发器,将触发器附加到每个表中,并将触发器写入
表\u历史记录中
发生的更改。同样,对于每个表。众所周知,这些解决方案在存在模式更改(添加、修改列、删除表等)的情况下很难长期维护

但有一些特定于数据库的解决方案可以提供帮助。例如,SQLServer具有和。可以利用这些工具来构建维护分析数据仓库的ETL管道。不过,数据库模式更改仍然是一个难题

没有银弹,没有精灵的尘埃

我们需要单独加载“Delta”(新插入的行和更新的旧行)。有什么有效的方法吗

您忘记了已删除的行。这就是问题的症结所在。在每个表上都有一个
updated\u at
字段,并使用
updated\u at>@last\u poll\u time
轮询行,或多或少都是有效的,但这样的轮询并不能给您一个事务一致性映像,因为每个表都是在不同的时刻轮询的。跟踪已删除的行会导致应用程序/数据模型层的复杂性,因为行必须在逻辑上删除(
已删除
)或移动到存档表(对于每个表!)

另一种解决方案是在数据库中写入触发器,将触发器附加到每个表中,并将触发器写入
表\u历史记录中
发生的更改。同样,对于每个表。众所周知,这些解决方案在存在模式更改(添加、修改列、删除表等)的情况下很难长期维护

但有一些特定于数据库的解决方案可以提供帮助。例如,SQLServer具有和。可以利用这些工具来构建维护分析数据仓库的ETL管道。不过,数据库模式更改仍然是一个难题


没有银弹,没有精灵尘埃。

投票决定转到dba.sevoted转到dba.seb,但当一些记录从表中删除时,这种方法无法处理这种情况。它只适用于创建/更新操作,但这种方法不能处理从表中删除某些记录的情况。它仅适用于创建/更新操作。