2009-09-17 8 views
0

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.

Répondre

1

Je soupçonne que ce recompilée pour optimiser la pagination en raison de ce bit:

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

Cependant, je voudrais aussi nuancer SalesRN aussi (dbo.SalesRN). Cela peut aussi être la cause.

Enfin, vous pouvez utiliser un query hint. C'est un art noir. Je commencerais par KEEP PLAN ou OPTIMIZE FOR UNKNOWN.

+0

Sons probables, en fonction du nombre de lignes dans SalesRN et de la distribution globale de rownum. –

+0

Mais n'est-ce pas le pilote JDBC qui décide quand recompiler une instruction et non le SQL Server? –

+0

Non, optimiseur SQL Server. Comment JDBC peut-il le recompiler? Il peut * préparer * une déclaration différente – gbn

Questions connexes