如何解决实时dwh删除过程?

How to solve a real time dwh delete process?

我正在尝试创建一个接近实时的 dwh。我的第一次尝试是每 15 分钟从我的 DWH 加载一个 table 到我的应用程序中。

我想避免近实时 DWH 可能面临的所有可能问题。其中一个问题是查询显示多选 html 标记值的空 table。

为了解决这个问题,我想到了以下解决方案,但我不知道是否存在解决此类问题的标准。

我创建了一个这样的 table 来保存多选的可能值:

CREATE TABLE providers (
    provider_id INT PRIMARY KEY,
    provider_name VARCHAR(20) NOT NULL,
    delete_flag INT NOT NULL
)

在插入之前,我像这样更新 table:

UPDATE providers set my_flag=1

我使用这样的 ETL 过程插入行:

INSERT INTO providers (provider_name, delete_flag) VALUES ('Provider1',0)

在我的应用程序中,我这样查询 table:

SELECT DISTINCT provider_name FROM providers

虽然应用程序仍在运行并选择所有提供者而没有重复(来源可以删除、添加或更新一个提供者,所以我总是必须更新尊重来源)并且没有显示错误,因为 table是空的 我可以 运行 这个语句就在插入语句之后:

DELETE FROM providers WHERE delete_flag=1

我认为这对于小的 table 或大的 table 来说是一个很好的解决方案,几乎没有变化,但是当 table 很大时会发生什么?是否存在解决此类问题的标准?

我们不能拿用户的可用性冒险,因为我们正在更新数据。

有两种方法可以在不进行会中断查询的维护 window 的情况下发布维度的批量更改。

第一个使用事务概念很简单,但对大数据的表现很差。

DELETE the replaced dimension records
INSERT the new or changed dimension records
COMMIT;

请注意,您不需要逻辑 DELETE 标志,因为更改仅在 COMMIT 之后可见 - 因此 table 永远不会为空。

如前所述,如果您的尺寸较大且有很多更改,则此方法不适合table。在这种情况下,您可以使用 MySQL 5.6

EXCHANGE PARTITION 功能

您定义了一个临时的 table,其结构与您的维度 table 相同,仅用一个包含所有数据的分区进行分区。

CREATE TABLE dim_tmp (
    id INT NOT NULL,
    col1 VARCHAR(30),
    col2 VARCHAR(30)
)
    PARTITION BY RANGE (id) (
        PARTITION pp VALUES LESS THAN (MAXVALUE)
);

使用完整的新维度定义填充 table,并将此临时 table 切换为您的维度 table。

 ALTER TABLE dim_tmp EXCHANGE PARTITION pp WITH TABLE dim;

在此语句之后,来自临时 table 的数据将存储(发布)在您的维度 table(新定义)中,维度的旧状态将存储在临时 table.

请查看上面的文档 link 了解此功能的限制条件。

免责声明:我在 Oracle DB 中使用了这个特性,但我在 MySQL 中没有使用过它。