Я заметил, что подготовленные выражения, содержащие код 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
Я использую последнюю версию JDBC-драйвера jTDS (1.2.3) и заметил проблему с SQL Server 2005 и 2008.
Кто-нибудь знает, что происходит? Почему он перекомпилирует операторы, хотя их код не меняется? Для одного из моих запросов перекомпиляция занимает около 1200 мс, что много по сравнению со временем выполнения, которое составляет всего 31 мс.