我有一个脚本,它会导入许多文本文件,处理这些文件并将数据保存到Oracle数据库中。它还将原始数据文件的副本保存到一个BLOB列中。在导入72个文件时,每个文件中包含大约40,000行数据(每个文件大小约为3.5Mb),脚本需要超过一分钟才能执行完毕。
使用xdebug对脚本进行分析后,发现调用OCI-Lob::save所需的时间最长(约90%)。下面是我使用的PHP代码来保存BLOB——我认为这是相当标准的:
使用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字段的一些参数。这些设置中是否有任何可以更改以使其更有效?