JDBC-драйвер / SQL Server перекомпилирует мои подготовленные операторы все время, когда они содержат ROW_NUMBER () - PullRequest
0 голосов
/ 17 сентября 2009

Я заметил, что подготовленные выражения, содержащие код 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 мс.

1 Ответ

1 голос
/ 17 сентября 2009

Я подозреваю, что он перекомпилируется для оптимизации подкачки из-за этого бита:

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

Однако я бы тоже квалифицировал SalesRN (dbo.SalesRN). Это также может быть причиной.

Наконец, вы можете использовать подсказку запроса . Это черное искусство. Я бы начал с СОХРАНИТЬ ПЛАН или ОПТИМИЗИРОВАТЬ ДЛЯ НЕИЗВЕСТНЫХ.

...