2015-09-22 7 views
0

У меня есть база данных Azure sql, в которой я записываю журналы чата, которые позже анализирую. Запрос был в порядке, но в настоящее время он имеет около 11 миллионов записей, и мне потребовалось 586 секунд, чтобы получить данные.Структура Entity занимает около 10 минут, чтобы получить данные из Azure sql

Моя модель

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(); 

данных после вставки только для чтения. Я попытался индексировать столбец timestamp, но, похоже, не помог. Данные также сортируются по дате, поэтому я не понимаю, почему так долго.

UPDATE:

Я некоторые bechmarks

Мой путь Channel.ChannelName == Channelname: 4:35

Мой путь Channel.ChannelId == Id: 16sec

Отдается ответ : 4:30

Предлагается с идентификатором: 16 с

образец был 40k результатов.

Как исправить это? Могу ли я оптимизировать больше?

+0

Если вы создали Хранимую процедуру и передали ей параметры, вы быстро получаете результаты? Ответ на этот вопрос скажет нам, искать ли в БД или код для ответов. –

+0

Попробуйте запустить сгенерированный SQL в SQL-менеджере, также запустить анализатор запросов против него – 3dd

+0

Сколько строк в вашем результате? –

ответ

2

Есть ли в вашем канале таблицы соответствующие ключи и индексы? Также попробуйте свойства фильтрации, которые не являются внешними таблицами в первую очередь (например: Канал).

var messages = context.Messages.AsNoTracking() 
     .Where(m => (m.Timestamp > StartTime) && (m.Timestamp < EndTime)) 
     .Where(x => x.Channel.ChannelName == Channelname) 
     .ToArray(); 
+0

эй, похоже, что вы правы о части клавиш, как мне его исправить ? – sinofis

+0

Прежде всего убедитесь, что ваш идентификатор отмечен как «Ключ» в таблице вашего канала. Затем вы можете попробовать добавить [Index] к идентификатору каждой из ваших таблиц. Я также хотел бы удалить [Index] из вашей метки времени. – vidalsasoon