值得使用临时表来复制行的开销吗?

dpa*_*ery 3 sql oracle performance plsql

当面对在数据库中复制记录并仅修改少量值的任务时,我倾向于使用临时表来避免写出所有未更改的列.有谁知道这会如何影响大型系统的性能?

一个简单的例子(也说明了为什么我更喜欢临时表方法):

比方说,我有一个表mytbl有50列col1... col50.我想插入一个新记录,该记录与col5 = 'Some Value'除了col45将被设置为的行之外的行完全重复'Some other value'.

方法1

CREATE GLOBAL TEMPORARY TABLE tmptbl AS
  SELECT * FROM myschema.mytbl;

INSERT INTO tmptbl
  (SELECT *
   FROM myschema.mytbl
   WHERE mytbl.col5 = 'Some Value');

UPDATE tmptbl
SET col45 = 'Some Other Value';

INSERT INTO myschema.mytbl
  (SELECT * FROM tmptbl);

DROP TABLE tmptbl;
Run Code Online (Sandbox Code Playgroud)

方法2

INSERT INTO myschema.mytbl (col1,
                            col2,
                            col3,
                            col4,
                            col5,
                            col6,
                            col7,
                            col8,
                            col9,
                            col10,
                            col11,
                            col12,
                            col13,
                            col14,
                            col15,
                            col16,
                            col17,
                            col18,
                            col19,
                            col20,
                            col21,
                            col22,
                            col23,
                            col24,
                            col25,
                            col26,
                            col27,
                            col28,
                            col29,
                            col30,
                            col31,
                            col32,
                            col33,
                            col34,
                            col35,
                            col36,
                            col37,
                            col38,
                            col39,
                            col40,
                            col41,
                            col42,
                            col43,
                            col44,
                            col45,
                            col46,
                            col47,
                            col48,
                            col49,
                            col50)
SELECT col1,
       col2,
       col3,
       col4,
       col5,
       col6,
       col7,
       col8,
       col9,
       col10,
       col11,
       col12,
       col13,
       col14,
       col15,
       col16,
       col17,
       col81,
       col19,
       col20,
       col21,
       col22,
       col23,
       col24,
       col25,
       col26,
       col27,
       col28,
       col29,
       col30,
       col31,
       col32,
       col33,
       col34,
       col35,
       col36,
       col37,
       col38,
       col39,
       col40,
       col41,
       col42,
       col43,
       col44,
       'Some Other Value',
       col46,
       col47,
       col48,
       col49,
       col50
FROM myschema.mytbl
WHERE col5 = 'Some Value';
Run Code Online (Sandbox Code Playgroud)

创建/删除临时表会产生多少开销?例如,如果这是生产规模系统的日常流程的一部分,那么额外的开销是否会引人注目?我意识到这在很大程度上取决于系统的细节,但一般的想法会很棒.

APC*_*APC 10

首先,这不是临时表在Oracle中的工作方式.全局临时表是永久性结构,它只是临时表中的数据.因此,无需为每个操作创建和删除表.这只会增加开销.

其次,临时表合理的情况实际上非常罕见.在大多数情况下,一个简单的变量就足够了.此语法(插入单行)从9iR2开始有效:

declare
    lrec emp%rowtype;
begin
    select *
    into lrec
    from emp
    where empno = 1234;

    lrec.empno = 9999;
    lrec.sal = 5000;

    insert into emp values lrec;
end;
Run Code Online (Sandbox Code Playgroud)

请注意,此配方中不需要括号.