Optimisation de l'instruction CASE WHEN dans la condition de la clause WHERE de SQL Server

Je réécris mon sql pour réduire le coût d'exécution et je me request s'il y a un moyen efficace d'écrire les instructions CASE WHEN ci-dessous utilisées dans la condition WHERE:

SELECT l.*,tg.* FROM RefTable tg, InputTbl l WHERE tg.areascheme = l.areascheme AND tg.countrycode = l.strareabriefnamel1 AND ( CASE WHEN l.strareabriefnamel2 IS NULL THEN '' ELSE tg.areacode END ) = COALESCE( l.strareabriefnamel2,'' ) AND ( CASE WHEN l.strareabriefnamel3 IS NULL THEN '' ELSE tg.subareaname END ) = COALESCE( l.strareabriefnamel3,'' ) AND ( CASE WHEN l.strareabriefnamel4 IS NULL THEN '' ELSE tg.postalname END ) = COALESCE( l.strareabriefnamel4,'' ) option( MAXDOP 0 ); 

Plan d'exécution :- entrez la description de l'image ici

Plus de détails :-

InputTable (loggings 466K) a un total de quatre champs qui participent à la logique JOIN et il y a un total de 16 combinaisons possibles (NULL, NOT NULL).

 L1, L2, L3, L4 NULL,NULL,NULL,NULL NULL,NULL,NULL,NOT NULL NULL,NULL,NOT NULL, NULL NULL,NULL,NOT NULL,NOT NULL NULL,NOT NULL,NULL,NULL NULL,NOT NULL,NULL, NOT NULL NULL,NOT NULL, NOT NULL,NULL NULL,NOT NULL,NOT NULL,NOT NULL NOT NULL,NULL,NULL,NULL NOT NULL,NULL,NULL,NOT NULL NOT NULL,NULL,NOT NULL,NULL NOT NULL,NULL,NOT NULL,NOT NULL NOT NULL,NOT NULL,NULL,NULL NOT NULL,NOT NULL,NULL,NOT NULL NOT NULL,NOT NULL,NOT NULL,NULL NOT NULL,NOT NULL,NOT NULL,NOT NULL 

RefTable (loggings 45k) qui participera à la logique JOIN avec InputTable génère le jeu de résultats basé sur les critères ci-dessus est la production d'environ 351 millions de lignes.

Mes données d'input ne répondent actuellement qu'à deux scénarios.

InputTable: –

 NULL,NULL,NULL,NULL - 225776 rows NOT NULL, NOT NULL, NULL, NULL - 240360 rows 

Toute consortingbution serait appréciée. Merci.

Règle simple: n'utilisez jamais de virgules dans la clause FROM . Utilisez toujours une syntaxe JOIN explicite et appropriée.

Cela ne change probablement pas les performances de la requête, mais c'est une façon beaucoup plus typique de l'écrire. Je suis sûr que l'intention est:

 SELECT l.*, tg.* FROM RefTable tg JOIN InputTbl l ON tg.areascheme = l.areascheme AND tg.countrycode = l.strareabriefnamel1 WHERE (l.strareabriefnamel2 IS NULL OR tg.areacode = l.strareabriefnamel2) AND (l.strareabriefnamel3 IS NULL OR tg.subareaname = l.strareabriefnamel3) AND (l.strareabriefnamel4 IS NULL OR tg.postalname = l.strareabriefnamel4) option( MAXDOP 0 ); 

L'endroit où commencer avec l'optimization de cette requête est avec des index. Je suggère: RefTable(areascheme, countrycode) et InputTbl(areascheme, strareabriefnamel1) .