Более эффективный SQL для извлечения тысяч записей в представлении - PullRequest
0 голосов
/ 05 октября 2010

Я использую Linq to Sql в качестве ORM, и у меня есть список идентификаторов (до нескольких тысяч), переданных в мой метод получения, и с этим списком я хочу получить все записи пользователя, которые соответствуют этим уникальным идентификаторам.Чтобы уточнить, представьте, что у меня есть что-то вроде этого:

List<IUser> GetUsersForListOfIds(List<int> ids)
{
        using (var db = new UserDataContext(_connectionString))
        {
            var results = (from user in db.UserDtos
                           where ids.Contains(user.Id)
                           select user);

            return results.Cast<IUser>().ToList();
        }
}

По сути, это переводится в SQL как

select * from dbo.Users where userId in ([comma delimmited list of Ids])

Я ищу более эффективный способ сделать это.Проблема в том, что предложение in в sql занимает слишком много времени (более 30 секунд).

Ответы [ 2 ]

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

Потребуется больше информации о настройке вашей базы данных, такой как индекс и тип сервера (пост Митча Уитата). Тип базы данных также поможет, некоторые базы данных плохо обрабатываются в пунктах.

С точки зрения устранения неполадок ... Вы изолировали задержку для сервера sql? Можете ли вы выполнить запрос непосредственно на своем сервере и подтвердить, что этот запрос занимает дополнительное время?

Выбор * также может немного повлиять на производительность ... Не могли бы вы сузить набор результатов, который возвращается только к нужным столбцам?

edit: только что увидел добавленный вами "просмотр комментария" ... В прошлом у меня были проблемы с производительностью просмотра. Это материализованный взгляд ... или вы можете сделать его одним? Воссоздание логики представления в качестве хранимой процедуры также может помочь.

0 голосов
/ 05 октября 2010

Вы пытались преобразовать это в список, чтобы приложение делало это в памяти? i.e.:

List<IUser> GetUsersForListOfIds(List<int> ids)
{
        using (var db = new UserDataContext(_connectionString))
        {
            var results = (from user in db.UserDtos.ToList()
                           where ids.Contains(user.Id)
                           select user);

            return results.Cast<IUser>().ToList();
        }
}

Очевидно, что это будет занимать много памяти, если он запускается на общедоступной странице на сильно пострадавшем сайте. Если это все еще занимает более 30 секунд, хотя в стадии подготовки / разработки, то я предполагаю, что само представление занимает слишком много времени для обработки -ИЛИ- вы передаете 10 МБ данных каждый раз, когда вы получаете представление. В любом случае, мои единственные предложения - получить прямой доступ к таблице и получить только те данные, которые вам нужны, переписать представление или создать новое представление для этого конкретного сценария.

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