Более эффективна SQL для retreiving тысяч записей на VEW

голоса
0

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

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])

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

Есть предположения?

Задан 05/10/2010 в 14:37
пользователем
На других языках...                            


2 ответов

голоса
1

Буду необходима дополнительная информация о вашей установке базы данных, как индекс и типа сервера (пост Mitch Wheat в). Тип базы данных поможет, а некоторые базы данных обрабатывать в пунктах плохо.

Из поиска неисправностей точки зрения ... Вы выделили время задержку на сервер SQL? Вы можете выполнить запрос непосредственно на сервере и убедитесь, что это запрос принимает дополнительное время?

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

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

Ответил 05/10/2010 в 15:23
источник пользователем

голоса
0

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

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 + секунд, хотя в промежуточном / развитии, то я думаю, что сама View занимает много времени, чтобы обработать -или- вы переносите 10-х мегабайт данных каждый раз, когда вы извлекаете вид. В любом случае, только мои предложения должны получить доступ к таблице напрямую, а только получить данные, которые нужны, переписать вид, или создать новое представление для этого конкретного сценария.

Ответил 05/10/2010 в 18:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more