java - Java DB Derby Blob 和删除的性能问题

标签 java performance jdbc derby

我在 derby 中删除 blob 时遇到性能问题,想知道是否有人可以提供任何建议。

这主要是针对 windows 和 solaris 下的 10.4.2.0,虽然我也测试了新的 10.5.1.1 候选发布版(因为它有很多 lob 更改),但这没有显着差异。

问题在于,对于包含许多大 blob 的表,删除一行可能需要很长时间(通常超过一分钟)。

我通过创建一个表的小测试重现了这个,插入了几行不同大小的 blob,然后删除它们。

表模式很简单,只是:

创建表 blobtest(默认生成的 id 整数作为标识,b blob)

然后我创建了具有以下 blob 大小的 7 行:1024 字节、1Mb、10Mb、25Mb、50Mb、75Mb、100Mb。

我已经读回了 blob,以检查它们是否已正确创建且大小正确。

然后使用 sql 语句(“delete from blobtest where id = X”)将它们删除。

如果我按照创建它们的顺序删除行,则删除单个行的平均时间是:

1024 字节:19.5 秒

1Mb:16 秒

10Mb:18 秒

25Mb:15 秒

50Mb:17 秒

75Mb:10 秒

100Mb:1.5 秒

如果我以相反的顺序删除它们,删除单行的平均时间是:

100Mb:20 秒

75Mb:10 秒

50Mb:4 秒

25Mb:0.3 秒

10Mb:0.25 秒

1Mb:0.02 秒

1024 字节:0.005 秒

如果我创建七个小 blob,删除时间都是瞬时的。

因此,删除时间似乎与表中行的总体大小有关,而不是与要删除的 blob 的大小有关。

我已经运行了几次测试,结果似乎可以重现。

那么,有没有人对性能有任何解释,以及关于如何解决或修复它的任何建议?它确实使在生产环境中使用大 blob 变得相当成问题……

最佳答案

我遇到的问题与您完全相同。

我发现当我执行 DELETE 操作时,derby 实际上完全“读取”了大段文件。我使用 Filemon.exe 来观察它是如何运行的。

我的文件大小为 940MB,删除一行需要 90 秒。

我认为derby 将表数据存储在单个文件里面。以及导致它读取所有内容而不是使用适当索引执行的设计/实现错误。

我做批量删除而不是解决这个问题。 我重写了一部分程序。它是“where id=?”在自动提交。 然后我重写了很多东西,它现在包含在事务中的“where ID IN(?,.......?)”。

总时间减少到原来的1/1000。

我建议你可以添加一个“标记为已删除”的列,并带有一个批量实际删除的时间表。

关于java - Java DB Derby Blob 和删除的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/893475/

相关文章:

java - 为什么这段Java代码中有多个构造函数?

algorithm - 用于存储大量对象的高性能容器

javascript - jQuery 选择器速度

java - type2 的 mysql 数据库的驱动程序名称和 url 是什么

jdbc - Oracle defaultNChar=true SLOW on NCHAR/NVARCHAR2

java - 用于访问当前登录用户对象的 ACEGI 标记

java - CentOS .exe 程序的最大堆大小无效

java - Java 应用程序中的 D3js

c# - 检查大量文件中是否存在字符串的最快方法

java - 如何为 jdbc odbc 驱动程序设置获取大小