Мне нужно запросить записи из базы данных DB2 с помощью LINQ. У меня есть объекты, созданные на основе схемы БД, и я пытаюсь выполнить запрос LINQ с помощью Skip and Take. Базовая таблица содержит около 25 столбцов и, возможно, миллион записей. Когда я выполняю запрос без «Skip()», его выполнение занимает примерно 0,508 миллисекунды. Когда я включаю Skip(), это занимает около 30 секунд. Большая разница.
Может кто-нибудь сказать мне, почему это происходит?
ОБНОВЛЕНИЕ: > Вот запрос LINQ, который я использую.
var x = 30;
var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.ToList();
ОБНОВЛЕНИЕ: Я только что попробовал обновить запрос, чтобы возвращать только один столбец, ASSET_ID. Когда я возвращаю только один столбец, запрос С Skip() занимает всего 0,256 миллисекунды.
var x = 30;
var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.Select(c => c.ASSET_ID)
.ToList();
Если я включаю какие-либо дополнительные столбцы, время выполнения запроса увеличивается ЗНАЧИТЕЛЬНО.
Например, выполнение запроса ниже занимает 10 секунд.
var x = 30;
var results = context.ASSET_T
.OrderBy(c => c.ASSET_ID)
.Skip(x)
.Take(x)
.Select(c => new {
ASSET_ID = c.ASSET_ID,
ASSET_TYP = c.ASSET_TYP
ASSET_DESC = c.ASSET_DESC
})
.ToList();
ОБНОВЛЕНИЕ: Я обнаружил, что существуют проблемы (возможно, связанные с индексом) со столбцами в таблице, которую я пытаюсь запросить. Как я упоминал выше, когда я выполняю запрос, который возвращает только столбец ASSET_ID, это занимает всего 0,256 миллисекунды. Если я попытаюсь выполнить запрос, который ONLY возвращает ASSET_DESC, или запрос, который ONLY возвращает ASSET_TYP, тогда выполнение запроса время подскакивает примерно до 9 секунд.
Означает ли это, что эти другие столбцы в настоящее время не индексируются?
ОБНОВЛЕНИЕ:
ОБНОВЛЕНИЕ:
Означает ли это, что эти другие столбцы в настоящее время не индексируются?
ОБНОВЛЕНИЕ:
Strong> Я добавил вывод SQL из приведенного выше запроса LINQ.
SELECT
Project1.C1 AS C1,
Project1.ASSET_ID AS ASSET_ID,
Project1.ASSET_TYP AS ASSET_TYP,
Project1.ASSET_DESC AS ASSET_DESC
FROM ( SELECT Project1.ASSET_ID AS ASSET_ID, Project1.ASSET_TYP AS ASSET_TYP, Project1.ASSET_DESC AS ASSET_DESC, Project1.C1 AS C1, row_number() OVER (ORDER BY Project1.ASSET_ID ASC, Project1.ASSET_TYP ASC, Project1.ASSET_DESC ASC) AS row_number
FROM ( SELECT
Extent1.ASSET_ID AS ASSET_ID,
Extent1.ASSET_TYP AS ASSET_TYP,
Extent1.ASSET_DESC AS ASSET_DESC,
CAST(1 AS int) AS C1
FROM MYDB.ASSET_T AS Extent1
) AS Project1
) AS Project1
WHERE Project1.row_number > 1
ORDER BY Project1.ASSET_ID ASC, Project1.ASSET_TYP ASC, Project1.ASSET_DESC ASC FETCH FIRST 31 ROWS ONLY
Подробнее здесь: https://stackoverflow.com/questions/199 ... for-paging
ЧРЕЗВЫЧАЙНО низкая производительность запросов LINQ при использовании Skip/Take для пейджинга ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Я пытаюсь разбить на страницы, используя подход Skip Take в коде Frist, но возникла ошибка
Anonymous » » в форуме C# - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-