在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询
Posted
技术标签:
【中文标题】在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询【英文标题】:Performing static SQL queries against DB2 without PureQuery 【发布时间】:2010-03-18 16:32:09 【问题描述】:我想将 JPA over JDBC 用于新应用程序。我严格使用 JPA 实体管理器的命名查询和基本 CRUD 方法,它允许我(在 Hibernate 或任何其他 JPA 实现的帮助下)提取将在数据库上执行的所有 SQL 本机查询。通过这个静态查询列表,我知道我可以构建一个 DB2 包,它是我的请求的所有执行计划。
所以我的问题是:通过 JDBC 对 DB2 执行这些查询是否会利用这些执行计划?我了解 PureQuery 产品可以捕获 sql 订单列表。它是否仍然通过 JDBC 而不是通过 PureQuery 特定的 API 提供更多?这样一个特定的 DB2 静态绑定特性?还是相当于JDBC?
感谢您的任何回答。
【问题讨论】:
问题已经回答了,无论如何,请随意添加与此主题相关的其他cmet! 【参考方案1】:JDBC 应用程序只执行动态 SQL(即 DB2 不使用静态包)。
只有 2 种方法可以获得静态 SQL(查询存储在数据库中的包中):使用 SQLJ 编写应用程序(消除 JPA/Hibernate)或使用 pureQuery(位于 JDBC 和数据库之间) .
请记住,即使使用动态 SQL,DB2 也会缓存查询的执行计划,因此如果它们执行得足够频繁(即它们保留在缓存中),那么您将不会看到查询编译的开销。缓存仅在查询是精确的逐字节匹配时才有用,因此select * from t1 where c1 = 1
与select * from t1 where c1 = 2
不同,select * from t1 where C1 = 1
也不同(给出相同的结果,但查询不同)。使用参数标记 (select * from t1 where c1 = ?
) 是关键。您的 DBA 可以调整目录缓存的大小,以帮助最大限度地提高此缓存的命中率。
虽然缓存有助于避免重复编译查询,但它不能提供静态 SQL 所提供的计划稳定性,因此是 YMMV。
【讨论】:
感谢您的宝贵回答 :)以上是关于在没有 PureQuery 的情况下对 DB2 执行静态 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有操作的情况下对 Pandas 数据框进行分组或聚合