Oracle - 使用sql测量读取blob文件的时间

时间:2014-10-23 15:12:25

标签: sql oracle plsql blob

我遇到了一个问题,到目前为止我无法找到答案。 有没有办法从oracle表中使用sql或pl / sql读取blob文件并测量读取时间?我的意思是喜欢阅读整本,我不需要它显示在任何地方。我发现的只是阅读4000字节的文件,但这还不够。 对于导入,简单 sqlplus中的SET TIMING ON和OFF选项,但是使用tab on tablle只提供了一小部分文件而且无论它有多大,它总是需要相同的时间。 有人帮忙吗?

2 个答案:

答案 0 :(得分:0)

我猜你已经有了访问BLOB数据的解决方案。要获得时间,请在DBMS_UTILITY.GET_TIME代码中的步骤之前和之后使用PL/SQL。您可以声明两个变量start_timeend_time来捕获相应的时间,然后只需减去它们即可获得该步骤所用的时间。

以此为例http://www.oracle-base.com/articles/11g/plsql-new-features-and-enhancements-11gr1.php

答案 1 :(得分:0)

不太确定你想要实现的目标,但是你可以使用dbms_utility.get_time在PL / SQL块中获得一些时间,如LalitKumarB所建议的那样。初始选择(几乎)是即时的,它正在读取或处理真正可测量的数据。这是读取具有三种不同“块”大小的blob,以显示它所产生的差异:

set serveroutput on
declare
  l_start number;
  l_blob blob;
  l_byte raw(1);
  l_16byte raw(16);
  l_kbyte raw(1024);
begin
  l_start := dbms_utility.get_time;
  select b into l_blob from t42 where rownum = 1; -- your own query here obviously
  dbms_output.put_line('select: '
    || (dbms_utility.get_time - l_start) || ' hsecs');

  l_start := dbms_utility.get_time;
  for i in 1..dbms_lob.getlength(l_blob) loop
    l_byte := dbms_lob.substr(l_blob, 1, i);
  end loop;
  dbms_output.put_line('single byte: '
    || (dbms_utility.get_time - l_start) || ' hsecs');

  l_start := dbms_utility.get_time;
  for i in 1..(dbms_lob.getlength(l_blob)/16) loop
    l_16byte := dbms_lob.substr(l_blob, 16, i);
  end loop;
  dbms_output.put_line('16 bytes: '
    || (dbms_utility.get_time - l_start) || ' hsecs');

  l_start := dbms_utility.get_time;
  for i in 1..(dbms_lob.getlength(l_blob)/1024) loop
    l_kbyte := dbms_lob.substr(l_blob, 1024, i);
  end loop;
  dbms_output.put_line('1024 bytes: '
    || (dbms_utility.get_time - l_start) || ' hsecs');
end;
/

对于提供类似以下内容的示例blob:

anonymous block completed
select: 0 hsecs
single byte: 950 hsecs
16 bytes: 61 hsecs
1024 bytes: 1 hsecs

如此清楚地阅读更大块的blob更有效。所以你的“阅读它的时间”有点灵活......