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

标签 sql sql-server database reporting-services

现状:

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

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

问题:

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

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

  • 使用存储过程:

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

  • 创建客户端应用程序:

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

  • 使用 SSIS 作业:

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

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

非常感谢任何建议!

最佳答案

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

摘录

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

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

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

转换

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

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

加载

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

选项 2:您以报告要求的形式(按报告)放置数据。显然,这会导致大量的数据集,但如果只需要少量不会更改的报告,它就有它的好处。这取决于....

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

关于sql - 将非规范化数据移动到报告数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53371067/

相关文章:

c# - 在多个连接c#中执行SQL

sql-server - 比较 Varchar 和 UniqueIdentifier

php - 正在合并单独的电子邮件

ios - 核心数据模式设计

LINQ 查询到 SQL 脚本

SQL 查询——如何找到最低的 2 个数字

mysql - SQL:计算表中不同行值的数量

SQL Server 查询 - 最小值、最大值、平均值聚合问题

sql-server - SQL Server 中的事务大小限制

sql-server - Golang mssql 驱动程序返回 "mssql: Invalid object name"