Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/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 如何找到hibernate和直接运行sql之间的查询差异?_Java_Oracle_Hibernate_Time - Fatal编程技术网

Java 如何找到hibernate和直接运行sql之间的查询差异?

Java 如何找到hibernate和直接运行sql之间的查询差异?,java,oracle,hibernate,time,Java,Oracle,Hibernate,Time,我有如下疑问: delete from tableA where fk in (select id from tableA where fk='somevalue' and tableA.date between date1 and date2) 当我从TOAD运行这个查询时,需要将近100毫秒。当我使用 session .createSQLQuery( "delete .

我有如下疑问:

 delete from tableA where fk in (select id from tableA where fk='somevalue'
 and tableA.date between date1 and date2)
当我从TOAD运行这个查询时,需要将近100毫秒。当我使用

                   session
                .createSQLQuery(
                        "delete ....")
                .setParameter("...")
                .setParameter("...")
                .setParameter("...")
                .executeUpdate();
大约需要30分钟 实际查询删除0行。因此,可能存在一些hibernate/oracle问题。我怎么能找到他们?
谢谢。

您可能正在谈论用于显示sql的ctrl+f


将此属性设置为true将把使用过的sql打印到标准输出中

您可能正在谈论用于显示sql的ctrl+f


如果将此属性设置为true,则会将使用过的SQL打印到标准输出中

如果时间过长,则不会注意到hibernate可能产生的小开销

通过在fk和date列中添加索引,您可能可以加快删除速度。在这种情况下,复合索引可能会很好地工作

更新 我将详细阐述一下,以澄清我为什么提出这一建议。 Hibernate必须为执行的查询解析映射,对于select语句,它必须创建对象并用结果填充它们。在这种情况下,这种开销看起来并不重要,因为我们讨论的是30分钟的执行时间

所以问题可能出在其他地方,比如:

如果从不同的机器上执行TOAD和java进程,则使用网络 JDBC和OCI之间的一些区别 查询的错误翻译,可以使用show\u sql属性进行检查。在这种情况下,映射通常有问题。 由于问题中没有任何删除,即使查询需要30分钟,这也是我建议使用索引的原因。确实,它可能会减慢删除速度,但在这种情况下,不会删除任何行,因此执行子查询需要30分钟,而不会执行任何删除操作


这个答案可能无法解决问题,但我真的认为它不值得投反对票。

在如此长的时间内,hibernate可能产生的小开销不会被注意到

通过在fk和date列中添加索引,您可能可以加快删除速度。在这种情况下,复合索引可能会很好地工作

更新 我将详细阐述一下,以澄清我为什么提出这一建议。 Hibernate必须为执行的查询解析映射,对于select语句,它必须创建对象并用结果填充它们。在这种情况下,这种开销看起来并不重要,因为我们讨论的是30分钟的执行时间

所以问题可能出在其他地方,比如:

如果从不同的机器上执行TOAD和java进程,则使用网络 JDBC和OCI之间的一些区别 查询的错误翻译,可以使用show\u sql属性进行检查。在这种情况下,映射通常有问题。 由于问题中没有任何删除,即使查询需要30分钟,这也是我建议使用索引的原因。确实,它可能会减慢删除速度,但在这种情况下,不会删除任何行,因此执行子查询需要30分钟,而不会执行任何删除操作


这个答案可能无法解决问题,但我真的认为不值得投反对票。

我不明白。请提供更多详细信息。子查询需要条件-哪些行应该被删除。这会产生问题吗?我建议启用Hibernate的查询日志(如所述),或者,因为在运行本机查询时不会有这样的差异。通过show SQL属性获取SQL并对其运行解释计划。这将为优化提供一些线索。顺便说一句,上面的查询看起来很奇怪,您不需要IN子句。。。我猜这是因为您简化了说明…tableA是子查询中的一个输入错误吗?或者你真的要查询同一个表两次?不明白。请提供更多详细信息。子查询需要条件-哪些行应该被删除。这会产生问题吗?我建议启用Hibernate的查询日志(如所述),或者,因为在运行本机查询时不会有这样的差异。通过show SQL属性获取SQL并对其运行解释计划。这将为优化提供一些线索。顺便说一句,上面的查询看起来很奇怪,您不需要IN子句。。。我猜这是因为您简化了说明…tableA是子查询中的一个输入错误吗?或者您真的要查询同一个表两次吗?正如问题中所解释的,当在工具中执行时,他的查询已经相当快了。添加索引甚至可能会减慢删除速度,因为它们也必须在删除时更新。但问题可能不会是hibernate,因为它与这样的查询关系不大。也许jdbc和OCI之间存在差异,如果从不同的框执行,则会出现网络问题。。。。我想说的是,hibernate可能不是原因。正如问题中所解释的,当在工具中执行时,他的查询已经相当快了。添加索引甚至可能会减慢删除速度,因为它们也有
删除时更新。但问题可能不会是休眠,因为它与这样的查询关系不大。也许jdbc和OCI之间存在差异,如果从不同的框执行,则会出现网络问题。。。。我想说的是hibernate可能不是原因。谢谢。我已将show_sql设置为true。这和我想的是同一个问题。但它因未知的原因而猛增。我不明白为什么…谢谢。我已将show_sql设置为true。这和我想的是同一个问题。但它因未知的原因而猛增。我不明白为什么。。。