8
votes

Optimisation de LINQ TOUT () Appelez dans le cadre d'entité

Après avoir profilé mon entité Framework 4.0 Couche de base de données basée sur la base de données ITS J'ai trouvé que le major Performance Sinner est un simple Linq tout () que j'utilise pour vérifier si une entité est déjà existante dans la base de données. Le chèque tout () effectue des ordres de magnitude plus lentement que d'économiser l'entité. Il y a relativement peu de lignes dans la base de données et les colonnes vérifiées sont indexées.

J'utilise la LINQ suivant pour rechercher l'existence d'un groupe de réglage: P>

exec sp_executesql N'SELECT 
CASE WHEN ( EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[SettingGroups] AS [Extent1]
    WHERE ([Extent1].[Group] = @p__linq__0) AND ([Extent1].[Category] = @p__linq__1)
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT 
    1 AS [C1]
    FROM [dbo].[SettingGroups] AS [Extent2]
    WHERE ([Extent2].[Group] = @p__linq__0) AND ([Extent2].[Category] = @p__linq__1)
)) THEN cast(0 as bit) END AS [C1]
FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'Cleanup',@p__linq__1=N'Mediator'


0 commentaires

4 Réponses :


0
votes

Je sais que cela sonne une solution misérable, mais que se passe-t-il si vous utilisez compter au lieu de tout?


0 commentaires

0
votes

Avez-vous profilé le temps d'exécuter l'instruction sélectionnée générée contre le temps nécessaire pour exécuter la sélection de ce que vous attendez / aimeriez être produit? Il est possible que ce ne soit pas aussi mauvais que cela semble.

La section xxx

est probablement proche de ce que vous attendez d'être produit. Il est tout à fait possible que l'optimisateur de requête réalisa la deuxième requête soit la même que la première et la première fois qu'elle peut ajouter très peu de temps à la requête globale.


0 commentaires

1
votes

Essayez d'ajouter d'index à la table de base de données "Définition des groupes", par groupe et par catégorie.

BTW, cela produit-il des SQL similaire? P>

var ok = context.SettingGroups.Any(sg => sg.Group==settingGroup && sg.Category==settingCategory);


1 commentaires

Oui, utilisez un index. Créer index ix_settingGroups_gc sur les groupes de réglage (groupe, catégorie)



0
votes

Le problème est le cadre d'entité (au moins EF4) génère une SQL stupide. Le code suivant semble générer des SQL décent avec une douleur minimale.

context.SettingGroups.BetterAny(sg => sg.Group.Equals(settingGroup) && sg.Category.Equals(settingCategory));


0 commentaires