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 ?
Ah mais j'utilise MySQL comme base de données, ces outils peuvent-ils fonctionner? – puffpio
J'ai essayé d'utiliser le mot-clé EXPLAIN dans MySQL, mais ce n'est pas aussi bon que le profileur SQL – puffpio
@puffpio - Si vous utilisez MySql, pourquoi votre question a-t-elle une balise TSQL? –