我注意到包含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毫秒。
答案 0 :(得分:1)
我怀疑它被重新编译以优化分页,因为这一点:
rownum > 100 * (?-1)
AND rownum <= 100 * ?
但是,我也同样认可SalesRN(dbo.SalesRN)。这也可能是原因。
最后,您可以使用query hint。这是一种黑色艺术。我将从保持计划或未知的优化开始。