在Teradata中结束事务后是否需要提交?

在Teradata中结束事务后是否需要提交?,teradata,Teradata,我有一个存储过程,它从表中读取行,对每行进行一些计算,并将结果存储在同一行中 当我需要处理一百万行时,所有的更新都会填满DBC数据库,所以我想在1000行计算之后进行提交 我需要使用事务吗?我需要使用提交吗? 提交工作做什么 我在TERA模式下执行所有操作,版本为15.00 这是我简化程序的一个示例: -- Creates a sample table --DROP TABLE DM_CALIDAD.RGR_TEST_PROCEDURE; CREATE MULTISET TABLE DM_CAL

我有一个存储过程,它从表中读取行,对每行进行一些计算,并将结果存储在同一行中

当我需要处理一百万行时,所有的更新都会填满DBC数据库,所以我想在1000行计算之后进行提交

我需要使用事务吗?我需要使用提交吗? 提交工作做什么

我在TERA模式下执行所有操作,版本为15.00

这是我简化程序的一个示例:

-- 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