Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当存在外键时,Apache Derby数据库更新记录的速度非常慢_Java_Database_Derby - Fatal编程技术网

Java 当存在外键时,Apache Derby数据库更新记录的速度非常慢

Java 当存在外键时,Apache Derby数据库更新记录的速度非常慢,java,database,derby,Java,Database,Derby,我正在使用下面的直接sql(从java运行)更新2500条记录的字符串主键: 更新子表集合列='new value',其中列='old value' 我还有一个具有相同字符串列的父表,子表有一个指向父表的外键(childtable.column->parenttable.column) 我看到的是,在2500行上运行上述sql语句始终需要大约6秒300毫秒。我还使用外部数据库工具(Squirrel)测试并验证了在某些测试场景中执行此操作需要这么长的时间 如果我只执行以下任一操作,则上述sql的运

我正在使用下面的直接sql(从java运行)更新2500条记录的字符串主键:

更新子表集合列='new value',其中列='old value'

我还有一个具有相同字符串列的父表,子表有一个指向父表的外键(childtable.column->parenttable.column)

我看到的是,在2500行上运行上述sql语句始终需要大约6秒300毫秒。我还使用外部数据库工具(Squirrel)测试并验证了在某些测试场景中执行此操作需要这么长的时间

如果我只执行以下任一操作,则上述sql的运行时间将始终变为400毫秒左右。 -将外键从子项删除到父项 -在子表的单列主键上的子表上添加索引,并在外键中引用子表中的列。Ie这是两列的复合索引

我对添加复合索引的修复方法很满意,但在更复杂的示例中,这种修复方法不再有效,因为子表有一个复合主键,其中包含引用父表的列,并且该列上还有一个外键


我想知道如何改进此场景的性能。我希望在400毫秒到6300毫秒之间执行此更新不会这么慢,因为在我看来,这应该是一个简单的操作,这是一个巨大的性能损失。

听起来您得到的查询计划很糟糕,特别是因为更改键控会产生很大的差异。下面是关于如何挖掘德比的表现行为的背景材料:谢谢,但我尝试了所有这些,似乎没有什么有用的。通过设置运行时参数并将derby.log与使用代码属性的查询计划进行比较而获得的查询计划表明,除了运行时之外,这两个查询计划完全相同。它们实际上与我在diff中所做的完全相同,除了以下几行:next time(毫秒)=13 close time(毫秒)=5 projection time(毫秒)=0您已经确认添加索引可以提高性能,但是,当您使用额外的索引和改进的性能运行第二个实验时,查询计划输出没有任何变化?这是正确的。我在stmt周围有计时代码,运行时间延长了约7秒,但除了提到的毫秒统计数据外,执行计划中没有任何不同之处,我甚至尝试在Squirrel中运行查询,它大约需要相同的时间(最终失败),因为我只做了更新的一部分(我提到的sql)但是外键被延迟,因此它将在提交时失败。我还尝试在Hibernate和Spring dao事务之外运行sql,并直接使用连接(很抱歉忘了提到这一点),以这种方式运行大约需要8秒。听起来您的查询计划很糟糕,特别是因为更改键控会产生很大的不同。下面是关于如何挖掘德比的表现行为的背景材料:谢谢,但我尝试了所有这些,似乎没有什么有用的。通过设置运行时参数并将derby.log与使用代码属性的查询计划进行比较而获得的查询计划表明,除了运行时之外,这两个查询计划完全相同。它们实际上与我在diff中所做的完全相同,除了以下几行:next time(毫秒)=13 close time(毫秒)=5 projection time(毫秒)=0您已经确认添加索引可以提高性能,但是,当您使用额外的索引和改进的性能运行第二个实验时,查询计划输出没有任何变化?这是正确的。我在stmt周围有计时代码,运行时间延长了约7秒,但除了提到的毫秒统计数据外,执行计划中没有任何不同之处,我甚至尝试在Squirrel中运行查询,它大约需要相同的时间(最终失败),因为我只做了更新的一部分(我提到的sql)但是外键被延迟,因此它将在提交时失败。我还尝试在Hibernate和SpringDAO事务之外运行sql,并直接使用连接(很抱歉忘记提到这一点),这样运行大约需要8秒钟。