Добавление MAXDOP в Linq к сущностям

#sql-server #entity-framework #linq-to-entities

#sql-сервер #entity-framework #linq-to-entities

Вопрос:

Я искал расширение linq к сущностям, которое позволяет добавлять ОПЦИЮ (MAXDOP x) к сгенерированному запросу. Для запросов я хочу ограничить их ресурсы SQL Server.

Что-то вроде:

 Customers.WithMaxDop(2).Where(...) ..
  

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

Спасибо!

Ответ №1:

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

EF — это абстракция поверх базы данных (теоретически любой базы данных) — предполагается, что она не предоставляет вам контроль над такими деталями БД. Если вам нужны эти сведения, вы должны закодировать их на уровне базы данных и предоставлять EF только представления или хранимые процедуры.

Комментарии:

1. Привет, tnx за твой ответ. Как насчет трюков, подобных этому решению: aneyfamily.com/terryandann/post/2008/04 /… — перехватите сгенерированный текст sql, затем обработайте его, введя опцию подсказки (..), и только после этого запустите запрос.. хотя тогда я теряю результат как сущности.

2. Это было бы довольно серьезным обходным решением, и это будет похоже на выполнение вашего собственного пользовательского SQL-запроса через context.ExecuteStoreQuery — вы потеряете функциональность, такую как eager loding. Вы можете получить SQL, сгенерированный путем приведения вашего запроса к ObjectQuery и использования ToTraceString . Имейте в виду, что EF иногда создает действительно большие запросы, поэтому синтаксический анализ и модификация такого запроса могут быть очень сложными, подверженными ошибкам и замедлять работу.

3. Черт возьми, везде, куда я обращаюсь с EF, я закрываюсь. Я запрашиваю данные, которые действительно требуются ребятам из DBops (maxdop 2) или какой-то nolock. черт возьми, черт возьми…

4. Вот интересная статья о MAXDOP и пороговом значении затрат для параллелизма. Последнее может быть менее сложным решением: [ sql-server-performance.com/2014/maximum-degree-parallelism /]

Ответ №2:

Похоже, что теперь это возможно с EF Core 3.x. Вы можете «Перехватывать работу базы данных» на низком уровне до и / или после операции. В примере, предоставленном Microsoft, они добавили подсказку в конце запроса.

 command.CommandText  = " OPTION (OPTIMIZE FOR UNKNOWN)";
  

Однако я не знаю, произойдет ли это для каждой операции или вы можете применить эти перехваты только к выбранным командам.
Дополнительная информация здесь: https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/#interception-of-database-operations