【问题标题】:MS SQL Trigger for ETL vs PerformanceETL 与性能的 MS SQL 触发器
【发布时间】:2018-01-24 12:25:28
【问题描述】:

我需要信息对生产数据库的影响为大约 30 个生产表创建触发器,这些表捕获任何更新、删除和插入语句并输入以下信息“PK”、“表名", "修改时间" 到单独的表。
我的测试能力有限,因为我对 Prod 和 Test 环境都有只读权限(我可以在一个工作日内让 10 个最终用户对其进行测试)。
我估计从这些触发器插入的记录数每天约为 150-200k。
背景: 我有一个项目为非常定制的数据库部署数据仓库+每天都在运行操作数据的作业。更新日期列未维护(自定义)+ 表上发生硬删除。我们决定要求开发团队添加触发器,例如:

 CREATE TRIGGER [dbo].[triggerName] ON [dbo].[ProductionTable]
    FOR INSERT, UPDATE, DELETE 
    AS

    INSERT INTO For_ETL_Warehouse (Table_Name, Regular_PK, Insert_Date)
    SELECT 'ProductionTable', PK_ID, GETDATE() FROM inserted

    INSERT INTO For_ETL_Warehouse (Table_Name, Regular_PK, Insert_Date)
    SELECT 'ProductionTable', PK_ID, GETDATE() FROM deleted

在核心约 30 个生产表上。 基于此表,我们将提取过去 24 小时的增量并将其推送到数据仓库临时表。

如果有人遇到类似问题并能帮助我估计它如何影响生产数据库的性能,我将不胜感激。 (如果它有效 - 我得救了,如果不是我需要提出其他解决方案。目前镜像或复制可能很难获得,因为本地 DEV 不知道如何设置它......) 欢迎提出如何处理这种情况或执行测试的其他想法(我的截止日期是星期五 26-01)。

【问题讨论】:

  • 我们有一些触发器,它们在更新/插入的记录中更新修改日期,并将删除的记录 PK 插入单独的表中。 IMO 的开销要少一些。
  • 如果您在旧版本中使用 SQL 2016 SP1+ 或企业版,请考虑使用Change Data Capture 而不是触发器。触发器方法的性能和存储影响将在很大程度上取决于可用的服务器资源,但恕我直言,每天 200K 并不太重要。
  • 感谢 Arvo 和 Dan,生产:Microsoft SQL Server 2014 (SP2-CU6) (X64) - 企业版 数据仓库:Microsoft SQL Server 2016 (SP1) Enterprise Edition (64-bit) CDC:它需要更多的开发人员参与,这是一个障碍。如果触发器失败将尝试推动这个方向。
  • CDC 专为您想要完成的任务而设计。我会认真研究并重新考虑您的选择,因为从长远来看,您可能会节省大量资金。
  • 您可能需要考虑将此问题移至DBA 以获得性能建议。

标签: sql-server database triggers etl data-warehouse


【解决方案1】:

首先,我建议您将表名编码为一个较小的变量,而不是一个字符(30 个表 => tinyint)。

其次,您需要了解您要编写的有效负载有多大以及如何编写:

  1. 如果您选择了正确的聚集索引(日期列),那么服务器只需按顺序逐行输出数据。即使您一次放置所有 200k 行,这也是一项简单的工作。

  2. 如果你将表名编码为tinyint,那么基本上它必须写:

    • 1 字节(表名)+ PK 大小(希望是数字,所以
  3. 触发器本身会增加一点开销,但就您所说的行数而言,它可以忽略不计。

我看到系统以更大规模的方式做类似的事情,对工作流程的影响接近 0,所以我会说这是一个安全的赌注。这种方法的唯一问题是它在某些情况下不起作用(例如:从 DML 语句输出到临时表)。但如果你没有这些类型的拦截器,那就去吧。

希望对你有帮助。

【讨论】:

  • 这肯定会有所帮助,谢谢!不幸的是,这不像您在第 2 点中描述的那样好,因为表格看起来像这样:(i.imgur.com/4mqhCpv.jpg) 大多数触发器只更新了 3 个值(c1、c2 和 c8),但有时更新了 c1、c3、c4 和 c8。这是因为“复合 PK”(这些表上没有 PK:/)
  • 最后,一切都取决于测试。但是根据您描述的更改数量,应该没有问题。尺寸计算也可以由您完成并查看。但仍然 .. 那是 10 - 20 - 30 字节 .. 这仍然不是问题
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 2013-12-11
  • 2016-05-08
  • 2013-07-16
  • 2020-07-27
  • 2022-09-22
  • 2021-08-07
  • 2013-08-11
相关资源
最近更新 更多