0

ROW_NUMER() コードを含む準備済みステートメントは、SQL コードが変更されていないにもかかわらず、しばしば再コンパイルされることに気付きました。

(Book 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 の両方に問題があることに気付きました。

誰が何が起こっているのか手がかりを持っていますか? コードが変更されていないのに、ステートメントを再コンパイルするのはなぜですか? 私のクエリの 1 つでは、再コンパイルに約 1200 ミリ秒かかります。これは、31 ミリ秒という短い実行時間に比べてかなり長いです。

4

1 に答える 1

1

このビットのために、ページングを最適化するために再コンパイルされていると思われます。

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

ただし、SalesRN も修飾します (dbo.SalesRN)。これも原因かもしれません。

最後に、クエリ ヒントを使用できます。これはブラックアートです。KEEP PLAN または OPTIMIZE FOR UNKNOWN から始めます。

于 2009-09-17T13:28:42.743 に答える