Oracle BLOB 提取非常慢

2024-06-25

从我管理的 oracle 10gR2 10.2.05 数据库中提取 BLOBS 时,我遇到性能问题。我有大约 400 个存储为 BLOBS 的文件,我需要将它们写入文件系统。下面是我的代码。当我执行这个过程时,前 8 个左右的文件会在几秒钟内写入,从那里开始,速度会呈指数级下降,在前 8 个文件之后,每 40 秒大约写入 1 个文件。对我来说,这没有任何意义,为什么会这样呢?前 8 个文件速度很快,但之后一切都会变慢。我尝试将其作为存储过程运行,将 UTL_FILE.fopen 更改为“wb”(写入二进制文件),并使用 NFS 安装的文件系统,以免妨碍数据库的性能。这些都没有产生任何影响。按照这个速度,我需要 6 个小时才能提取 400 个文件,每个文件平均大小约为 1.5MB。有谁发现我的代码有什么问题或者知道更好的方法来做到这一点?顺便说一句,我使用了这里找到的示例代码http://www.oracle-base.com/articles/9i/ExportBlob9i.php http://www.oracle-base.com/articles/9i/ExportBlob9i.php作为起点。

谢谢你的帮助!

DECLARE
  TYPE comment_text IS TABLE OF documents.comment_text%TYPE;
  TYPE localdata IS TABLE OF documents.localdata%TYPE;
  l_file UTL_FILE.FILE_TYPE;
  l_buffer RAW(32767);
  l_amount BINARY_INTEGER := 32767;
  l_pos INTEGER := 1;
  l_blob localdata;
  l_fname comment_text;
  l_blob_len INTEGER;
  l_x NUMBER := 1;
BEGIN
  SELECT comment_text, localdata
  BULK COLLECT INTO l_fname, l_blob
  FROM documents
  WHERE user_id='BILLYBOB';
  IF SQL%ROWCOUNT =0 THEN
    DBMS_OUTPUT.PUT_LINE('No records found!');
  ELSE
    FOR i IN l_fname.FIRST .. l_fname.LAST
    LOOP
      l_blob_len := DBMS_LOB.getlength(l_blob(i));
      DBMS_OUTPUT.PUT_LINE(l_blob_len);
      l_file := UTL_FILE.fopen('BLOBS',l_x || '_' || l_fname(i),'w', 32767);
      l_pos := 1;
      l_x := l_x + 1;
      WHILE l_pos < l_blob_len
      LOOP
        DBMS_LOB.read(l_blob(i), l_amount, l_pos, l_buffer);
        UTL_FILE.put_raw(l_file, l_buffer, TRUE);
        l_pos := l_pos + l_amount;
      END LOOP;
      UTL_FILE.fclose(l_file);
    END LOOP;
  END IF;
END;

我很确定您不应该在过程开始时将所有 BLOB 提取到数组中。由于您读取 BLOB 数据并且从未真正关闭任何 lob 定位器,因此 Oracle 必须将所有这些信息保留在内存中。我猜这是内存溢出的情况。

试试这个:

CURSOR cc IS (SELECT ...)
BEGIN
   OPEN cc;
   LOOP
      FETCH cc
         INTO l_fname, l_blob;
      EXIT WHEN cc%NOTFOUND;
      l_blob_len := DBMS_LOB.getlength(l_blob);
      DBMS_OUTPUT.PUT_LINE(l_blob_len);
      l_file := UTL_FILE.fopen('BLOBS', l_x || '_' || l_fname, 'w', 32767);
      l_pos  := 1;
      l_x    := l_x + 1;
      WHILE l_pos < l_blob_len LOOP
         DBMS_LOB.READ(l_blob, l_amount, l_pos, l_buffer);
         UTL_FILE.put_raw(l_file, l_buffer, TRUE);
         l_pos := l_pos + l_amount;
      END LOOP;
      UTL_FILE.fclose(l_file);
   END LOOP;
   CLOSE cc;
END;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle BLOB 提取非常慢 的相关文章

  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 从函数内的 SELECT 返回一个变量

    我正在尝试创建一个返回 varchar 的函数 其中一个字段形成一个选择 即聚合字段 我收到下一个错误 ORA 01422 exact fetch returns more than requested number of rows 我的理
  • DBMS_UTILITY.COMPILE_SCHEMA(schema => '',compile_all => FALSE) 不会编译无效的包体

    的召唤 BEGIN DBMS UTILITY COMPILE SCHEMA schema gt
  • SQL 按 IN 子句中的元素排序

    我有一个ITEM表 我想返回按 IN 子句中通知的相同顺序排序的结果 这些 ID 由用户告知 今天我有这个 SELECT FROM ITEM WHERE ITEM ID IN 45 2 671 6 ORDER BY CASE ITEM ID
  • 如何创建从表中最大值开始的 Oracle 序列?

    尝试在 Oracle 中创建一个以特定表中的最大值开始的序列 为什么这不起作用 CREATE SEQUENCE transaction sequence MINVALUE 0 START WITH SELECT MAX trans seq
  • java.sql.SQLSyntaxErrorException: ORA-00955: 名称已被现有对象使用

    我正在使用 Oracle 11g R2 我想创建一些用户表 当我运行查询时 它创建了几个表并生成java sql SQLSyntaxErrorException ORA 00955 名称已被现有对象使用例外 Connection con p
  • 在行之间随机排列一列

    如何有效地洗牌大型 1m 到 5m 记录 表的内容 已知该列具有唯一值 但您可以假设为此目的删除了所有约束 我的头痛主要是因为我正在更新我选择的同一列 我的目标是使用 PL SQL 来完成此操作 以便我可以以编程方式执行其他操作 例如记录或
  • 如何编写Alter Table并添加新列?

    我有一个表 有 3 列 A B C 其中也有行 A 列是主键 现在 根据新的要求 我需要添加新的 D E 和 F 列 另外 我需要从 A 列中删除以前的主键 并为 D 列添加新的主键 E 列和 F 列为 NULL 请帮助我创建 alter
  • 如何从 pl sql 过程运行 sql 脚本

    我有一个类似的程序 CREATE OR REPLACE PROCEDURE test is BEGIN DBMS OUTPUT PUT LINE This is a Test END 我想运行一些存储在当前目录中的sql脚本 我可以使用 s
  • 如何根据 Oracle 中的动态列表检查 IN 条件?

    编辑 更改标题以适合下面的代码 我试图从 Oracle 表中检索可接受值的列表 然后对另一个表执行 SELECT 同时将某些字段与所述列表进行比较 我试图用光标来做到这一点 如下所示 但是失败了 DECLARE TYPE gcur IS R
  • cx_Oracle 和数据源范例

    有一个 Java 范例用于在 Java 中实现数据库访问DataSource 该对象围绕数据库连接的创建创建了一个有用的抽象 这DataSource对象保留数据库配置 但只会根据请求创建数据库连接 这允许您将所有数据库配置和初始化代码保留在
  • 执行计划中是否考虑了功能?

    当查询在 SELECT 或 WHERE 子句中包含 PL SQL 函数 用户定义函数 时 如何生成执行计划 它是否也计算这些函数的成本并将其显示在执行计划中 或者这些函数只是被忽略 在此先感谢您的帮助 用户生成的函数在 SELECT 或 W
  • 函数参数的自定义惰性求值/短路的语法

    Oracle 定义了几种结构 这些结构利用了看似惰性求值但实际上是短路的功能 例如 x case when 1 2 then count all prime numbers below 100000000 else 2 2 end 函数 c
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • 如何在不使用 DESCRIBE 命令的情况下描述 Oracle 中的表?

    我在上一门课时遇到了困难 我们需要编写一个 Oracle 脚本 其作用就像 DESCRIBE 命令一样 我们正在使用的这本书对如何使用数据字典的描述非常糟糕 不是寻找答案 而是寻找正确的方向 您正在寻找USER TAB COLUMNS ht
  • 在 Oracle SQL Developer 中连接表

    我有四个表 我想将它们连接起来并一起显示输出 我不确定 Oracle SQL Developer 的语法如何工作 我知道这对于程序员来说是一个简单的问题 我希望有人可以就代码的外观提出建议 The tables are JNL1 JNL2
  • 如何输出使用原生动态SQL执行的SELECT语句的结果?

    我有一个包含 SQL 的字符串SELECT陈述 我想知道如何在屏幕上输出该语句的执行结果 执行将完成使用本机动态 SQL EXECUTE IMMEDIATE example DECLARE v stmt VARCHAR2 SELECT FR
  • ORA-01719: OR 或 IN 的操作数中不允许有外连接运算符 (+)

    运行查询时出现错误 ORA 01719 OR 或 IN 的操作数中不允许有外连接运算符 01719 00000 OR 或 IN 的操作数中不允许使用外连接运算符 原因 or 子句中出现外连接 动作 如果A和B是谓词 要得到 A 或B 的效果
  • 数据流任务的 Foreach 循环容器

    我想从 Oracle DB 导入近 1200 万条记录 但由于 SSIS 内存缓冲区问题 我需要每年迭代我的数据流任务 即 2005 年到 2012 年 7 次 我如何使用 foreach 我的 oracle 查询来获取每年的数据 Quer
  • 使用 cx_oracle 返回 MERGE 中受影响的行数

    如何在 CX Oracle 中执行 MERGE INTO sql 命令来获取受影响的行数 当我在cx oracle 上执行MERGE SQL 时 我得到的cursor rowcount 为 1 有没有办法获取受合并影响的行数 由于 cx o

随机推荐

  • 使用 Java 创建 plist

    有没有一种简单的方法可以用Java创建plist 结果应该与 Objective C 中序列化字典相同 The PList http code google com p xmlwise source browse trunk src mai
  • 为什么在 haskell 中不带括号不可能进行负数相乘

    乘法5 3在 haskell gchi 中给了我一个错误 但乘以5 3 工作正常 为什么需要括号 ghci GHCi version 7 4 1 http www haskell org ghc for help Loading packa
  • Nativescript:使用 Sidekick 传输 mp3 文件

    我正在制作一个使用 nativescript audio 的简单应用程序 我想在该应用程序中播放一些 mp3 样本 问题是 当我在 Sidekick 中单击 在设备上运行 时 它不会传输我包含在应用程序文件夹中的任何 mp3 文件 因此我无
  • CSS 选择包含加号“+”的类

    如何通过包含加号的类名选择元素 E g frme 150 1 background position 150px 1px 使用JavaScript改变加值 可以使用吗 选择器名称中的字符 你需要escape http mathiasbyne
  • 使用 PowerShell 复制源服务器同一目录结构中的文件夹和子文件夹中的项目文件

    我正在努力让下面的脚本以正确的结构复制文件夹和子文件夹中的文件 作为源服务器 可以说 有下面提到的文件夹 主文件夹 文件aaa 文件bbb 子文件夹a 文件1 文件2 文件3 子文件夹b 文件4 文件5 文件6 使用的脚本 Get Chil
  • jquery 淡入淡出滑动面板

    我创建了一个小例子 请看一下 http jsfiddle net bWTwL http jsfiddle net bWTwL 我想要一个像这样的面板 以便 1 li home 点击 gt 向左滑动面板 gt 内容淡入 2 X 单击 gt 内
  • JavaFX 绑定失败并显示“无法绑定到无类型对象”。

    我有一个定义 JavaFX 用户界面的 FXML 文件 在 FXML 文件中 我有以下内容
  • HTML5 中的 Web Speech API 支持哪些语言?

    我想看看网络语音 API 支持哪些语言 并尝试贡献和添加其他语言 当然 仍在开发中并且依赖于供应商的实现 但正如你所看到的 Chrome 已经有一个不错的支持列表 Chrome 是目前唯一支持此功能的浏览器 请参阅以下语言的演示 谷歌语音
  • 如何使我的 Objective-C 类符合 Swift 的“Equatable”协议?

    我有一个 Objective C 类 恰好是一个按钮 但这并不重要 在我的 混合语言 项目的另一部分 我有一个这些按钮的数组 我想获取索引使用按钮的find 方法 就像这样 func doSomethingWithThisButtonInd
  • Javascript 动态地将函数附加到对象

    如何将函数动态附加到javascript对象 例如 如果动态附加函数是attach 那么我应该能够将函数fn附加到onject obj 如下所示 attach obj fn alert 1 function attach obj fnNam
  • zlib 直接用于解压 iPhone 的 zip 文件夹

    是否可以使用 iPhone 上可用的最低 zlib 来解压缩文件夹的 zip 我不想使用开源库 请告诉我实现一段可以解压缩 zip 文件的代码的难度或可能性 正如 JosephH 所说 您不能使用 ZLib 来处理 zip 文件 但您可以使
  • 在 Visual Studio Team Services 中的托管构建代理上进行 Nuget 还原时,找不到 AutoMapper 包 5.1.1

    在 Team Services 以前的 VSO 中托管的构建代理上恢复 AutoMapper 确实是一个奇怪的问题 它只是失败并显示警告 无法找到 AutoMapper 包的版本 5 1 1 我们有一个自定义的私有 nuget 存储库 因此
  • Spring MVC(异步)与 Spring WebFlux

    我正在尝试了解 Spring WebFlux 到目前为止我发现的东西在核心都是反应式的 没有Servlet API 每个请求没有线程 HTTP 2 服务器推送 应用程序 流 json 但是 Spring MVC 中的异步调用有什么区别呢 我
  • GCC -fstack-check 选项在 C 中引发什么异常

    根据 gcc 文档 fstack check 生成代码以验证您没有超出堆栈边界 请注意 此开关实际上并不导致检查完成 而是执行检查 操作系统必须这样做 该切换会导致代码生成 以确保操作系统看到正在扩展的堆栈 我的假设是这个额外的代码将生成异
  • 如何在 JavaScript 中进行字符串插值?

    考虑这段代码 var age 3 console log I m age years old 除了字符串连接之外 还有其他方法可以将变量的值插入到字符串中吗 从 ES6 开始 你可以使用模板文字 https developer mozill
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • Pandas:使用数据帧的多列作为另一个数据帧的索引

    我有一个包含我的数据的大型数据框 以及另一个具有相同第一维度的数据框 其中包含有关每个时间点的元数据 例如 试验编号是什么 试验类型是什么 我想要做的是使用 元数据帧 的值对大数据帧进行切片 我想将它们分开 而不是将数据数据帧存储为较大数据
  • 最快的 Sobel 边缘检测 C#

    我想制作一个实现索贝尔边缘检测的程序 这是我的代码 private Bitmap SobelEdgeDetect Bitmap ori Bitmap b original Bitmap bb original int width b Wid
  • Android:如何将相机结果保存到私人文件

    我正在尝试从相机获取图像并将其直接保存到我的应用程序的私有文件目录中 出于安全考虑 该图像不应随时公开访问 一般来说 授予私有文件临时访问权限的方法是使用 ContentProvider 并在 Intent 中设置 GRANT WRITE
  • Oracle BLOB 提取非常慢

    从我管理的 oracle 10gR2 10 2 05 数据库中提取 BLOBS 时 我遇到性能问题 我有大约 400 个存储为 BLOBS 的文件 我需要将它们写入文件系统 下面是我的代码 当我执行这个过程时 前 8 个左右的文件会在几秒钟