J'ai donc ce problème étrange avec une procédure stockée SQL Server. Fondamentalement, j'ai cette procédure longue et complexe. Quelque chose comme ceci:Problème de requête Weird SQL Server
SELECT Table1.col1, Table2.col2, col3
FROM Table1 INNER JOIN Table2
Table2 INNER JOIN Table3
-----------------------
-----------------------
(Lots more joins)
WHERE Table1.Col1 = dbo.fnGetSomeID() AND (More checks)
-----------------------
-----------------------
(6-7 More queries like this with the same check)
Le problème est que l'enregistrement dans la clause WHERE à la fin Table1.Col1 = dbo.fnGetSomeID(). La fonction dbo.fnGetSomeID() renvoie une valeur entière simple . Donc, quand je code en dur la valeur où l'appel de fonction devrait être le SP prend seulement environ 15 secondes. MAIS quand je le remplace par cet appel de fonction dans la clause WHERE, il faut environ 3,5 minutes.
donc je fais ceci:
DECLARE @SomeValue INT
SET @SomeValue = dbo.fnGetSomeID()
--Where clause changed
WHERE Table1.Col1 = @SomeValue
Alors maintenant, la fonction est appelée une seule fois. Mais toujours les mêmes 3,5 minutes. Donc, je vais de l'avant et fais ceci:
DECLARE @SomeValue INT
--Removed the function, replaced it with 1
SET @SomeValue = 1
--Where clause changed
WHERE Table1.Col1 = @SomeValue
Et encore ça prend 3.5 minutes. Pourquoi l'impact sur les performances? Et comment le faire disparaître?
Combien de temps faut-il pour exécuter 'dbo.fnGetSomeID()' seul –
Moins d'une seconde. –
Mais cela ne devrait pas importer parce que je remplace par la valeur codée en dur à la fin. –