Всем доброго времени суток.
Имеется 3 таблицы:
В таблице AccountItems храняться элементы определенного пользователя(AccountId). У одного пользователя может быть несколько одинаковых элементов, то есть в таблице AccountItems могу содержаться дубликаты.
Таблица очень большая и растет с каждым днем. Каждую секунду в таблице AccountItems изменяються данные(добавляються, обновляються, удаляються).
Нужно оптимизировать следующие вещи:
- Необходимо для указанного AccountId фильтровать элементы по рейтингу, по имени страны и сортировать по полю Rating. В результате нужно получать список из элементов, но в списке не должно быть дублей.Также должна быть предусмотрена возможность пагинации
- Необходимо быстро удалять все дубликаты из AccountItems
Сейчас для первого запроса используется следующий запрос(он периодически падает по таймауту(1 мин), а иногда отрабатывает за долисекунды)
WITH groups as
(
select AI.*, ROW_NUMBER() OVER (PARTITION BY AI.ItemId ORDER BY AI.ItemId DESC) as row_num from AccountItems AI
inner join Items I on I.Id = AI.ItemIdId
inner join Countries C on C.Id = I.CounrtyId
where AccountId = @uniqueId
and I.Rating = @rating
and Name = @name
)
select groups.* from groups
inner join Items I on I.Id = groups.ItemId
where row_num = 1
order by I.Rating desc
OFFSET {(@page - 1) * count} ROWS FETCH NEXT {@count} ROWS ONLY";