J'ai remarqué que les instructions préparées contenant le code ROW_NUMER() sont souvent recompilées bien que leur code SQL n'ait pas changé.Pilote JDBC/SQL Server recompile mes instructions préparées tout le temps quand ils contiennent ROW_NUMBER()
(exemple du livre Microsoft Inside SQL Server 2008: T-SQL Interrogation):
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
J'utilise la dernière version du pilote JDBC-jTDS (1.2.3) et a remarqué le problème avec SQL Server 2005 et 2008.
Quelqu'un at-il une idée de ce qui se passe? Pourquoi recompile-t-il les instructions même si leur code ne change pas? Pour une de mes requêtes, la recompilation prend environ 1200ms, ce qui est beaucoup comparé au temps d'exécution qui est aussi bas que 31ms.
Sons probables, en fonction du nombre de lignes dans SalesRN et de la distribution globale de rownum. –
Mais n'est-ce pas le pilote JDBC qui décide quand recompiler une instruction et non le SQL Server? –
Non, optimiseur SQL Server. Comment JDBC peut-il le recompiler? Il peut * préparer * une déclaration différente – gbn