У меня довольно хлопотная таблица, которая выглядит так:
EventTimeLog
Id (bigint) | Time (datetime) | LogId (FK to Log tables Id column)
В этой таблице указано, сколько раз произошло событие журнала. Таким образом, можно записать только одно уникальное событие журнала, а время появления этих журналов можно получить из этой таблицы.
Проблема в том, что даты настолько специфичны, и эти даты могут иметь повторяющиеся значения. Пример:
2015-08-03 23:54:58.000 | 1983
2015-08-03 23:54:58.000 | 1934
2015-08-03 23:54:56.000 | 1647
Через некоторое время запрос становится очень трудным. Обычно около 500 тысяч строк или около того, он начинает пыхтеть, даже если я помещаю индекс в LogId и Time. К тому времени, как я достигаю диапазона в 1 милю и выше, запросы замедляются до ползания ...
Мне действительно нужно это конкретное время, поэтому агрегирование по началу часа или дня - не вариант. Я также сомневаюсь, что реализация столбцов Count для повторяющихся значений времени поможет во многом, поскольку эти даты настолько детализированы. Индексу все равно придется перескакивать через все эти конкретные даты, что происходит очень медленно.
Я не знаю, как сделать эту таблицу более масштабируемой. Может быть, разбить это на ежемесячные таблицы?
По запросу, вот используемый запрос, который начинает пыхтение
SELECT b.User, b.Ip, b.AccountId, a.Time FROM
EventTimeLog a
inner join [Log] b on a.LogId = b.Id
WHERE
b.UserId = '<param>' AND
a.Time >= '<param>' AND
a.Time <= '<pamam>'
Если разница во времени> 2 дней, он пыхтит как сумасшедший. И да, у меня есть индексы в журнале для UserId.