如何提高 PHP OCI-Lob::save 的性能

3
我有一个脚本,它会导入许多文本文件,处理这些文件并将数据保存到Oracle数据库中。它还将原始数据文件的副本保存到一个BLOB列中。在导入72个文件时,每个文件中包含大约40,000行数据(每个文件大小约为3.5Mb),脚本需要超过一分钟才能执行完毕。
使用xdebug对脚本进行分析后,发现调用OCI-Lob::save所需的时间最长(约90%)。下面是我使用的PHP代码来保存BLOB——我认为这是相当标准的:
$this->_db->setSQL('INSERT INTO IMPORTED_FILES (FILE_BLOB, FILE_NAME, LAST_MODIFIED_DATE, IMPORTED_BY, IMPORTED_DATE) VALUES
                        (EMPTY_BLOB(), :fileName, :lastMod, :userId, SYSDATE) RETURNING FILE_BLOB INTO :fileBlob');
    $blob = \oci_new_descriptor($this->_db->con);
    $this->_db->bind(":fileBlob",$blob,-1,OCI_B_BLOB);
    $this->_db->bind(':fileName',$this->_name);
    $this->_db->bind(':lastMod',$this->_lastModifiedDate);
    $this->_db->bind(':userId',$_SESSION['userid']);
    $this->_db->execute(false);
    $blob->save($this->_contents);

表定义如下:

CREATE TABLE IMPORTED_FILES
  (
    "FILE_ID" NUMBER(*,0) NOT NULL ENABLE,
    "FILE_BLOB" BLOB NOT NULL ENABLE,
    "FILE_NAME"          VARCHAR2(255 CHAR) NOT NULL ENABLE,
    "LAST_MODIFIED_DATE" VARCHAR2(255 CHAR) NOT NULL ENABLE,
    "IMPORTED_BY"        VARCHAR2(255 CHAR) NOT NULL ENABLE,
    "IMPORTED_DATE" DATE NOT NULL ENABLE,
    "REPORT" CLOB,
    CONSTRAINT "IMPORTED_FILES_PK" PRIMARY KEY ("FILE_ID") USING INDEX
    TABLESPACE "DATA_INDEX" ENABLE
  )

有没有办法使保存BLOB更快?

更新

不确定是否有帮助,但我在SQL Developer中找到了以下窗口,显示有关BLOB字段的一些参数。这些设置中是否有任何可以更改以使其更有效?

enter image description here

1个回答

1

(这更像是一条扩展评论,而不是答案。)

第一步,也往往是最困难的一步,是找到具体缓慢的地方。以下代码仅在数据库中运行,将告诉您编写数据的最佳情况。

drop table test1;
create table test1(a clob);

--Time to write 72 3.5MB CLOBs.
--On my old desktop this runs in about 15 seconds.
declare
    v_clob clob := 'A';
begin
    --Create a 3.5MB LOB.
    for i in 1 .. 350 loop
        dbms_lob.append(v_clob, lpad('a',10000, 'a'));
    end loop;

    for i in 1 .. 72 loop
        insert into test1 values (v_clob);
    end loop;
    commit;
end;
/

如果该代码运行时间远远少于一分钟,则数据库可能不是问题所在 - 更仔细地查看PHP或查看网络。 如果该代码运行时间接近一分钟,请进一步深入并找到语句正在等待的确切内容。 像这样的查询可能是一个很好的开始:
select event, v$active_session_history.*
from v$active_Session_history
where sql_id = 'ghwdpz6v9k2cj'
order by sample_time desc;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接