Utiliser des conseils de requête pour forcer l'évaluation paresseuse

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 + '%'