J'ai la requête suivante
declare @EvalRemarks bit select @EvalRemarks = 0 select ID from table WHERE (@EvalRemarks = 0) OR (AC_Remarks like '%' + @RemarksFilter + '%'))
Puisque SQL est un langage déclaratif, l'optimiseur de requêtes décidera lui-même quelle partie il évaluera en premier.
Puis-je le forcer à évaluer une pièce en premier? Est-ce possible avec des conseils de requête?
Quand j'exécute la requête maintenant cela prend 17 secondes, quand j'enlève la clause where, elle prend 1.
Essaye celui-là –
DECLARE @EvalRemarks BIT SELECT @EvalRemarks = 0 DECLARE @RemarksFilter VARCHAR(30) SELECT @RemarksFilter = 'test' SELECT ID FROM dbo.[table] WHERE @EvalRemarks = 0 OR (@EvalRemarks = 1 AND AC_Remarks LIKE '%' + @RemarksFilter + '%') OPTION (RECOMPILE)
Ou essayez ceci –
DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = 'SELECT ID FROM dbo.[table]' + CASE WHEN @EvalRemarks = 1 THEN 'AC_Remarks LIKE ''%' + @RemarksFilter + '%''' ELSE '' END EXEC sys.sp_executesql @SQL
En effet, l'utilisation de Like avec un caractère générique au début force l'optimiseur de requête à effectuer une parsing de table complète. Il ne peut utiliser aucun index qui pourrait être sur la table.
Si cela est dans une procédure stockée, vous pouvez essayer …
If @EvalRemarks = 0 select ID from table Else select ID from table where AC_Remarks like '%' + @RemarksFilter + '%'