如何解决实时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 中没有使用过它。
我正在尝试创建一个接近实时的 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 中没有使用过它。