【发布时间】:2020-05-06 13:47:46
【问题描述】:
我需要使用 SSIS 编写报告以将 SQL 数据库中的数据提取到 CSV 文件中。
数据是本周的销售额以及去年同一周的销售额。
我编写了一个包含两个数据流任务的 SSIS 包,一个将数据加载到持久表中,另一个将数据提取到 CSV 中。
问题是性能真的很差。本周我们正在查看大约 1000 条销售记录,但去年相应的一周有 150 万条记录 +
本周和去年是同一张表,所以几乎是同一个查询,但日期参数不同。
到目前为止我已经尝试过:
- 一个包含两个 CTE 的查询已连接。表演时间为 45 分钟
- 仅针对今年的数据插入表中,并单独更新以添加去年的数据。手术耗时 20 分钟。
- 具有 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 - 您的企业应该能够更深入地了解他们的流程。