【发布时间】: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