Задать вопрос
@VanilaSpirit

Как правильно сделать индексирование в entity framework?

У меня есть основная таблица Users:
{
			public int Id { get; set; }
                        public int Age { get; set; }
                        public string Name { get; set; }
                        public string Status { get; set; }
		}


В ней уже содержится порядка 350к записей(сгенерировал ради нагруз. тестов)
Делая выборки через linq:
Условно -
context.Users.Where(x=>x.Name == name && x.Age == age).FirstOrDefault(x => x.Status == status);


Если запускать на локалке такой код - не беда, небольшой скачок по ЦП и мгновенная загрузка страницы
Если прогнать его через нагруз. тесты(скажем 20 обращений каждую секунду) - то нагрузка уже будет существенная и запрос уже обрабатываться не секунду, а секунд 6.

Слышал что в такой ситуации индексирование помогает оптимизировать выборку данных, но толком как применить ее - не совсем понял. Нужно лишь указать [Index] под Id? И применится ли индексирование к уже 350к существующим записям?

Можете на примере выше показать как сделать индексирование и мб есть еще варианты ускорить обработку запросов?
  • Вопрос задан
  • 239 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@Jewish_Cat
Увлекаюсь C#
Тут Efcore не причем. Efcore всего лишь переводит твой код в SQL запрос и отправляет в бд. Если тебе не нужно отслеживать ентити, то используй AsNoTracking(). Позволит тебе еще быстрее отработать.
Тебе нужно бд оптимизировать.
Как ты уже сказал, индекс правильная идея. Тебе нужно индексировать твой Name и Age. Тогда выборка данных будет существенней быстрее
Ответ написан
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
1. Включите логирование запросов
https://www.entityframeworktutorial.net/efcore/log...

2. Получите ваш запрос
3. Посмотрите план исполнения в Management Studio
4. Добавьте индексы на таблицу
5. При необходимости смените тип поля с Nvarchar(MAX) на Nvarchar(100) аттрибут [MaxLength(100)]
6. Поиграйтесь порядком context.Users.Where(x=>x.Name == name && x.Age == age) context.Users.Where(x=>x.Age == age && x.Name == name)
7. Добавьте индексы в management studio посмотрите что получилось (запрос должен быть доли секунды)
8. Добавьте создание индексов в модель
https://docs.microsoft.com/ru-ru/ef/core/modeling/...

public class User
    {
        [Key]
        public int Id { get; set; }
        public int Age { get; set; }
        [MaxLength(60)]
        public string Name { get; set; }
        [MaxLength(20)]
        public string Status { get; set; }
        public override string ToString() => $"id: {Id} Name: {Name} Age: {Age} Status: {Status}";
    }
public class UserContext : DbContext
    {
        public static readonly ILoggerFactory LoggerFactory
            = new LoggerFactory(new[] {
                new ConsoleLoggerProvider((category, level) =>
                    category == DbLoggerCategory.Database.Command.Name &&
                    level == LogLevel.Information, true)
            });

        public UserContext() : base()
        {

        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                .UseLoggerFactory(LoggerFactory) // для отключения логгирования закоменнтировать строку
                .EnableSensitiveDataLogging() // для отключения логгирования закоменнтировать строку
                .UseSqlServer(@"Server=.;Database=UserTestDB;Trusted_Connection=True;");
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>()
                .HasIndex(b => b.Status)
                .HasName("IX_Status");
            modelBuilder.Entity<User>()
                .HasIndex(b => b.Age)
                .HasName("IX_Age");
            modelBuilder.Entity<User>()
                .HasIndex(b => b.Name)
                .HasName("IX_Name");
        }

        public DbSet<User> Users { get; set; }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы