SYSDATE和变量INSERT语句之间的性能差异

时间:2016-09-15 17:18:59

标签: sql oracle plsql oracle-sqldeveloper

我目前设置了一个程序......

For rec in main_cursor LOOP
   INSERT INTO table_name VALUES( rec.value, SYSDATE);
END LOOP;

最好先将sysdate分配给变量,即

var_date := SYSDATE;
For rec in main_cursor LOOP
    INSERT INTO table_name VALUES( rec.value, var_date);
END LOOP;

在我的情况下,它只会做大约10k次,但如果我将其缩放到一个非常大的数据集呢?

此外,我如何自己去寻找这个问题的答案?我可以创建两个测试程序,但即使运行相同的程序两次也会给出一个可变的执行时间(取决于缓存,其他人使用数据库?)。我正在使用SQLDeveloper。

2 个答案:

答案 0 :(得分:3)

这两种方法会产生不同的结果,因此优先级应该是正确的。

如果单个统一值是可接受的,那么它会更快,尽管我不希望重复检查系统时间会产生巨大的开销。

我会在没有INSERT语句的情况下进行测试,也可能会进行一些测试运行。

答案 1 :(得分:3)

虽然您可能会以第一次和最后一次插入之间的绝对时间戳准确性为代价获得一些轻微的性能提升,但如果您真的想提高性能,那么您应该看看是否可以避免循环,而是编写单个批量代码插入使用驱动main_Cursor的相同查询

插入table_name(选择..... from);

或者使用main_cursor进行批量收集提取,然后使用FORALL进行批量插入。

当然,这可能是不可能的,如果你循环正在做其他需要迭代任务的事情,而我不知道你的代码到底做了什么。但除非你处理数百万行,否则我非常怀疑你调用sysdate的方式会对你的时间产生巨大影响。