Oracle中是否有替代游标以提高性能?

时间:2015-09-18 20:40:03

标签: oracle oracle11g oracle12c

我有以下查询,它截断特定架构中的特定表。没有游标,有更好的选择吗?由于架构很大,此查询需要几分钟才能执行。

DECLARE TYPE cur_typ IS REF CURSOR;
c           cur_typ;
qry_str   VARCHAR2(1000);
table_name    VARCHAR2(50);    
BEGIN
qry_str := \'SELECT TABLE_NAME FROM USER_ALL_TABLES
    WHERE (TABLE_NAME like \'\'STG_%\'\'
      OR TABLE_NAME like \'\'S_%\'\' )\';

OPEN c FOR qry_str;
LOOP
    FETCH c INTO table_name;
    EXIT WHEN c%NOTFOUND;
    EXECUTE IMMEDIATE \'TRUNCATE TABLE \' || table_name; 
END LOOP;
CLOSE c;

你们有没有更快的选择? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

如果有多个表,则TRUNCATE比查询更重要。这是DDL,非常沉重的陈述。

答案 1 :(得分:2)

您是否尝试过内联游标?

 BEGIN
    FOR row in (
        SELECT TABLE_NAME FROM USER_ALL_TABLES
         WHERE TABLE_NAME like 'STG_%'
            OR TABLE_NAME like 'S_%'
    ) LOOP
        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || row.table_name; 
    END LOOP;
END;

这并没有摆脱光标,只是隐藏在封面下,但更具可读性。如果您发现性能问题,请尝试调整查询。

答案 2 :(得分:-2)

您可以使用FORALL。 您还可以将要截断的表存储在单独的表中,而不查询字典表。