Entity Framework DbContext фильтрует запрос на счетчик очень медленно, используя переменную - PullRequest
0 голосов
/ 07 февраля 2020

Использование модели данных сущности ADO. NET. Я построил два запроса ниже к таблице, содержащей 1800 записей, в которой чуть более 30 полей дают потрясающие результаты.

// Executes slowly, over 6000 ms
int count = context.viewCustomers.AsNoTracking()
                   .Where(c => c.Cust_ID == _custID).Count();

// Executes instantly, under 20 ms
int count = context.viewCustomers.AsNoTracking()
                   .Where(c => c.Cust_ID == 625).Count();

Я вижу из В журнале базы данных, который предоставляет Entity Framework, запросы практически идентичны, за исключением того, что часть фильтра использует параметр. Копирование этого запроса в SSMS и объявление и установка этого параметра приводит к почти мгновенному запросу, поэтому он, похоже, не находится на конце базы данных.

Кто-нибудь сталкивался с этим, который может объяснить, что происходит? Я во власти стороннего элемента управления, который добавляет эту команду к запросу, пытаясь ограничить количество возвращаемых строк, поэтому получение счетчика является обязательным. Это используется для нескольких запросов, поэтому необходимо общее решение c. К сожалению, он не работает так, как рекламируется, кажется, что запрос выполняется только в 5-10 раз дольше, чем если бы я только загрузил весь вид в память. Однако, когда фильтр не используется, он работает как сон.

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

1 Ответ

0 голосов
/ 07 февраля 2020

Вы не упомянули о деталях проектирования вашей модели, но если вы хотите, чтобы количество записей основывалось только на условии, то это можно оптимизировать, считая только набор результатов на основе одного столбца. Например,

    int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Count();

Если вы проектируете 10 столбцов, и, основываясь на приведенном выше утверждении, допустим, было возвращено 100 записей, то в каждом наборе результатов записей содержатся данные 10 столбцов, которые не используются.

Вы можете оптимизировать это, только посчитав набор результатов на основе одного столбца.

   int count = context.viewCustomers.AsNoTracking().Where(c => c.Cust_ID == _custID).Select(x=>new {x.column}).Count();

Другие методы оптимизации, такие как использование асин c вариантов подсчета CountAsync можно использовать.

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