【问题标题】:SSIS This Year verses Last Year extract best designSSIS今年与去年的最佳设计
【发布时间】:2020-05-06 13:47:46
【问题描述】:

我需要使用 SSIS 编写报告以将 SQL 数据库中的数据提取到 CSV 文件中。

数据是本周的销售额以及去年同一周的销售额。

我编写了一个包含两个数据流任务的 SSIS 包,一个将数据加载到持久表中,另一个将数据提取到 CSV 中。

问题是性能真的很差。本周我们正在查看大约 1000 条销售记录,但去年相应的一周有 150 万条记录 +

本周和去年是同一张表,所以几乎是同一个查询,但日期参数不同。

到目前为止我已经尝试过:

  1. 一个包含两个 CTE 的查询已连接。表演时间为 45 分钟
  2. 仅针对今年的数据插入表中,并单独更新以添加去年的数据。手术耗时 20 分钟。
  3. 具有 NOLOCK 提示的两个 SQL 源,然后使用 Merge Join 对其进行排序和连接。我曾希望两者能够并行运行,但我在 45 分钟后停止了它。

即使在 20 分钟时使用选项 2,它也将比庄园中的任何其他 SSIS 包慢大约 4 倍。

我的问题是,从同一个表中获取两次数据的最佳设计实践是什么?

【问题讨论】:

  • 如果只是在management studio中运行SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM dbo.MyTable AS T WHERE T.sale_date >= '2020-04-28' AND T.sale_date < '2020-05-05' UNION ALL SELECT * FROM dbo.MyTable AS T WHERE T.sale_date >= '2019-04-28' AND T.sale_date < '2019-05-05',执行需要多长时间,返回多少行?数据的形状是什么样的(列数及其数据类型)?
  • 我没有考虑过Union All,但我会在周一回去工作时尝试一下。谢谢
  • 高效 ETL 的一般规则始终是减少您移动的数据量(数据宽度和深度/行数)。对获取提取物的成本进行基准测试,然后将该时间与将其移动和存储到其他地方的过程进行比较,并衡量差异是否对业务需求具有重要意义。
  • 我要做的另一个观察是确定报表数据源需要回溯多远。也许您只需要滚动的一年,无论如何。加载所有时间的历史时期的数据,然后您的 ETL 只关心新内容(以及如果您必须处理更改),但这会将您的每日/每周更改范围减少到 3 个月(任意持续时间)的数据更改ETL - 您的企业应该能够更深入地了解他们的流程。

标签: sql ssis


【解决方案1】:

我已经研究了 Union All 的想法,但没有奏效。我需要今年和去年在同一行,但不知道如何让它工作。

通过删除一些列并在 SSIS 中对它们执行查找,我将其缩短到不到 10 分钟,这已将性能提高到可接受的水平。

感谢您的支持。

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 2016-11-08
    • 2022-11-16
    • 2017-09-19
    • 1970-01-01
    • 2023-03-16
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多