在Teradata中结束事务后是否需要提交?
我有一个存储过程,它从表中读取行,对每行进行一些计算,并将结果存储在同一行中 当我需要处理一百万行时,所有的更新都会填满DBC数据库,所以我想在1000行计算之后进行提交 我需要使用事务吗?我需要使用提交吗? 提交工作做什么 我在TERA模式下执行所有操作,版本为15.00 这是我简化程序的一个示例:在Teradata中结束事务后是否需要提交?,teradata,Teradata,我有一个存储过程,它从表中读取行,对每行进行一些计算,并将结果存储在同一行中 当我需要处理一百万行时,所有的更新都会填满DBC数据库,所以我想在1000行计算之后进行提交 我需要使用事务吗?我需要使用提交吗? 提交工作做什么 我在TERA模式下执行所有操作,版本为15.00 这是我简化程序的一个示例: -- Creates a sample table --DROP TABLE DM_CALIDAD.RGR_TEST_PROCEDURE; CREATE MULTISET TABLE DM_CAL
-- Creates a sample table
--DROP TABLE DM_CALIDAD.RGR_TEST_PROCEDURE;
CREATE MULTISET TABLE DM_CALIDAD.RGR_TEST_PROCEDURE AS(
SELECT T.TABLENAME AS "TABLE_NAME", 0(INTEGER) AS IND_NAME FROM DBC.TABLESV T
)WITH DATA
;
--Creates the procedure
REPLACE PROCEDURE DM_CALIDAD.SP_TEST_NAME()
BEGIN
DECLARE V_TABLE_NAME VARCHAR(256) DEFAULT NULL;
DECLARE V_CALC INTEGER;
DECLARE SQL_CURSOR1, SQL_UPDATE VARCHAR(10000) DEFAULT NULL;
DECLARE CONT INTEGER DEFAULT NULL;
DECLARE CUR_CURSOR1 CURSOR FOR PREP_CURSOR1;
SET SQL_CURSOR1 = 'SELECT TABLE_NAME FROM DM_CALIDAD.RGR_TEST_PROCEDURE';
SET CONT = 1;
PREPARE PREP_CURSOR1 FROM SQL_CURSOR1;
OPEN CUR_CURSOR1;
BEGIN TRANSACTION;
l_loop:
LOOP
FETCH CUR_CURSOR1 INTO V_TABLE_NAME;
IF (SQLCODE <> 0) THEN
LEAVE l_loop;
END IF;
SET SQL_UPDATE = 'UPDATE DM_CALIDAD.RGR_TEST_PROCEDURE SET IND_NAME = IND_NAME+1 WHERE TABLE_NAME = ''' ||V_TABLE_NAME || '''';
EXECUTE IMMEDIATE SQL_UPDATE;
-- Ends the transacion each 1000 updates
SET CONT = CONT + 1;
IF (CONT MOD 1000 = 0) THEN
END TRANSACTION;
--COMMIT WORK;
BEGIN TRANSACTION;
END IF;
END LOOP l_loop;
END TRANSACTION;
CLOSE CUR_CURSOR1;
END;
-- Calls procedure
CALL DM_CALIDAD.SP_TEST_NAME();
因此,对于每一行,我读取列first_event和列last_event,并计算差6-1=5天,然后计算B的休假天数
在日期“2019-02-01”和日期“2019-02-06”之间选择COUNT*FROM Festival_TABLE,其中CITY='B'和Festival,返回3天,然后我将其减去5天06天01天=5天,5天3天Festival=2天
所以劳动日的数量是2,然后我用计算出的值更新该行
我已经检查了DBC数据库的perm空间,它有1962GBytes
再次感谢:有一种非常简单的方法,可以在不使用循环/计数/等的情况下计算工作日或节假日天数,它基于日历表中计算的工作日数列。在您的情况下,它稍微复杂一些,因为您需要多个日历,每个城市一个 因此,让我们在视图中计算它,或者使用公共表表达式,将my_cal作为SELECT…: 现在只需在开始日期/结束日期进行两次联接,然后计算差值
SELECT ...
end_cal.business_day_num - start_cal.business_day_num AS duration_in_business_days
FROM mytable
JOIN my_cal AS start_cal
ON mytable.city = start_cal.city
AND mytyble.first_event = start_cal.caldt
JOIN my_cal AS end_cal
ON mytable.city = end_cal.city
AND mytyble.first_event = end_cal.caldt
关于DBC,当你说所有的更新都填满了DBC数据库时,你是说临时日志吗?嗯,如果系统上有可用空间,那么它可以比dbc大得多
但是dbc的2TB Perm空间非常低,除非您的系统非常小,目标表有多大以及更新的行的百分比是多少?我尽量避免存储过程,所以可能我遗漏了一些东西,但是在这里使用游标的价值是什么?提交必须在ANSI模式会话中使用,在Teradata模式下,它是开始/结束事务。你想用光标处理一百万行吗?哎哟几乎没有理由按顺序处理数据,在像Teradata这样的并行DBMS中,这是最糟糕的情况。我很难相信处理几百万行就能填满DBC,你能添加更多的细节吗?Andrew,这只是开始/结束事务的一个例子@dnoeth,我已经对这个问题做了更详细的预测,关于我真正想做的事情。我创建了一个新表,列出了所有城市3万个连续3年的工作日,我使用标量子查询来计算每次交付所需的值。感谢您的想法:关于系统,我们总共有72安培和11 TB的perm空间。一个平均的teradata系统能有多大?请注意标量子查询,该计划可能比连接更糟糕,请检查并解释。11个中有2 TB是可以的。我不知道一般的系统,但大的是PBs
REPLACE VIEW my_cal AS
SELECT c.*,
-- running business day number
-- increases only for each business day
Sum(CASE WHEN f.festive IS NULL THEN 1 ELSE 0 end)
Over (PARTITION BY c.city
ORDER BY c.caldt
ROWS Unbounded Preceding) AS business_day_num
FROM
( -- this simply create all dates for each city
SELECT *
FROM
( -- all cities
SELECT DISTINCT city
FROM festivetable
) AS f
CROSS JOIN
( -- all dates
SELECT calendar_date AS caldt
FROM sys_calendar.CALENDAR AS c -- you should use your company's calendar instead
WHERE caldt BETWEEN DATE '2018-10-01' AND DATE '2019-02-28'
) AS c
) AS c
LEFT JOIN festivetable AS f
ON c.city = f.city
AND c.caldt = f.festive;
SELECT ...
end_cal.business_day_num - start_cal.business_day_num AS duration_in_business_days
FROM mytable
JOIN my_cal AS start_cal
ON mytable.city = start_cal.city
AND mytyble.first_event = start_cal.caldt
JOIN my_cal AS end_cal
ON mytable.city = end_cal.city
AND mytyble.first_event = end_cal.caldt