Мне сложно оптимизировать запрос фильтра для списка проектов всякий раз, когда я фильтрую его по подстроке темы. Иногда поиск занимает целую минуту — и DTU в моем небесном приложении Azure взлетает до 100 %.
Это запрос LINQ:
Код: Выделить всё
if (!Filter.Client.IsNullOrEmpty())
{
var searchedTerm = Filter.Client;
query = query.Where(p =>
p.AddressBookLinkage
.Any(linkage => (linkage.MainContactId == null
? linkage.MainSubject.Name
: linkage.MainContact.Name).Contains(searchedTerm)));
var sqlQuery = query.ToList();
}
Это сгенерированный SQL подзапроса, который обрабатывает фильтр для этого столбца
Код: Выделить всё
SELECT 1
FROM [AddressBookProjectLinkages] AS [a]
LEFT JOIN [Subjects] AS [s] ON [a].[MainSubjectId] = [s].[Id]
LEFT JOIN [Contacts] AS [c] ON [a].[MainContactId] = [c].[Id]
WHERE ([p].[Id] = [a].[ProjectId]) AND ((@__searchedTerm_2 LIKE N'') OR (CHARINDEX(@__searchedTerm_2, CASE
WHEN [a].[MainContactId] IS NULL THEN [s].[Name]
ELSE [c].[Name]
END) > 0)))
ORDER BY [p].[Id]
Другой вопрос, который возникает, заключается в том, достаточно ли моего плана Azure SQL-сервера. Я использую уровень Standard с 10 DTU. Используется только около 275 МБ пространства БД.
- Я установил индекс по имени субъекта и контактного лица только для того, чтобы понять, что индекс, вероятно, игнорируется. как только я использую условия SQL CHARINDEX или LIKE.
- Я реализовал полнотекстовый поиск в своей базе данных и установил индекс для этих двух столбцов, но затем понял, что FTS не используется для поиска подстрок. .
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-too-slow
Мобильная версия