Сначала код EF 6.2, простой запрос занимает очень много времени - PullRequest
0 голосов
/ 17 декабря 2018

В старом приложении БД я бы хотел начать переход к подходу, основанному на коде.

В базе данных много SP, триггеров, функций и т. Д., Что делает их подверженными ошибкам.

Для начала я хотел бы получить подтверждение концепции, поэтому я начал с нового решения, в котором импортировал всю базу данных (Добавить новый элемент -> Модель данных сущности ADO.NET -> Код сначала избаза данных)

В качестве простого первого шага я хотел запросить 1 столбец 1 таблицы.Таблица содержит около 5 тыс. Строк, и в результате получается 3 тыс. Строк.Теперь это занимает более 90 секунд!

Вот код запроса:

    static void Main(string[] args)
    {
        using (var db = new Model1())
        {
            var theList = db.T_MyTable.AsNoTracking()
                .Where(t => t.SOME_UID != null)
                .OrderBy(t => t.SOMENAME)
                .Select(t => t.SOMENAME)
                .ToList();
            foreach (var item in theList)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("Number of names: " + theList.Count());
        }
        Console.ReadKey();
    }

В сгенерированном коде таблицы я добавил тип столбца «VARCHAR» во все строковые поля / столбецсвойства:

    [Column(TypeName = "VARCHAR")] // this I added to all of the string properties
    [StringLength(50)]
    public string SOME_UID { get; set; }

Полагаю, я пропустил важный шаг, не могу поверить, что первый запрос кода слишком медленный.

1 Ответ

0 голосов
/ 17 декабря 2018

Я понял, что основной причиной является огромный контекст, который необходимо построить, существующий из более 1000 таблиц / файлов.

Как я нашел проблему: с помощью профилировщика я заметил, что ожидаемый запрос попадает в базу данныхпримерно через 90 секунд, сообщая, что сам запрос быстрый.Затем я попробовал тот же код в новом проекте, где я импортировал только одну таблицу, к которой у меня есть доступ.

Еще одно доказательство того, что это связано с контекстом, - выполнение запроса дважды в одном сеансе;второй раз был выполнен за миллисекунды.

Ключевой момент: если у вас есть устаревшая база данных с большим количеством таблиц, не используйте 1 единственный DbContext, который содержит все таблицы (кромедля инициализации базы данных), но несколько небольших, специфичных для домена, таблиц, которые вам нужны для данного контекста домена.Объекты могут существовать в нескольких DbContexts, распределять отношения (например, «игнорировать», где это не требуется) и выполнять отложенную загрузку, где это необходимо.Эти вещи помогают повысить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...