@melny

Как провести оптимизацию для огромной таблицы в базе SQL Server?

Всем доброго времени суток.

Имеется 3 таблицы:
5b6da745cc1c2928076382.png

В таблице AccountItems храняться элементы определенного пользователя(AccountId). У одного пользователя может быть несколько одинаковых элементов, то есть в таблице AccountItems могу содержаться дубликаты.

Таблица очень большая и растет с каждым днем. Каждую секунду в таблице AccountItems изменяються данные(добавляються, обновляються, удаляються).

Нужно оптимизировать следующие вещи:
  1. Необходимо для указанного AccountId фильтровать элементы по рейтингу, по имени страны и сортировать по полю Rating. В результате нужно получать список из элементов, но в списке не должно быть дублей.Также должна быть предусмотрена возможность пагинации
  2. Необходимо быстро удалять все дубликаты из 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";
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ponaehal
1. Появление дублей в таблице лучше исключить в принципе, а не чистить постфактум. В целом это создаст более равномерное распределение данных по блокам БД и положительно скажется на общей производительности. Если дубли "плодит" какое то приложение, на которое Вы не можете повлиять, то рассмотрите возможность применения триггеров на таблице AccountItems .
2. В результате выполнения п.1. Ваш запрос станет проще. А если еще посмотрите в план запроса, добавите необходимые индексы, разобьете AccountItems на партиции, то есть шанс сделать совсем хорошо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы