Платформа 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();
Другие вопросы по тегам