У меня есть таблица с более чем 20 миллионами записей.
Структура как:
EventId UNIQUEIDENTIFIER
SourceUserId UNIQUEIDENTIFIER
DestinationUserId UNIQUEIDENTIFIER
CreatedAt DATETIME
TypeId INT
MetaId INT
Таблица получает около 100 тыс. + Записей каждый день.
У меня есть индексы для каждого столбца, кроме MetaId, так как он не используется в предложениях 'where'
Проблема в том, когда я хочу забрать, например. последние 100 записей для желаемого SourceUserId
Выполнение запроса иногда занимает до 4 минут, что недопустимо.
Например.
SELECT TOP 100 * FROM Events WITH (NOLOCK)
WHERE SourceUserId = '15b534b17-5a5a-415a-9fc0-7565199c3461'
AND
(
TypeId IN (2, 3, 4)
OR
(TypeId = 60 AND SrcMemberId != DstMemberId)
)
ORDER BY CreatedAt DESC
Я не могу выполнять разбиение и т. Д., Поскольку я использую стандартную версию SQL Server, а Enterprise слишком дорогой.
Я также думаю, что стол достаточно мал, чтобы быть таким медленным.
Я думаю, что проблема в предложении ORDER BY, так как db должен проходить через гораздо больший набор данных.
Есть идеи, как сделать это быстрее?
Возможно, реляционная база данных не очень хорошая идея для таких данных.
Данные всегда собираются по заказу CreatedAt DESC
Спасибо за чтение.
PabloX