Linq to SQL Performance - PullRequest
       1

Linq to SQL Performance

1 голос
/ 08 октября 2010

Succinct

Как мне настроить производительность моих методов Linq To SQL DAL? В частности, объем передаваемых данных.

Многословный

У меня есть приложение Winform, которое использует Linq To Sql для доступа к своим данным. У нас есть 5 филиалов, 1 физически в том же месте, что и сервер SQL, а остальные 4 - на разных расстояниях и пропускной способности. Мое приложение - ваше типичное приложение Enterprise LOB CRUD. Вы ищете человека, выбираете его, а затем, когда вы выбираете элемент управления, скажем, Демография, он загружает демографию этого человека и отображает его на экране.

Я сохраняю только идентификаторы «ключевых камней», а затем выполняю вызовы БД с использованием этих первичных ключей. Это прекрасно работает в основном месте, с 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) ).

Ответы [ 2 ]

3 голосов
/ 08 октября 2010

Я храню только идентификаторы "key stone" и затем сделать вызовы БД, используя эти первичные Ключи

Это ваша проблема.

Предположим, вы загружаете сущности для 100 ключей.

  • Местное отделение, время ожидания 1 мс. Это 100 мс только для сети. 0,1 секунды - производительность в порядке.

  • Удаленная ветвь, скажем, с задержкой 60 мс. Это 6000 мс только для сети. 6 секунд И оттуда только спускается.

Старое правило, преподанное мне 15 лет назад: НЕ ПИШИТЕ ЧАТТИ ИНТЕРФЕЙСОВ НА ГРАНИЦУ. Сделайте как можно меньше звонков. Вы создали интерфейс с максимально возможным количеством калелей.

Остальное - кеширование (пустые поля - как часто они меняются?).

2 голосов
/ 08 октября 2010

Я предполагаю, что это как-то связано с подключением ваших филиалов к основному месту, где находится БД.Если вы получаете приличную производительность в основной ветви, но все внешние филиалы работают медленно, вероятно, это не имеет никакого отношения к вашему запросу в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...