我遇到了一个问题,到目前为止我无法找到答案。 有没有办法从oracle表中使用sql或pl / sql读取blob文件并测量读取时间?我的意思是喜欢阅读整本,我不需要它显示在任何地方。我发现的只是阅读4000字节的文件,但这还不够。 对于导入,简单 sqlplus中的SET TIMING ON和OFF选项,但是使用tab on tablle只提供了一小部分文件而且无论它有多大,它总是需要相同的时间。 有人帮忙吗?
答案 0 :(得分:0)
我猜你已经有了访问BLOB数据的解决方案。要获得时间,请在DBMS_UTILITY.GET_TIME
代码中的步骤之前和之后使用PL/SQL
。您可以声明两个变量start_time
和end_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更有效。所以你的“阅读它的时间”有点灵活......