gpt4 book ai didi

c# - 从 2 个查询中选择更好的查询,都返回相同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 17:57:33 25 4
gpt4 key购买 nike

我有两个不同的 sql 查询,一个由我编写,一个由 C# 在与 linq 一起使用时自动生成,两者都给出相同的结果。

不知道选哪一个,我正在寻找

  • 当所有查询都返回相同的结果(最优化的查询)时,从众多查询中选择一个查询的最佳方法是什么。
  • 在我的查询中(如下所述),我应该选择哪一个。

  • 手写
    select * from People P
    inner join SubscriptionItemXes S
    on
    P.Id=S.Person_Id
    inner join FoodTagXFoods T1
    on T1.FoodTagX_Id = S.Tag2

    inner join FoodTagXFoods T2
    on T2.FoodTagX_Id = S.Tag1

    inner join Foods F
    on
    F.Id= T1.Food_Id and F.Id= T2.Food_Id

    where p.id='1'

    由 LINQ 自动生成
    SELECT 
    [Distinct1].[Id] AS [Id],
    [Distinct1].[Item] AS [Item]
    FROM ( SELECT DISTINCT
    [Extent2].[Id] AS [Id],
    [Extent2].[Item] AS [Item]
    FROM [dbo].[People] AS [Extent1]
    CROSS JOIN [dbo].[Foods] AS [Extent2]
    INNER JOIN [dbo].[FoodTagXFoods] AS [Extent3]
    ON [Extent2].[Id] = [Extent3].[Food_Id]
    INNER JOIN [dbo].[SubscriptionItemXes] AS [Extent4]
    ON [Extent1].[Id] = [Extent4].[Person_Id]
    WHERE (N'rusi' = [Extent1].[Name]) AND ( EXISTS (SELECT
    1 AS [C1]
    FROM [dbo].[FoodTagXFoods] AS [Extent5]
    WHERE ([Extent2].[Id] = [Extent5].[Food_Id])
    AND ([Extent5].[FoodTagX_Id] = [Extent4].[Tag1])
    )) AND ( EXISTS (SELECT
    1 AS [C1]
    FROM [dbo].[FoodTagXFoods] AS [Extent6]
    WHERE ([Extent2].[Id] = [Extent6].[Food_Id])
    AND ([Extent6].[FoodTagX_Id] = [Extent4].[Tag2])
    ))
    ) AS [Distinct1]

    执行计划结果

    手写:查询成本(相对于批处理):33%

    Linq 生成:查询成本(相对于批处理):67%

    最佳答案

    我发现两种不同的查询,一种是手写的,另一种是由 Linq 生成的,看起来可能大相径庭,但实际上,当您在 SSMS 中分析查询计划时,您会发现它们实际上几乎相同。

    您需要使用 Display Actual Execution Plan 在 SSMS 中实际运行这些查询。打开电源,分析不同的计划。这是正确分析两者并找出哪个更好的唯一方法。

    总的来说,Linq 实际上非常擅长生成高效的查询;即使实际的 SQL 本身非常丑陋(在某些情况下,这是人类如果有时间就会编写的那种 SQL!)。当然,也就是说,它也可以生成一些 pig !

    此外,要求 SO 帮助执行对这么多表的查询对我们来说充满了问题,因为它将由您的索引管理:)

    关于c# - 从 2 个查询中选择更好的查询,都返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7327050/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com