我正在尝试创建一个近乎实时的dwh。我的第一次尝试是每隔15分钟从DWH将表格加载到我的应用程序中。
我想避免近乎实时的DWH可能遇到的所有问题。其中一个问题是查询一个空表,该表显示了多选html标记的值。
为了解决这个问题,我想到了以下解决方案,但我不知道是否存在解决此类问题的标准。
我创建了一个这样的表来保存多选的可能值:
CREATE TABLE providers (
provider_id INT PRIMARY KEY,
provider_name VARCHAR(20) NOT NULL,
delete_flag INT NOT NULL
)
在插入之前,我更新了这样的表:
UPDATE providers set my_flag=1
我使用ETL过程插入行,如下所示:
INSERT INTO providers (provider_name, delete_flag) VALUES ('Provider1',0)
从我的应用程序中我查询表格如下:
SELECT DISTINCT provider_name FROM providers
虽然应用程序仍在工作并选择所有提供程序没有重复(源可以删除,添加或更新一个提供程序,所以我总是必须更新尊重源)并且没有显示错误,因为表是空的我可以运行此在insert语句之后的语句:
DELETE FROM providers WHERE delete_flag=1
我认为对于小型表或几乎没有变化的大表,这是一个很好的解决方案,但是当表很大时会发生什么?是否存在一些标准来解决这类问题?
我们不能冒用户使用的风险,因为我们正在更新数据。
答案 0 :(得分:1)
有两种方法可以公开批量更改,而不会使维护窗口中断查询。
第一个使用事务概念很简单,但对大数据执行不好。
DELETE the replaced dimension records
INSERT the new or changed dimension records
COMMIT;
请注意,您不需要逻辑DELETE
标记,因为更改仅在COMMIT
之后可见 - 因此表永远不会为空。
如前所述,如果您的维度较大且需要进行大量更改,则此方法不适用。在这种情况下,您可以使用MySQL 5.6中的EXCHANGE PARTITION功能
您定义一个临时表,其结构与您的维度表相同,只有一个分区包含所有数据。
CREATE TABLE dim_tmp (
id INT NOT NULL,
col1 VARCHAR(30),
col2 VARCHAR(30)
)
PARTITION BY RANGE (id) (
PARTITION pp VALUES LESS THAN (MAXVALUE)
);
使用完整的新维度定义填充表格,并使用维度表格切换此临时表格。
ALTER TABLE dim_tmp EXCHANGE PARTITION pp WITH TABLE dim;
在此语句之后,临时表中的数据将存储(发布)到维度表(新定义)中,维度的旧状态将存储在临时表中。
请查看上面的文档链接,了解此功能的限制。
免责声明:我在Oracle DB中使用此功能,我在MySQL中没有使用它。