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

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

Похожие вопросы