【问题标题】:Moving denormalized data to Reporting DB将非规范化数据移动到报告数据库
【发布时间】:2018-11-19 08:48:05
【问题描述】:

现状:

我们有一个包含我们所有业务数据的 SQL 数据库。有几十个对象,如客户、门票和产品。每个对象保存在多个表中,通常每个对象有 8 到 12 个表。所以我们的数据库现在有超过 200 个表。

为了使报告更容易,我们希望创建一个报告数据库,在其中我们对这些对象进行非规范化以使其更易于访问并提高我们的实时数据库的性能,因为所有报告现在都从实时数据库中获取数据。

问题:

这是过去棘手的开始:我们还需要在目标/报告数据库中创建包含数据的新列,我们可以在其中存储计算数据以进行报告。例如,一张票从开始到结束需要多长时间或谁订购了产品(非规范化为文本逗号分隔)

问题是,将这些数据传输到新数据库的最佳解决方案是什么?我们想到了不同的方法:

  • 使用存储过程:

创建一个 sql 脚本,使用例如合并将所有定义的列传输到新数据库。这里的缺点是它可能会很重,因为所有计算都必须由数据库本身完成。

  • 创建客户端应用程序:

创建一个客户端应用程序,从实时数据库中选择数据,在运行时计算所有必要的列并将其插入到报告数据库中。

  • 使用 SSIS 作业:

这是上述两者的混合:获取数据、计算所有扩展列并将它们放入报告数据库的 ssis 作业。

我知道这可能有点“基于意见”的问题,但必须有一个最佳实践解决方案,因为我们不能是唯一有这种需求的人。不幸的是,我真的可以在网上找到任何好的答案。

任何建议都非常感谢!

【问题讨论】:

  • 许多 ETL 过程是您列出的所有 3 种方法的组合。您是否考虑过首先使用复制到临时数据库? (或使用 AG)否则,ETL 很可能会将负载放在您的源数据库上(您试图避免的问题!)。相关:dba.stackexchange.com/questions/52449/…
  • 我们考虑过使用 Always On 来进行复制,但不幸的是它太贵了(从金钱上来说)。但是使用客户端应用程序可以避免实时数据库上的负载,这些少数选择不会花费任何性能,并且所有计算都可以由应用程序服务器完成,对吧?
  • "但不幸的是它太贵了(在金钱方面)" - 但是您仍然需要另一台服务器吗?对? ...“但是使用客户端应用程序可以避免实时数据库上的负载,这些少数选择不会消耗任何性能”-您为什么这么认为?是您正在执行转换,这些选择仍然需要时间....
  • 将查询的输出写入报表服务器的表中?我工作的地方至少有 3 个不同的学生管理系统,所有服务器都连接在一起,并且从其中一个系统运行夜间(或每小时)查询,以将用于报告的数据存储在“报告数据库”中
  • 我会说您需要 SP 和 ETL 的组合。正如其他用户所说,如果您有一个“ods”数据库,您可以在其中转储从您的操作源检索到的第一轮数据,这会很有趣。也许这个任务可以得到一些 SP 的支持。这个“ods”可以对数据进行第一轮转换并首先进行清理。然后,典型的方法是使用 ETL 工具(如 SSIS)来处理分析模型的负载,这通常是星型模型,您可以将 ods 数据非规范化为维度表和事实表。

标签: sql sql-server database reporting-services


【解决方案1】:

这个问题实在是太宽泛了,但我会试着概述一些你有的选择。

提取

选项 1:创建直接从源表读取的存储过程,这些存储过程要么存在于源数据库本身,要么存在于您的报告数据库中(使用跨数据库调用(显然这有缺点,即数据库被捆绑在一起))。这些过程应该能够以完整(所有数据)和增量(仅最新)模式运行。您可能还想为您的增量负载做一些重叠。

选项 2:您设置更改数据捕获(此处的问题是确保您不填写日志,但这会为您提供更详细的详细信息)或更改跟踪(仅获取最新版本的记录,而不是更改)在您的源数据库上并从生成的更改表中读取以从源数据库中获取更改的记录。

选项 3:创建源数据库的只读副本并从该副本中读取。

变换

选项 1:我个人的选择是使用 SSIS 进行提取过程。它是为做这样的事情而设计的。尤其是当您在服务器之间移动时,您还可以从组织的其他部分引入数据,例如 HR 记录等。您应该设置一个框架,其中您有一个项目,每个项目都包含一个 SSIS 包列表,可以在完整模式或增量模式下执行。您可以直接加载到源数据库或创建中间人数据库,以便为任何复杂数据做好进一步处理的准备。您可能需要在捡起东西后放下它们来执行一些更复杂的事情。

选项 2:您编写从源读取并直接推送到目标的存储过程。这可以与提取部分中的选项 1 结合使用。您需要确保它们可以合并,因此您可以使用单独的 INSERT 和 UPDATE 语句或使用 MERGE。

加载

选项 1:将 ETL 流程中的数据放入星型或雪花型模式(星型将需要更少的连接,并且 SSAS 中内置了针对星型模式的优化)。然后,您可以使用它来将数据移动到 SSAS 多维模型或表格模型中。

选项 2:您将数据按报告要求的形式逐个报告。显然这会导致大量的数据集,但如果只需要少量不会改变的报告,它就会获胜。这取决于....

在您尝试构建一个完整的 BI 解决方案时,您确实有太多选择,对于最适合您的解决方案,我们都有不同的想法。

【讨论】:

  • 非常感谢您的帮助!如果您对我最终得到的结果感兴趣,请查看我的答案:)
【解决方案2】:

我最终制作了一种混合体:

我创建了一个 Web 应用程序,它显示对象模型中的所有对象和表。它允许您选择应该传输、非规范化等对象的哪些列。其输出将保存到一个表中,其中列出了 ReportingDB 中应该可用的所有列。

保存选定的列会创建:

  • LiveDB 中的视图选择所有这些列。基于对象模型的每个对象一个视图。

  • 将所有数据从“新”列移动到报告数据库的存储过程。 新列是尚未转移的列。此存储过程在夜间每 24 小时触发一次,以避免对 LiveDB 造成任何影响。

  • 传输更新 ReportingDB 中日期时间戳与 ReportingDB 不同的所有数据行的“更新”存储过程。该 SP 每 15 分钟触发一次。

  • 一个名为“objectname”_aggregates 的存储过程只会被创建一次。 它允许您添加自定义函数来用数据填充聚合列。此 SP 在更新 SP 后每 15 分钟触发一次。您可以根据传输的列或从旧值到新值的“增量”计算聚合列的内容(如果您需要进行复杂的时间计算等......)

所有存储过程总是从之前创建的视图中选择数据。

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2013-01-18
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多