【问题标题】:Linq to SQL PerformanceLinq to SQL 性能
【发布时间】:2010-10-08 12:39:11
【问题描述】:

简洁

如何调整我的 Linq To SQL DAL 方法的性能?特别是正在传输的数据量。

详细

我有一个 Winform 应用程序,它使用 Linq To Sql 来访问它的数据。我们有 5 个分支,其中 1 个在物理上与 SQL 服务器位于同一位置,另外 4 个在不同的距离和带宽上。我的应用是典型的 Enterprise LOB CRUD 应用。你搜索一个人,选择他们,然后当你选择一个控件时,比如说人口统计,它会加载那个人的人口统计数据并将它们显示在屏幕上。

我只存储“基石”ID,然后使用这些主键进行数据库调用。这在 Main 位置非常有效,SQL Server 在现场。但是,分支在加载某些控件时遇到了严重的延迟。

这是我的 DAL 的一个相当典型的示例(加载人员详细信息用户控件):

    public static DataTable GetGeneralPersonInfo(int personID)
    {
        using (var context = ConnectDataContext.Create())
        {
            var generalPersonInfo = from person in context.tblPersons
                                    where person.PersonID == personID
                                    join addresse in context.tblAddresses.Where(a =>a.AddressTypeID == 'm')  on person.PersonID equals
                                        addresse.PersonID 
                                    select
                                        new
                                            {
                                                person.PersonID,
                                                person.FirstName,
                                                person.MiddleName,
                                                person.LastName,
                                                person.SuffixID,
                                                person.TitleID,
                                                addresse.AddressLine1,
                                                addresse.AddressLine2,
                                                addresse.AddressLine3,
                                                addresse.CityName,
                                                addresse.StateID,
                                                addresse.ZipCode,
                                                addresse.ZipPlus,
                                                addresse.DirectionsToAddress,
                                                addresse.CountyID,
                                                person.ResidencyCountyID,
                                                person.ResponsibilityCountyID,
                                                person.EmailAddress,
                                                person.SSN,
                                                person.Gender,
                                                person.BirthDate,
                                                person.DeathDate,
                                                person.DriversLicenseNumber,
                                                person.DriversLicenseStateID,
                                                person.HispanicOriginFlag,
                                                person.CitizenFlag,
                                                person.VeteranFlag,
                                                person.MaritalStatusID,
                                                person.PrimaryRaceID,
                                                person.SecondaryRaceID,
                                                person.UpdateUserID,
                                                person.UpdateDateTime,
                                                person.InsertDateTime,
                                                person.InsertUserID,
                                            };

            return generalPersonInfo.CopyLinqToDataTable();
        }
    }

那里有什么明显的错误吗?
为了进一步披露,每个表都有一个uniqueidentifier,它不是PK。另外,我有非常宽的表格(60+ 列)和大文本字段(varchar(500 - max))。

【问题讨论】:

  • 已编辑以显示更详细的示例。
  • 仅供参考 - 我们有一个 3 mb 的 wan 到这个分支

标签: .net winforms linq performance linq-to-sql


【解决方案1】:

我只存储“keystone”的 ID 和 然后使用这些 Primary 进行数据库调用 钥匙

这是你的问题。

假设您为 100 个键加载实体。

  • 本地分支,1ms 延迟。仅对于网络来说就是 100 毫秒。 0.1 秒 - 性能“还可以”。

  • 远程分支,比如说 60 毫秒的延迟。仅对于网络而言,这就是 6000 毫秒。 6 秒。它只会从那里下降。

15 年前教给我的旧规则:不要为层级边界编写聊天界面。尽量少打电话。你用尽可能多的 calöls 制作了一个界面。

剩下的就是缓存(lare 字段 - 它们多久更改一次?)。

【讨论】:

  • 你是说我应该拉下整个对象并存储它们吗?我想我在这里遗漏了一些东西。你是说我的“实时”延迟来自打开和关闭数百个连接的继承网络延迟,而不是来自管道中提取的数据量?
  • 不是,因为传输 SQL 命令和等待答案的延迟。每次您按 ID 请求对象(而不是按 ID 列表的对象列表)时,查询都会到达服务器,然后返回答案。这种延迟依赖于在远程连接中快速增加广告。重写您的用法以尽可能少地调用数据库。如果需要,开始使用服务器端 DAL。
  • 我的应用是偶尔断开连接的应用,因此没有服务器端 DAL :(.
  • 为了我自己的清楚,我将尝试重申我相信您所说的内容:现在,当您选择一个人时,我会存储 PersonID、AddressID、PhoneID。然后,当您转到某个控件时,它使用存储的 ID(数据库中的 PK)来调用数据库并检索必要的信息。你说这是错误的,我应该第一次调用整个 Person Object(tblPerson)?
  • 视情况而定。我要说的是,当您通过慢速网络再拨打 3 通电话时,您拨打 3 通电话而不是 1 通电话需要时间。我曾经设计过一个 ORM(长期销售和专有),那里的 API 明确地允许我捆绑查询并将它们提交到服务器端 DAL 一次往返。往返会引入网络延迟。我的办公室通过 100 毫秒的延迟连接到我的托管集群。如果它发生的频率比需要的多,那就很重要了。远不止一次传输 10kb 的数据。
【解决方案2】:

我猜这与您的分支连接到数据库所在的主要位置有关。如果您在主分支获得了不错的性能,但异地分支位置都表现缓慢,则可能与您的数据库查询无关。

【讨论】:

  • 谢谢,所以您看不出上面有什么明显的问题吗?我们的网络团队坚持认为我们有大量的带宽可以连接到分支机构。
  • 只要它在主分支上运行良好,问题就在两者之间。查询不仅运行速度较慢,因为它们认识到它们来自外部来源。而且您的查询是如此基本,以至于我怀疑可以进行很多优化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多