MS SQL ETL 与性能的触发器

MS SQL Trigger for ETL vs Performance

我需要的信息可能是生产数据库的影响 为 ~30 个生产 table 创建触发器以捕获任何更新、删除和插入语句以及把下面的信息 "PK", "Table Name", "Time of modification" 分开 table.
我测试它的能力有限,因为我对生产环境和测试环境都只有只读权限(我可以让 10 个最终用户在一个工作日内测试它)。
我估计从这些触发器插入的记录数将约为 ~150-200k 每天.
背景: 我有一个项目要为非常定制的数据库部署数据仓库 + 每天都有作业 运行 来处理数据。更新日期列未维护(自定义)+ tables 上发生硬删除。我们决定要求开发团队添加触发器,例如:

 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 生产 tables。 基于此 table 我们将从过去 24 小时中提取增量并将其推送到数据仓库暂存 tables。

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

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

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

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

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

    • 1 字节(table 名称)+ PK 大小(希望是数字,所以 <= 8 字节)+ 8 字节日期时间 - 所以数据页上大约 17 字节 + 索引(如果有)+ 日志文件。这是非常轻量级的,不会对 sql 服务器施加 "real" 压力。
  3. 触发器本身会增加一些开销,但是根据您所说的行数,可以忽略不计。

我看到系统在更大范围内做类似的事情,对工作流程的影响接近于 0,所以我认为这是一个安全的选择。这种方法的唯一问题是它在某些情况下不起作用(例如:从 DML 语句输出到 temp tables)。但如果你没有这些阻滞剂,那就去吧。

希望对您有所帮助。