2016-07-05 1 views
0

Pour la première fois, postez une question ici, mais je suis un utilisateur fréquent de ce site, merci d'avance à cette communauté qui a d'excellentes réponses aux questions obscures. Ci-dessous, une jointure convertit la date sur deux vues, ce qui entraîne le reformatage de ~ 20 millions de dates dans la vue "PDR". Je ne peux utiliser que l'année et le mois dans la jointure, c'est pourquoi il est converti (je n'ai pas d'option sur cette partie).Convertir uniquement si les critères sont remplis au milieu d'une inscription

J'ai seulement besoin d'inclure des données dans ces colonnes SI Department_Code = 'X' donc 90% des ~ 500 lignes résultantes de ce dernier ne contiendront rien dans ces colonnes.

Je dois le rendre plus efficace, je voudrais dire convertir la date que si le Department_Code = « X »

Suis-je capable d'ajouter que les critères d'inscription à un?

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 
+0

quel RDBMS? Au lieu de convertir en varchar, vous pouvez conserver les conversions de date comme étant mathématique en vous joignant à la fois YEAR (date) = YEAR (date) et MONTH() = MONTH(). Cela pourrait aider certaines performances. Sinon, vous pouvez écrire une déclaration de cas comme vous voulez et dire quand la déclaration de cas = 1 puis rejoindre. Par exemple. (CASE WHEN department_cod = 'X' et MONTH (a) = MONTH (b) et YEAR (a) = YEAR (b) THEN 1 ELSE 0 END) = 1 – Matt

Répondre

0

Je dois le rendre plus efficace, je voudrais dire convertir la date que si le Department_Code = « X »

Suis-je en mesure d'ajouter que les critères à une jointure?

Depuis les dates converties sont utilisées dans votre [gauche] condition de jointure, je suppose que d'éviter les moyens de conversion des lignes avec Department_Code différent de 'X' (pour cette raison) satisfont pas à la condition de jointure.

Si la colonne Department_Code est SLHSV_TM_Pharm_IP_OP_Factor_Rollup, alors la meilleure chose à faire serait d'écrire la condition de jointure comme ceci:

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
    on TMIPOP.[Department_Code] = 'X' 
    and Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 

Votre planificateur de requêtes alors pourrait éviter d'évaluer le côté droit du AND quand le côté gauche évalue à faux. Il est permis de le faire, mais que cela dépende de l'implémentation.

Si vous voulez être certain, vous pouvez pré-filtrer les lignes de la table intérieure vous ne voulez pas:

Left Join (
    select * 
    from [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] 
    where [Department_Code] = 'X' 
) as TMIPOP 
    on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 

Si la colonne Department_Code est à la place sur la table PDR, vos choix sont plus limité, mais cela devrait fonctionner (et un convertisseur analogique devrait fonctionner si cette colonne est sur l'autre table):

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
    on case 
    when PDR.[Department_Code] = 'X' 
     then Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
     = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 
    else 1 = 0 
    end 

Il est concevable que vous trouveriez cette dernière plus cher que de simplement faire toutes les conversions. Puisque la performance est apparemment votre préoccupation ici, il est essentiel de tester. Il est également conseillé d'examiner les plans de requête pour les options que vous évaluez, car cela pourrait vous aider à trouver des variantes qui fonctionnent mieux.

+0

Cela semble toujours évident après que vous l'ayez vu. J'essaye ceci maintenant et le laisse courir un peu. J'espère que ça le fait. Je vais répondre avec les résultats. Merci! Left Join ( ) Sélectionnez * de [dbo]. [SLHSV_TM_Pharm_IP_OP_Factor_Rollup] où [Department_Code] = 'X') as TMIPOP –