0

我注意到包含 ROW_NUMER() 代码的准备好的语句经常被重新编译,尽管它们的 SQL 代码没有改变。

(来自《Inside Microsoft SQL Server 2008: T-SQL Querying》一书中的示例):

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 毫秒的执行时间相比,这是很多的。

4

1 回答 1

1

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

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

但是,我也有资格 SalesRN (dbo.SalesRN)。这也可能是原因。

最后,您可以使用查询提示。这是一门黑色艺术。我会从保持计划或优化未知开始。

于 2009-09-17T13:28:42.743 回答