Entity Framework Core: Skip Take Проблема производительностиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Entity Framework Core: Skip Take Проблема производительности

Сообщение Anonymous »

Я сталкиваюсь с странной проблемой с EF Core 8.017. < /p>
У меня есть запрос, который ищет таблицу метаданных документов. Текст документа - это столбец с полным текстовым каталогом, который запрашивается с использованием метода ef.functions.contains .
Когда я выполняю этот запрос, используя Skip //, Query Times Out. Когда я выполняю этот запрос без Skip /, это занимает немного времени, но в конечном итоге возвращает набор результатов.
Я могу отлаживать SQL, и когда я запускаю его непосредственно в SSM, запрос требует менее чем секунду.

Код: Выделить всё

DocumentRepository.cs
:

Код: Выделить всё

var documents = _context.Document
.Include(d => d.DocumentType).AsSplitQuery().AsNoTracking()
.Include(d => d.DocumentStatus).AsSplitQuery().AsNoTracking()
.Include(d => d.OriginationType).AsSplitQuery().AsNoTracking()
.Where(d => d.DeleteDate == null)
.AsNoTracking()
.AsQueryable();

if (!string.IsNullOrEmpty(documentSearchParams.DocumentText))
{
documents = documents.Where(d => EF.Functions.Contains(d.DocumentText, searchCondition.ToString()));
}

if (!string.IsNullOrEmpty(documentSearchParams.DocumentTitle))
{
documents = documents.Where(d => d.Title.Contains(documentSearchParams.DocumentTitle));
}

// and adding other search parameters

// SET SORT ORDER
documents = documents.OrderBy(d => d.CreateDate);

// Downselect to only return necessary fields for search results
var d = documents.Select(doc => new Document()
{
DocumentId = doc.DocumentId,
PublicationDate = doc.PublicationDate,
Title = doc.Title,
DocumentNumber = doc.DocumentNumber,
Author = doc.Author,
DocumentType = doc.DocumentType,
DocumentTypeId = doc.DocumentTypeId,
DocumentStatus = doc.DocumentStatus,
DocumentStatusId = doc.DocumentStatusId,
Summary = doc.Summary,
Keywords = doc.Keywords,
FileName = doc.FileName,
DocumentPersons = doc.DocumentPersons,
CreatedPerson = doc.CreatedPerson,
CreatedPersonId = doc.CreatedPersonId,
CreateDate = doc.CreateDate,
UpdateDate = doc.UpdateDate,
UpdatedPersonId = doc.UpdatedPersonId,
UpdatedPerson = doc.UpdatedPerson
});

return await PagedList.CreateAsync(d, documentSearchParams.PageNumber, documentSearchParams.PageSize);
< /code>
PagedList.cs
:

Код: Выделить всё

public static async Task
> CreateAsync(IQueryable source, int pageNumber, int pageSize)
{
var count = await source.CountAsync();
var items = new List();

if (count >  pageSize)
{
var numberToSkip = pageSize * pageNumber;

source = source
.Skip(numberToSkip)
.Take(pageSize);

items = await source.ToListAsync();
}
else
{
items = await source.ToListAsync();
}

return new PagedList(items, count, pageNumber, pageSize);
}
< /code>
Debugging the resulting SQL query:
DECLARE @__8__locals1_documentSearchParams_DocumentText_0_contains nvarchar(4000) = N'%test%';
DECLARE @__Trim_1_contains nvarchar(4000) = N'%test%';
DECLARE @__ToString_3 nvarchar(4000) = N'"*test*"';
DECLARE @__p_4 int = 0;
DECLARE @__p_5 int = 3;

SELECT [t].[DocumentId], [t].[PublicationDate], [t].[Title], [DocumentNumber], [t].[Author], [d0].[DocumentTypeId], [d0].[Code], [d0].[CreateDate], [d0].[CreatedPersonId], [d0].[DeleteDate], [d0].[DeletedPersonId], [d0].[IsActive], [d0].[Name], [d0].[SortOrder], [d0].[UpdateDate], [d0].[UpdatedPersonId], [t].[DocumentTypeId], [d1].[DocumentStatusId], [d1].[Description], [d1].[SortOrder], [d1].[StatusCode], [t].[DocumentStatusId], [t].[Summary], [t].[Keywords], [t].[FileName], [t].[MissionAreaId], [p].[PersonId], [p0].[PersonId], [d3].[DocumentId], [d3].[PersonId], [p].[DomainName], [p].[Email], [p].[FirstName], [p].[LastName], [p].[ObjectName], [t].[CreatedPersonId], [t].[CreateDate], [t].[UpdateDate], [t].[UpdatedPersonId], [p0].[DomainName], [p0].[Email], [p0].[FirstName], [p0].[LastName], [p0].[ObjectName]
FROM (
SELECT [d].[DocumentId], [d].[Author], [d].[AuthorIdList], [d].[Budget], [d].[ClassificationTypeId], [d].[ClassifiedTitle], [d].[CreateDate], [d].[CreatedPersonId], [d].[DocumentNumber], [d].[DocumentStatusId], [d].[DocumentTypeId], [d].[FileName], [d].[IsProtected], [d].[Keywords], [d].[MissionAreaId], [d].[OriginatingGroup], [d].[PublicationDate], [d].[ReviewId], [d].[SortingTitle], [d].[Summary], [d].[Title], [d].[UpdateDate], [d].[UpdatedPersonId]
FROM [Document] AS [d]
WHERE [d].[Title] LIKE @__8__locals1_documentSearchParams_DocumentText_0_contains ESCAPE N'\' OR [d].[DocumentNumber] LIKE @__Trim_1_contains ESCAPE N'\' OR CONTAINS([d].[DocumentText], @__ToString_3) OR LOWER([d].[Summary]) LIKE @__8__locals1_documentSearchParams_DocumentText_0_contains ESCAPE N'\' OR [d].[Author] LIKE @__8__locals1_documentSearchParams_DocumentText_0_contains ESCAPE N'\' OR [d].[Title] LIKE @__8__locals1_documentSearchParams_DocumentText_0_contains ESCAPE N'\'
ORDER BY [d].[PublicationDate] DESC
OFFSET @__p_4 ROWS FETCH NEXT @__p_5 ROWS ONLY
) AS [t]
LEFT JOIN [DocumentType] AS [d0] ON [t].[DocumentTypeId] = [d0].[DocumentTypeId]
LEFT JOIN [DocumentStatus] AS [d1] ON [t].[DocumentStatusId] = [d1].[DocumentStatusId]
INNER JOIN [Person] AS [p] ON [t].[CreatedPersonId] = [p].[PersonId]
INNER JOIN [Person] AS [p0] ON [t].[UpdatedPersonId] = [p0].[PersonId]
LEFT JOIN [DocumentPerson] AS [d3] ON [t].[DocumentId] = [d3].[DocumentId]
ORDER BY [t].[PublicationDate] DESC, [t].[DocumentId], [d0].[DocumentTypeId], [d1].[DocumentStatusId], [p].[PersonId], [p0].[PersonId], [d3].[DocumentId], [d3].[PersonId]
< /code>
Any thoughts as to why the EF.Function.Contains
в запросе вместе с Skip и Take вызывает тайм -аут (около 30 секунд), при отладке запрос в SSM займет только 1 секунду, чтобы закончить?

Подробнее здесь: https://stackoverflow.com/questions/796 ... ance-issue
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Я пытаюсь разбить на страницы, используя подход Skip Take в коде Frist, но возникла ошибка
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • ЧРЕЗВЫЧАЙНО низкая производительность запросов LINQ при использовании Skip/Take для пейджинга
    Anonymous » » в форуме C#
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Linq Paging с использованием Skip and Take возвращает неверный результат
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Производительность Skip and Take в Linq to Objects
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Получение COUNT и SKIP TAKE за одну операцию с помощью Linq to Entities
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»