2010-12-10 75 views
0

J'utilise Entity Framework et Linq to Entities avec le connecteur MySQL ADO.Net pour accéder à une base de données MySQL.Laquelle de ces deux requêtes SQL est la plus efficace?

Il existe deux tables Requêtes et Soumissions avec une relation un à plusieurs parmi les Demandes à Soumissions. Par conséquent, la table Submissions contient une colonne RequestId qui possède une dépendance de clé étrangère sur Requests.

J'ai besoin de récupérer toutes les demandes où ses soumissions contiennent une certaine valeur. En LINQ je peux le faire de deux façons:

var r1 = foo.Submissions.Where(s => s.FieldName == "foo" && s.FieldValue == "bar").Select(s => s.Request).Distinct(); 
var r2 = foo.Requests.Where(r => r.Submissions.Any(s => s.FieldName == "foo" && s.FieldValue == "bar")); 

qui évalue à

SELECT `Distinct1`.* 
FROM 
    (SELECT DISTINCT `Extent2`.* 
    FROM `Submissions` AS `Extent1` INNER JOIN `Requests` AS `Extent2` ON `Extent1`.`RequestId` = `Extent2`.`RequestId` 
    WHERE ("foo" = `Extent1`.`FieldName`) AND ("bar" = `Extent1`.`FieldValue`)) 
AS `Distinct1` 

SELECT `Extent1`.* 
FROM `Requests` AS `Extent1` 
WHERE EXISTS 
    (SELECT 1 AS `C1` 
    FROM `Submissions` AS `Extent2` 
    WHERE (`Extent1`.`RequestId` = `Extent2`.`RequestId`) AND ((@gp1 = `Extent2`.`FieldName`) AND (@gp2 = `Extent2`.`FieldValue`))) 

Maintenant, le premier style de requête utilise un INNER JOIN ... est maintenant moins efficace que le 2e choix ?

Répondre

3

Vous devriez pouvoir le déterminer vous-même, en consultant les plans de requête générés pour les deux requêtes dans SSMS. Recherchez spécifiquement les analyses effectuées au lieu de rechercher.

Ensuite, vous pouvez analyser les deux requêtes dans SQL Profiler pour voir lesquelles génèrent moins de lectures globales et consomment moins de cycles CPU.

+0

Ah mais j'utilise MySQL comme base de données, ces outils peuvent-ils fonctionner? – puffpio

+0

J'ai essayé d'utiliser le mot-clé EXPLAIN dans MySQL, mais ce n'est pas aussi bon que le profileur SQL – puffpio

+1

@puffpio - Si vous utilisez MySql, pourquoi votre question a-t-elle une balise TSQL? –

0

La première approche implique potentiellement un tri (distinct) qui suggère que l'alternative EXISTS fonctionnera mieux lorsque le nombre de soumissions pour chaque requête est important.

Que vous dit l'horloge murale?

+0

hehe je n'ai pas encore assez rempli la base de données pour faire une différence, mais je veux choisir la requête LINQ d'écriture pour rendre SQL efficace – puffpio

+0

La plupart des demandes n'ont pas de soumissions, mais quand ils le font .. ils auront 5-20 ... pour vous donner une idée, il y a environ 4000000 demandes et 50000 soumissions – puffpio