【问题标题】:Whats the performance of querying in dual on Oracle 11gOracle 11g 上双重查询的性能如何
【发布时间】:2016-05-03 23:51:54
【问题描述】:

我试图访问数据库的时间和时区。我的查询是:

select sysdate from dual

select systimestamp from dual

查询这些的性能开销是多少?我确实明白,在 10g 之前这些都是昂贵的,并且从 11 开始它们将在内存中。这些会在 00:00:01 运行吗?

【问题讨论】:

  • “这些会在 00:00:01 运行吗” - 这是一个不寻常的问题。为什么要问?

标签: sql oracle select oracle11g oracle10g


【解决方案1】:

我不会为此烦恼。肯定很快。

一个想法是测量它。因为快,我们做10000次,测一下时间:

declare
t number;
d date;
begin

  t:=dbms_utility.get_time();
  for k in 1..10000 loop
    select sysdate into d from dual;
  end loop;
  dbms_output.put_line(dbms_utility.get_time() - t);
end;
/

在我的机器上(使用 oracle 11.2.0.4)这输出 16,所以 16 毫秒 10000 次,这意味着每次操作 0.000016 秒。

编辑:从 dual 中选择 1 更快,以上返回 13 毫秒。 systimestamp 比 sysdate 慢一点,为 17。

【讨论】:

    【解决方案2】:

    我窃取了@FlorinGhita 的代码并将其更改为:

    declare
      t number;
      d date;
    begin
      t := dbms_utility.get_time();
    
      for k in 1..10000 loop
        select sysdate into d from dual;
      end loop;
    
      dbms_output.put_line(dbms_utility.get_time() - t);
    
      t := dbms_utility.get_time();
    
      for k in 1..10000 loop
        d := SYSDATE;
      end loop;
    
      dbms_output.put_line(dbms_utility.get_time() - t);
    end;
    

    因为我想将执行 SELECT 所需的时间与执行直接分配所需的时间进行对比。

    上述五次运行的结果是

    SELECT    Assignment
    73        6
    84        6
    74        6
    74        6
    74        5
    

    接下来,我的想法是,首先使用 SELECT 语句可能会产生开销 - 所以我对其进行了更改,以便首先完成分配循环,然后是 SELECT 循环:

    declare
      t number;
      d date;
    begin
      t := dbms_utility.get_time();
    
      for k in 1..10000 loop
        d := SYSDATE;
      end loop;
    
      dbms_output.put_line(dbms_utility.get_time() - t);
    
      t := dbms_utility.get_time();
    
      for k in 1..10000 loop
        select sysdate into d from dual;
      end loop;
    
      dbms_output.put_line(dbms_utility.get_time() - t);
    end;
    

    上面的五次运行给出了:

     Assignment    SELECT
     5             78
     6             75
     7             72
     6             75
     6             86
    

    如果我正确地阅读了上面的内容,则表明执行 SELECT...FROM DUAL 比直接分配要长 10 倍以上。

    外卖:不要使用SELECT xxxxx INTO zzz FROM DUAL。请改用zzz := xxxxx

    以上时间由 Oracle 11.1 生成

    希望这会有所帮助。

    【讨论】:

    • 不错的测试。这里只有一条评论。更糟糕的时机不是由访问双表引起的,而是由PL和SQL引擎之间的上下文引起的。这同样适用于 a := select seq.nextval from dual; 与纯 a := seq.nextval; 。后者是更新的简化语法。
    • 值得一读 Bob 的帖子:stackoverflow.com/questions/34418779/…
    • @FlorinGhita - 我认为这个当前的问题很有趣,尤其是关于你引用的问题。感谢您记住它。 :-) 我之前没想过将SELECT function INTO variable FROM DUALvariable := function 进行比较,所以这是一个很好的机会。
    【解决方案3】:

    是的,这些是在 11g See this anwser 中实现的一些性能改进。但即使在 10g 中也无需担心性能问题。对该表的访问很可能不会执行任何磁盘 IO(仅进行一次逻辑读取)。

    【讨论】:

      【解决方案4】:

      我正在使用11g

      除了@Florin 的答案,我重复了 10000 行的测试,get_time 两个命令,sysdatesystimestamp

      sysdate 的输出与 Florin、16 相同,但 systimestamp 的输出为 36

      但是当我对100000 行重复它时,输出分别为185197

      所以回答你的问题,使用sysdate 肯定比systimestamp 快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多