【发布时间】:2021-01-15 12:05:08
【问题描述】:
我必须比较表和视图中可用的日期列,表中任何缺失的日期都会从视图中添加记录。表和视图都有 1 亿条数据。我已经编写了下面的代码,但是要迭代超过 400K 行,表格和视图每个需要 2 小时。想知道我是否可以改进我的代码进行比较。请不要问我为什么要从视图中添加记录到表中,这是一个有点复杂的设置,我无能为力。
注意-
- 我必须为大约 100 多张桌子运行这个。
- 不同的表格/视图有不同的日期格式。但我们将与之进行比较的表和相应视图保持不变。
- 在某些表中存在无效日期,应忽略这些记录。如果异常仍在继续,我通过在代码中使用 TO_DATE 函数来实现这一点。
- 每个表/视图的日期格式都保存在 MASTER 表中。
不包括使用 BEGIN 和 DECLARE 读取 MASTER 表的初始代码
query_str := 'select DISTINCT ' || date_column_name || ' as DATM FROM ' || tablename;
OPEN c_query FOR query_str;
LOOP
BEGIN
FETCH c_query INTO dateval;
EXIT WHEN c_query%notfound;
tmp := TO_DATE(
dateval,
dateformat
);
tabledatelist(dateval) := 'Date Val';
EXCEPTION
WHEN OTHERS THEN
continue;
END;
END LOOP;
CLOSE c_query;
query_str := 'select DISTINCT ' || date_column_name || ' as DATM FROM ' || viewname;
OPEN c_query FOR query_str;
LOOP
BEGIN
FETCH c_query INTO dateval;
EXIT WHEN c_query%notfound;
tmp := TO_DATE(
dateval,
dateformat
);
IF
NOT tabledatelist.EXISTS(dateval)
THEN
-- Code to add missing records. Using it as Insert into select col_name from table.
END IF;
EXCEPTION
WHEN OTHERS THEN
continue;
END;
END LOOP;
CLOSE c_query;
【问题讨论】:
-
您不应该将日期存储在
varchar列中。在继续之前,您是否有机会修复损坏的设计。