【发布时间】:2010-10-27 23:12:10
【问题描述】:
我在删除 derby 中的 blob 时遇到了性能问题,想知道是否有人可以提供任何建议。
这主要是在 windows 和 solaris 下使用 10.4.2.0,虽然我也使用新的 10.5.1.1 候选版本进行了测试(因为它有很多 lob 更改),但这没有显着差异。
问题在于,对于包含许多大 blob 的表,删除单行可能需要很长时间(通常超过一分钟)。
我通过一个小测试重现了这一点,该测试创建了一个表,插入几行不同大小的 blob,然后删除它们。
表架构很简单,只是:
create table blobtest(id integer generated BY DEFAULT as identity, b blob)
然后我创建了 7 行,具有以下 blob 大小: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 非常成问题……
【问题讨论】:
-
我编辑了我的帖子来解释这个性能问题,并提出了另一种解决方法(除了更改数据库):将较大的文件移出数据库。
标签: java performance jdbc derby