10

Laquelle de la requête suivante est mieux ... Ceci est juste un exemple, il existe de nombreuses situations où je veux le nom d'utilisateur affiché à la place de UserIDjointure interne Vs scalaire Fonction

Select EmailDate, B.EmployeeName as [UserName], EmailSubject 
    from Trn_Misc_Email as A 
     inner join 
     Mst_Users as B on A.CreatedUserID = B.EmployeeLoginName 

ou

Select EmailDate, GetUserName(CreatedUserID) as [UserName], EmailSubject 
    from Trn_Misc_Email 

S'il n'y a aucun avantage de performance en utilisant le premier, je préfère utiliser le second ... Je tiendrions environ 2000 enregistrements dans le tableau de l'utilisateur et 100k enregistrements dans la table email ...

Merci

+0

Avez-vous essayé par vous-même? –

Répondre

11

Une bonne question et grands à penser à des performances SQL, etc.

D'un pur point de vue SQL le premier est meilleur. Dans la première déclaration, il est capable de tout faire dans une seule commande par lots avec une jointure. Dans la seconde, pour chaque ligne de trn_misc_email, il faut exécuter une sélection BATCH séparée pour obtenir le nom d'utilisateur. Cela pourrait causer un problème de performance maintenant, ou dans le futur.

Il est également plus facile à lire pour les autres participants au projet car ils peuvent voir ce qui se passe. Si vous avez eu le second, vous devez ensuite aller voir dans la fonction (je suppose que c'est ce que c'est) pour savoir ce que ça fait.

Donc, en réalité, deux raisons d'utiliser la première raison.

3

Le code SQL en ligne JOIN sera généralement better than the scalar UDF car il peut être optimisé. Lors du test, assurez-vous d'utiliser SQL Profiler pour voir le coût des deux versions. SET STATISTICS IO ON ne mentionne pas le coût des fonctions UDF scalaires dans ses figures, ce qui rendrait la version UDF scalaire meilleure qu'elle ne l'est en réalité.

+0

Avez-vous des références qui m'aident à comprendre le plan d'exécution et les statistiques Informations –

+3

@The King - Voir cet ebook gratuit ["disséquer les plans d'exécution SQL Server" par Grant Fritchey] (http: //downloads.red-gate. com/ebooks/HighPerformanceSQL_ebook.zip) –

1

Pour vous aider plus, juste un conseil, dans le serveur SQL utilisant le studio de gestion, vous pouvez évaluer les performances par Display Estimated execution plan. Il a montré comment les index et les jointures fonctionnent et vous pouvez choisir la meilleure façon de l'utiliser.

Vous pouvez également utiliser le DTA (Database Engine Tuning Advisor) pour plus d'informations et d'optimisation.

+1

Les UDF scalaires sont juste traitées comme une boîte noire sur ce je pense. –

+1

Avez-vous des références qui m'aident à comprendre le plan d'exécution et les informations statistiques? –

+0

@ Martin Smith, non, le plan d'exécution clairement montré avec toutes les étapes et ce qui se passe comme coût, .... Vous pouvez essayer par vous-même. Plus un cache UDF scalaire le plan d'exécution pour optimiser l'exécution dans les prochaines exécutions –