ari*_*iso 5 java performance jdbc derby
我在删除德比中的blob时遇到了性能问题,并且想知道是否有人可以提供任何建议.
这主要是在windows和solaris下的10.4.2.0,虽然我也测试了新的10.5.1.1版本候选版(因为它有很多高架变化),但这没有显着差异.
问题是,对于包含许多大blob的表,删除单行可能需要很长时间(通常超过一分钟).
我用一个小测试重现了这个,它创建了一个表,插入了几行不同大小的blob,然后删除它们.
表模式很简单,只需:
create table blobtest(id DEFAULT生成的id整数作为标识,b blob)
然后我创建了7行,其中包含以下blob大小:1024字节,1Mb,10Mb,25Mb,50Mb,75Mb,100Mb.
我已经阅读了斑点,检查它们是否已正确创建并且尺寸正确.
然后使用sql语句删除它们("从blobtest中删除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将表数据存储在单个文件内。还有一些设计/实现错误导致它读取所有内容,而不是使用正确的索引来执行它。
我执行批量删除而不是解决此问题。我重写了我的程序的一部分。是“哪里 id=?” 在自动提交中。然后我重写了很多东西,现在“where ID IN(?,.......?)”包含在一个事务中。
总时间减少到之前的 1/1000。
我建议您可以添加“标记为已删除”列,并制定批量实际删除的时间表。
| 归档时间: |
|
| 查看次数: |
4024 次 |
| 最近记录: |