Sql 将非规范化数据移动到报告数据库

Sql 将非规范化数据移动到报告数据库,sql,sql-server,database,reporting-services,Sql,Sql Server,Database,Reporting Services,当前情况: 我们有一个包含所有业务数据的SQL数据库。有几十个对象,如客户、门票和产品。每个对象保存在多个表中,每个对象通常在8到12个表之间。所以我们的数据库现在有超过200个表 为了使报告更容易,我们希望创建一个报告数据库,在该数据库中我们对这些对象进行非规范化,以使其更易于访问,并提高live DB的性能,因为现在所有报告都从live DB获取数据 问题: 这就是过去棘手的开始:我们还需要在target/reporting数据库中创建包含数据的新列,我们可以在其中存储用于报告的计算数据。例

当前情况:

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

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

问题:

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

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

  • 使用存储过程:
创建一个sql脚本,使用例如merge将所有定义的列传输到新数据库。这里的缺点是,由于所有计算都必须由数据库本身完成,因此它可能会导致性能下降

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

  • 使用SSIS作业:
这是上面两种方法的混合:ssis作业获取数据,计算所有扩展列并将它们放入报告数据库

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


任何建议都是非常宝贵的

这个问题实在太宽泛了,但我会尝试概述一下您的一些选择

提取

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

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

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

变换

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

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

加载

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

选项2:您可以按报表要求的格式逐个记录数据。显然,这会导致大量的数据集,但如果只需要少量的不会改变的报告,这是有好处的。这取决于


当您试图构建一个完整的BI解决方案时,您确实有太多的选择,我们对什么最适合您会有不同的想法。

我最终做出了一种混合:

我创建了一个Webapplication,它按照对象模型中的外观显示所有对象和表。它允许您选择哪个对象的哪些列应该被传输、反规范化等等。此操作的输出将保存到一个表中,该表列出了ReportingDB中应该可用的所有列

保存选定列将创建:

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

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

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

  • 名为“objectname”的存储过程\u聚合,只创建一次。 它允许您添加自定义函数,用数据填充聚合列。此SP在更新SP后每15分钟触发一次。您可以计算内容