MSSQL 查询执行计划缓存和 JDBC

Posted

技术标签:

【中文标题】MSSQL 查询执行计划缓存和 JDBC【英文标题】:MSSQL query execution Plan cache and JDBC 【发布时间】:2018-04-18 10:37:46 【问题描述】:

我正在使用基于 Java 的 Web 应用程序,我们使用 Microsoft SQL Server 作为数据库服务器。在那里,我们有几个长时间运行的 SQL 查询,我们正在寻找提高这些查询性能的选项。

当我开始阅读有关查询性能改进的信息时,我发现 SQL Server 缓存了查询执行计划,并且下次它可以从缓存中重用它而无需创建新的执行计划。我使用SET STATISTICS TIME ON; 在 MSSQL 管理工作室控制台上进行了尝试,它清楚地表明 SQL Server 缓存了执行计划。 JDBC会自动发生吗?还是我们需要遵循任何特定的指示?我试过谷歌搜索,但运气不好。

【问题讨论】:

【参考方案1】:

是的,它发生在 JDBC 上。请注意并使用带有绑定变量的准备好的语句 (https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html)。例如:

select * from tab where col = 'somevalue'

不同于:

select * from tab where col = 'someothervalue'

但两者都可以使用相同的计划,写成:

select * from tab where col = ?

【讨论】:

您好 user2612030,感谢您的评论。在我的查询中,我有几个用于 IN 子句的字符串连接以及准备好的语句。这有效果吗?有什么方法可以处理 IN 子句来处理执行计划缓存 取决于你的意思。只要您传递给服务器的 SQL 相同,计划就会被缓存。如果 SQL 因输入参数而异,则说明有问题。但是,对于长时间运行的查询,缓存并不那么重要,但对于经常运行的快速查询而言,它更重要,因为它具有更高的相对影响。当运行查询需要几分钟时间时,新计划的毫秒数并不重要! 顺便说一句,请参阅***.com/questions/337704/…。它可能会给你一些想法,但我再次认为这对于长时间运行的查询并不重要。

以上是关于MSSQL 查询执行计划缓存和 JDBC的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中执行计划的缓存机制

谈一谈SQL Server中的执行计划缓存(下)

执行计划组件组件老化

MySQL执行计划

SQL Server - 条件语句的查询执行计划

存储过程执行计划缓存查询