Мне было поручено изучить некоторый сложный код вычисления (в С#) и переместить его в функцию CLR на SQL Server 2012. Сложный характер вычислений означает, что запись этого как классического SQL SP или UDF не является реально жизнеспособной, следовательно, идея использования CLR - код существует и протестирован.
Проблема заключается в том, что в расчетах используется слой данных, который использует EF6. Очевидно, что я бы извлек как можно меньшую часть существующего кода для функций CLR, но мне все равно придется выполнять все зависимости.
Мой вопрос не в том, как я могу это сделать (это произойдет позже :)), насколько я должен это делать? Как-то нехорошо набивать всю EF в саму базу данных, к которой я собираюсь выполнить вычисления - она очень раздута.
Мнения, предложения, мысли, пожалуйста?
благодаря
Если не существует очень насущной и конкретной необходимости поддерживать синхронизацию кода между уровнем приложения и этой функцией SQLCLR, я бы сказал:
Нет. Похоже, что это не так, если это возможно. Вам должно понравиться только несколько точек данных, и их очень легко захватить простым SqlConnection
используя Context Connection = true;
для соединительной строки (то есть входящего соединения).
И, учитывая, что производительность является проблемой (как и должно быть в любом случае, но все же), следовательно, причина для перехода к этому пути SQLCLR для начала, кажется контрпродуктивным добавить в слои и слои кода, которые позволяют легко - слой абстракции использования, который является платформой Entity Framework.
Кроме того, почему вы извлекаете данные из функции вместо того, чтобы передавать ее в функцию? Имеются ли значения, которые передаются, для чего требуются дополнительные поисковые запросы, основанные на их конкретном значении? Вы получите довольно высокую производительность, структурируя скалярную функцию как детерминированную:
Скалярные функции SQLCLR, отмеченные как IsDeterministic = true
в SqlFunction
имеют свой вывод, кэшированные и сопоставленные с входными параметрами, поэтому их можно искать (в контексте дополнительных строк в одном запросе) и повторно использовать вместо запуска функции снова и
Скалярные функции SQLCLR, помеченные как IsDeterministic = true
, AND not marked DataAccess = DataAccessKind.Read
, в SqlFunction
в параллельных планах. Если либо IsDeterministic
не помечен как true
либо DataAccess
(или даже SystemDataAccess
) отмечены как Read
, то они будут действовать как обычные функции T-SQL, поскольку они предотвратят любой запрос, который использует их для получения параллельного плана выполнения.