2017-06-01 2 views
0

Ma requête ci-dessous dans ma procédure stockée prend plus de temps.Il existe un moyen d'optimiser cette requête ci-dessous.Les paramètres d'entrée sont Name et CA.Optimisation dans SQL Server requête

SELECT @E_ID=vb.e_id 
FROM VALUES va, mappings im, VALUES va2 
WHERE im.pv_name=vb.value 
AND va.E_ID in (select e_id from listings where id = 200) 
AND va.f_id=100 
AND va2.f_id=101 AND va.e_id=va2.e_id 
AND im.w_i_name='"'[email protected]+'"' AND va2.value='["'[email protected]+'"]' 
ORDER BY va.e_id 
+0

vous devriez avoir un coup d'oeil dans le plan d'exécution, il vous voyez que les coûts opération combien et que vous pouvez optimiser – DotNetDev

+0

SGBD qui vous USI ng? –

Répondre

0

Nous voyons maintenant que contrairement à l'opinion populaire, les requêtes IN/EXISTS ne sont pas moins efficaces qu'une requête JOIN dans SQL Server. Mais les requêtes JOIN sont moins efficaces sur les tables non indexées. Je ne sais pas, mais vous pouvez modifier comme suit ceci:

SELECT @E_ID=vb.e_id 
FROM VALUES va, mappings im, VALUES va2 
join (select e_id from listings where id = 200) tmp on tmp.e_id = va.E_ID 
WHERE im.pv_name=vb.value 
0

La première chose que je voudrais faire est de vous assurer que chaque champ unique mentionné dans la clause WHERE et la clause ORDER BY est indexée.

La deuxième chose que je voudrais faire est d'essayer ce qui suit:

... 
LEFT JOIN listings on va.E_ID = listings.e_id WHERE listings.id = 200 
... 

(. Bien que je serais surpris si l'optimiseur de requêtes ne prend pas soin de cela)

La troisième chose que je ferais est essayez ce qui suit:

... 
(SELECT * FROM VALUES WHERE f_id=100) va, 
(SELECT * FROM VALUES WHERE f_id=101) va2, 
...