【问题标题】:Query performance is affected by boolean literals?查询性能受布尔文字影响?
【发布时间】:2019-07-16 16:50:27
【问题描述】:

我想知道布尔文字是否会影响实体框架中的查询性能,因为有人告诉我他们会这样做,尽管我找不到任何同意这一点的材料,而且我认为使用它们是多余的......

我所做的一个例子写在下面:

_context.Entity.Where(e => e.Blocked);

有人告诉我,由于性能,下面的方法会更好:

_context.Entity.Where(e => e.Blocked == true);

抱歉,有任何英语错误,这不是我的母语。 :/

【问题讨论】:

  • 你测试了吗?如果是,你的结果是什么?
  • 是的,我运行了我们的一些集成测试,它们之间并没有太大区别...
  • 谁告诉你有区别,他们的区别是什么?
  • @PigStorm 我认为结果查询可能存在差异。可以记录由 Entity Framework 生成的 SQL 查询。假设您出于好奇而这样做,这就是您需要了解的是否存在差异。因为如果你担心性能,那肯定是premature optimization。你不想写奇怪的代码,只是因为它每小时可以为你节省 100 毫秒,而且永远不会成为瓶颈,对吗? :)
  • @Servy 这是我团队中的另一个开发人员,他说使用文字生成的查询会“更直接”,它会创建类似“Entity.Blocked = 1”的东西在验证它是否为 null 或类似的东西时,他也不太确定会发生什么,但如果是文字会更好。

标签: c# .net performance entity-framework linq


【解决方案1】:

Entity Framework 关于性能的主要问题,与开发人员开发查询的方式有关。如果查询编写正确,则无需担心。

确保生成查询的最简单方法是使用 SQL Profiler。您可以在那里简单地跟踪您的查询。进一步学习可以阅读this

在您的情况下,两个生成的查询都是相同的。

我在下面开发了一个示例代码。

假设这些查询

var q1 = _roleRepository.GetAll().Where(q => q.IsDeleted).ToList();

var q2 = _roleRepository.GetAll().Where(q => q.IsDeleted == true).ToList();

SQL 分析器中的结果跟踪是:

exec sp_executesql N'SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[NormalizedName] AS [NormalizedName], 
        [Extent1].[TenantId] AS [TenantId], 
        [Extent1].[Name] AS [Name], 
        [Extent1].[DisplayName] AS [DisplayName], 
        [Extent1].[IsStatic] AS [IsStatic], 
        [Extent1].[IsDefault] AS [IsDefault], 
        [Extent1].[IsDeleted] AS [IsDeleted], 
        [Extent1].[DeleterUserId] AS [DeleterUserId], 
        [Extent1].[DeletionTime] AS [DeletionTime], 
        [Extent1].[LastModificationTime] AS [LastModificationTime], 
        [Extent1].[LastModifierUserId] AS [LastModifierUserId], 
        [Extent1].[CreationTime] AS [CreationTime], 
        [Extent1].[CreatorUserId] AS [CreatorUserId]
        FROM [dbo].[AbpRoles] AS [Extent1]
        WHERE ((([Extent1].[TenantId] IS NULL) AND (@DynamicFilterParam_000003 IS NULL)) OR (([Extent1].[TenantId] IS NOT NULL) AND (([Extent1].[TenantId] = @DynamicFilterParam_000003) OR (([Extent1].[TenantId] IS NULL) AND (@DynamicFilterParam_000003 IS NULL)))) ) AND (([Extent1].[IsDeleted] = @DynamicFilterParam_000001) ) AND ([Extent1].[IsDeleted] = 1)',N'@DynamicFilterParam_000003 int,@DynamicFilterParam_000004 bit,@DynamicFilterParam_000001 bit,@DynamicFilterParam_000002 bit',@DynamicFilterParam_000003=1,@DynamicFilterParam_000004=NULL,@DynamicFilterParam_000001=0,@DynamicFilterParam_000002=NULL

        exec sp_executesql N'SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[NormalizedName] AS [NormalizedName], 
        [Extent1].[TenantId] AS [TenantId], 
        [Extent1].[Name] AS [Name], 
        [Extent1].[DisplayName] AS [DisplayName], 
        [Extent1].[IsStatic] AS [IsStatic], 
        [Extent1].[IsDefault] AS [IsDefault], 
        [Extent1].[IsDeleted] AS [IsDeleted], 
        [Extent1].[DeleterUserId] AS [DeleterUserId], 
        [Extent1].[DeletionTime] AS [DeletionTime], 
        [Extent1].[LastModificationTime] AS [LastModificationTime], 
        [Extent1].[LastModifierUserId] AS [LastModifierUserId], 
        [Extent1].[CreationTime] AS [CreationTime], 
        [Extent1].[CreatorUserId] AS [CreatorUserId]
        FROM [dbo].[AbpRoles] AS [Extent1]
        WHERE ((([Extent1].[TenantId] IS NULL) AND (@DynamicFilterParam_000003 IS NULL)) OR (([Extent1].[TenantId] IS NOT NULL) AND (([Extent1].[TenantId] = @DynamicFilterParam_000003) OR (([Extent1].[TenantId] IS NULL) AND (@DynamicFilterParam_000003 IS NULL)))) ) AND (([Extent1].[IsDeleted] = @DynamicFilterParam_000001) ) AND (1 = [Extent1].[IsDeleted])',N'@DynamicFilterParam_000003 int,@DynamicFilterParam_000004 bit,@DynamicFilterParam_000001 bit,@DynamicFilterParam_000002 bit',@DynamicFilterParam_000003=1,@DynamicFilterParam_000004=NULL,@DynamicFilterParam_000001=0,@DynamicFilterParam_000002=NULL

一模一样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2010-11-10
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多