JDBC-driver / SQL Server在包含ROW_NUMBER()时会一直重新编译我准备好的语句

时间:2009-09-17 13:23:28

标签: sql sql-server jdbc jtds

我注意到包含ROW_NUMER()代码的预处理语句经常被重新编译,尽管它们的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)并注意到SQL Server 2005和2008的问题。

有谁知道发生了什么事?为什么它重新编译语句虽然它们的代码没有改变?对于我的一个查询,重新编译大约需要1200毫秒,这与执行时间相比要低很多,而执行时间则低至31毫秒。

1 个答案:

答案 0 :(得分:1)

我怀疑它被重新编译以优化分页,因为这一点:

rownum > 100 * (?-1)
 AND rownum <= 100 * ?

但是,我也同样认可SalesRN(dbo.SalesRN)。这也可能是原因。

最后,您可以使用query hint。这是一种黑色艺术。我将从保持计划或未知的优化开始。