Платформа Entity Framework занимает около 10 минут, чтобы получить данные из Azure SQL
У меня есть база данных Azure SQL, в которой я записываю журналы чата, которые позже анализирую. Вначале запрос был в порядке, но в настоящее время он содержит около 11 миллионов записей, и мне потребовалось 586 секунд, чтобы получить данные.
Моя модель
public class Messages
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Index]
public DateTime Timestamp { get; set; }
public string Message { get; set; }
public string Username { get; set; }
public int ChannelId { get; set; }
[ForeignKey("ChannelId")]
public virtual Channel Channel { get; set; }
}
Вызов базы данных
IEnumerable<Messages> messages = context.Messages.AsNoTracking()
.Where(x => x.Channel.ChannelName == Channelname &&
x.Timestamp > StartTime &&
x.Timestamp < EndTime).ToArray();
Данные после вставки только для чтения. Я пытался индексировать столбец меток времени, но, похоже, это не помогло. Данные также сортируются по дате и времени, поэтому я не понимаю, почему это занимает так много времени.
ОБНОВИТЬ:
Я сделал несколько бешмарков
Мой путь Channel.ChannelName == Название канала: 4:35
Мой путь Channel.ChannelId == Id: 16sec
Предложенный ответ: 4:30
Рекомендуется с идентификатором: 16 сек
образец был 40k результатов.
Как это исправить? Могу ли я оптимизировать больше?
1 ответ
Есть ли в вашей таблице каналов правильные ключи и индексы? Также попробуйте отфильтровать свойства, которые не являются внешними таблицами первыми (например, Channel).
var messages = context.Messages.AsNoTracking()
.Where(m => (m.Timestamp > StartTime) && (m.Timestamp < EndTime))
.Where(x => x.Channel.ChannelName == Channelname)
.ToArray();