如何在 CLOB 字段(Oracle 10g)中快速替换出现极高的相同字符?
Posted
技术标签:
【中文标题】如何在 CLOB 字段(Oracle 10g)中快速替换出现极高的相同字符?【英文标题】:How to replace an extremely high occurrence of the same character quickly in a CLOB field (Oracle 10g)? 【发布时间】:2014-05-09 07:19:53 【问题描述】:由于我们的一个应用程序中的错误,某个字符在许多 CLOB 字段中重复了 2^n 次,其中 n 介于 1 和 24 之间。为简单起见,假设该字符为 @987654321 @。可以安全地假设两个或多个这些字符的任何相邻出现都标识了损坏的数据。
我们考虑过运行数据库中的每个 CLOB 字段,并在必要时替换值。我们很快发现您可以使用REGEXP_REPLACE
轻松替换该值,例如像这样(可能包含语法错误,用心输入):
SELECT REGEXP_REPLACE( clob_value, 'XX*', 'X' )
FROM someTable
WHERE clob_value LIKE 'XX%';
但是,即使将WHERE
部分更改为WHERE primary_key = 1234
,对于在其 CLOB 字段中的两个位置包含大约 400 万个字符的数据集,此查询也需要 15 分钟以上执行(我们在那之后中止了尝试,不确定实际需要多长时间)。
作为比较,将相同的值读入 C# 应用程序,使用类似的正则表达式方法将其修复,然后将其写回数据库只需 3 秒。
我们可以编写这样一个 C# 应用程序并执行它,但是由于安全限制,将数据库脚本发送给我们的客户会更容易很多他们可以自己执行。
有没有什么方法可以在 Oracle 10g (10.2.0.3) 数据库上更快地进行这样的替换?
注意:有两种配置,一种在 Windows 2003 Server 上运行数据库,客户端为 Windows XP,另一种在独立的 Windows XP 笔记本上同时运行数据库和客户端。两种配置都会受到影响
【问题讨论】:
clob 有多大,锁定是否会在延迟中起作用? 关于锁定:我们重新启动了数据库服务器,进行了无关的测试查询以验证模式是否可用,然后执行我描述的语句。我们的测试数据库有 30 行,每行有两个 clob 字段。在一列中,十行的字符数略多于 2^23 个(超过 800 万) 【参考方案1】:您的客户端如何访问 Oracle 服务器?如果它是通过 Unix 环境(很可能是这种情况),那么也许你可以编写一个 shell 脚本来从数据库中提取值,使用 sed 修复它,然后写回数据库。在 unix 中替换应该很快。
【讨论】:
不幸的是不是 Unix。我用更多信息更新了问题 嗯,我现在没脑子 - 从来没有在 Windows 服务器上工作过 在 Oracle 上使用 CLOB 字段通常需要时间【参考方案2】:也许您面临 LOB 段空间碎片的问题。事实上,你的每一个吊球都会在之前被短路。尝试创建一个新表并将修改后的 clob 复制到这个新表中。
【讨论】:
【参考方案3】:由于我们没有找到任何方法让它在数据库上更快,我们在一个可执行补丁中提供了 C# 工具。
【讨论】:
以上是关于如何在 CLOB 字段(Oracle 10g)中快速替换出现极高的相同字符?的主要内容,如果未能解决你的问题,请参考以下文章