Sous-requête v/s inner join dans sql server
j'ai requêtes suivantes
premier utilisant la jonction intérieure
SELECT item_ID,item_Code,item_Name
FROM [Pharmacy].[tblitemHdr] I
INNER JOIN EMR.tblFavourites F ON I.item_ID=F.itemID
WHERE F.doctorID = @doctorId AND F.favType = 'I'
deuxième à l'aide de sous-requêtes comme
SELECT item_ID,item_Code,item_Name from [Pharmacy].[tblitemHdr]
WHERE item_ID IN
(SELECT itemID FROM EMR.tblFavourites
WHERE doctorID = @doctorId AND favType = 'I'
)
dans ce tableau [Pharmacy].[tblitemHdr]
contient 15 colonnes et 2000 enregistrements. Et [Pharmacy].[tblitemHdr]
contient 5 colonnes et environ 100 enregistrements. dans ce scénario which query gives me better performance?
5 réponses
les jointures fonctionneront généralement plus rapidement que les requêtes internes, mais en réalité cela dépendra du plan d'exécution généré par le serveur SQL. Peu importe comment vous écrivez votre requête, SQL Server la transformera toujours sur un plan d'exécution. Si c'est "smart" assez pour générer le même plan des deux requêtes, vous obtiendrez le même résultat.
dans Sql Server Management Studio vous pouvez activer " statistiques clients "et aussi inclure le plan D'exécution réelle . Cela vous donnera la possibilité de connaître précisément le temps d'exécution et la charge de chaque demande.
également entre chaque requête nettoyer le cache pour éviter l'effet secondaire du cache sur les performances
USE <YOURDATABASENAME>;
GO
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
je pense qu'il est toujours préférable de voir de nos propres yeux que de s'en remettre à la théorie !
jointure est plus rapide que subquery.
sousquery rend pour l'accès disque occupé, pensez à l'aiguille de lecture-écriture du disque dur(tête?) qui va et vient quand il accède: User, SearchExpression, PageSize, DrilldownPageSize, User, SearchExpression, PageSize, DrilldownPageSize, User... et ainsi de suite.
joindre les œuvres, par la concentration de l'opération sur le résultat des deux premières tables, les jointures serait de se concentrer le rejoindre sur la mémoire(ou mis en cache sur le disque) résultat de la première table jointe, et ainsi de suite. moins de mouvement d'aiguille en lecture-écriture, donc plus rapide
Source: Ici
Sous-requête Vs Rejoindre
Tableau 20 lignes,2 colonnes
Tableau de 20 lignes,2 colonnes
sous-requête 20*20
join 20*2
logique, rectifier
détaillé
le nombre de scans indique l'effet de multiplication car le système devra passer encore et encore pour récupérer des données, pour votre mesure de performance, il suffit de regarder l'heure
la première requête est meilleure que la seconde.. parce que la première requête nous rejoignons les deux tables. et aussi vérifier le plan expliquer pour les deux requêtes...