Должен ли я использовать EF6 из функции SQL CLR

1

Мне было поручено изучить некоторый сложный код вычисления (в С#) и переместить его в функцию CLR на SQL Server 2012. Сложный характер вычислений означает, что запись этого как классического SQL SP или UDF не является реально жизнеспособной, следовательно, идея использования CLR - код существует и протестирован.

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

Мой вопрос не в том, как я могу это сделать (это произойдет позже :)), насколько я должен это делать? Как-то нехорошо набивать всю EF в саму базу данных, к которой я собираюсь выполнить вычисления - она очень раздута.

Мнения, предложения, мысли, пожалуйста?

благодаря

Теги:
sql-server
entity-framework
sqlclr

1 ответ

1
Лучший ответ

Если не существует очень насущной и конкретной необходимости поддерживать синхронизацию кода между уровнем приложения и этой функцией SQLCLR, я бы сказал:

Нет. Похоже, что это не так, если это возможно. Вам должно понравиться только несколько точек данных, и их очень легко захватить простым SqlConnection используя Context Connection = true; для соединительной строки (то есть входящего соединения).

И, учитывая, что производительность является проблемой (как и должно быть в любом случае, но все же), следовательно, причина для перехода к этому пути SQLCLR для начала, кажется контрпродуктивным добавить в слои и слои кода, которые позволяют легко - слой абстракции использования, который является платформой Entity Framework.

Кроме того, почему вы извлекаете данные из функции вместо того, чтобы передавать ее в функцию? Имеются ли значения, которые передаются, для чего требуются дополнительные поисковые запросы, основанные на их конкретном значении? Вы получите довольно высокую производительность, структурируя скалярную функцию как детерминированную:

  1. Скалярные функции SQLCLR, отмеченные как IsDeterministic = true в SqlFunction имеют свой вывод, кэшированные и сопоставленные с входными параметрами, поэтому их можно искать (в контексте дополнительных строк в одном запросе) и повторно использовать вместо запуска функции снова и

  2. Скалярные функции SQLCLR, помеченные как IsDeterministic = true, AND not marked DataAccess = DataAccessKind.Read, в SqlFunction в параллельных планах. Если либо IsDeterministic не помечен как true либо DataAccess (или даже SystemDataAccess) отмечены как Read, то они будут действовать как обычные функции T-SQL, поскольку они предотвратят любой запрос, который использует их для получения параллельного плана выполнения.

  • 0
    Необходимо, чтобы функциональность вычислений была доступна как из служб SQL (другие SP, службы отчетов, другие системы, которые в настоящее время не были переработаны), так и из традиционных внешних систем. Отсюда необходимость инкапсулировать код только в одном месте, доступном для обеих сред. Код очень сложный, с использованием нескольких поисков и передачи данных - финансового характера. Попытка конвертировать C # в SQL была бы кошмаром, помимо этого у нас есть работающий механизм.
  • 0
    @ Майк: Эй. Я бы сказал, что это важная информация, которая должна быть в вопросе :-). Кроме того, что вы имеете в виду «инкапсулировать код только в одном месте, доступном для обеих сред»? Код SQLCLR размещен на SQL Server и не может быть доступен извне, а также не имеет доступа к чему-то удаленному (хотя он может получить доступ к компоненту COM, зарегистрированному в той же системе). Если расчет выполняется быстрее всего в базе данных, тогда, возможно, центральным местом должна быть функция SQLCLR ;-).
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню