JDBC驱动程序/SQL Server总是重新编译我准备好的语句,如果它们包含ROW_NUMBER()

JDBC驱动程序/SQL Server总是重新编译我准备好的语句,如果它们包含ROW_NUMBER(),sql,sql-server,jdbc,jtds,Sql,Sql Server,Jdbc,Jtds,我注意到,尽管SQL代码没有改变,但包含行数代码的预处理语句经常会被重新编译 Microsoft SQL Server 2008内部丛书中的示例:T-SQL查询: WITH SalesRN AS ( SELECT ROW_NUMBER() OVER (ORDER BY qty, empid) AS rownum, empid, mgrid, qty FROM dbo.SalesOrder ) SELECT rownum, empid, mgrid, qty FR

我注意到,尽管SQL代码没有改变,但包含行数代码的预处理语句经常会被重新编译

Microsoft SQL Server 2008内部丛书中的示例:T-SQL查询:

WITH SalesRN AS (
 SELECT
  ROW_NUMBER() OVER (ORDER BY qty, empid) AS rownum,
  empid,
  mgrid,
  qty
 FROM
  dbo.SalesOrder
)
SELECT 
 rownum,
 empid,
 mgrid,
 qty
FROM
 SalesRN
WHERE
 rownum > 100 * (?-1)
 AND rownum <= 100 * ?
ORDER BY
 rownum
我正在使用最新版本的jTDS JDBC驱动程序1.2.3,并注意到了SQLServer2005和2008的问题


有人知道发生了什么事吗?为什么在代码不变的情况下重新编译语句?对于我的一个查询,重新编译大约需要1200ms,这与低至31ms的执行时间相比要多得多。

我怀疑重新编译它是为了优化分页,因为这一位:

rownum > 100 * (?-1)
 AND rownum <= 100 * ?
不过,我也会将SalesRN限定为dbo.SalesRN。这也可能是原因


最后,你可以使用一个。这是一种黑人艺术。我会从KEEP PLAN或OPTIMIZE FOR UNKNOWN开始。

听起来很可能,这取决于SalesRN中的行数和rownum的总体分布。但决定何时重新编译语句的不是SQL Server而是JDBC驱动程序吗?不,是SQL Server Optimizer。JDBC如何重新编译它?它可以准备一份不同的声明