Недавно я столкнулся с некоторыми проблемами с производительностью и пытаюсь выяснить, как экспоненциально повысить производительность некоторых вызовов в БД Oracle.
Технологии:
- .NET Core 2
- Oracle DB
- Dapper (необязательно)
- Devart (необязательно)
- OracleManaged (необязательно, бета)
Я знаком с использованием DataTable
и табличных параметров для Dapper и SQL Server и хочу повторить это с помощью технологий, описанных выше.Я еще не смог воспроизвести приведенное ниже решение для работы с Devart или OracleManaged:
Код ниже не тот, что я использую ... Это перефразированный пример.Мне просто нужно что-то, что работает с Oracle для передачи DataTable или массива объектов для использования в запросе / вставке.
SQL Server:
CREATE TYPE MyCustomerInfo AS TABLE
(
Id BIGINT NOT NULL,
--Name NVARCHAR(32) NOT NULL,
--...
);
C # для SQL Server:
const string getCustomersSql = @"
SELECT
c.Id,
--c.Name
--...
FROM @myCustomers mc
LEFT JOIN Customers c
ON c.Id = mc.Id";
var myCustomers = new DataTable();
myCustomers.Columns.Add("Id", typeof(long));
//...
myCustomers.Rows.Add(1);
myCustomers.Rows.Add(2);
var customers = await sqlDbConnection.QueryAsync<Customer>(getCustomersSql, new { myCustomers = myCustomers.AsTableValuedParameter("MyCustomerInfo") });
БД Oracle (PL / SQL):
CREATE TYPE MY_CUSTOMER_INFO AS OBJECT
(
ID BIGINT,
--NAME VARCHAR2(32),
--...
);
CREATE TYPE MY_CUSTOMER_INFO_ARRAY AS TABLE OF MY_CUSTOMER_INFO;
C # для БД Oracle:
Я сделал аналогичный подход, какс SQL Server, но с Devart и OracleManaged, и ни один не работал.Я также [очень-к несчастью] попытался использовать OracleCommand
и OracleParameter
напрямую - снова с Devart и OracleManaged - безрезультатно.
Мои результаты с Devart, похоже, указывают на то, что функциональность намеренно заблокирована.Мои результаты с OracleManaged, похоже, указывают на то, что он еще не был реализован, что неудивительно, поскольку это бета-версия (предположительно выпущенная в третьем году в этом году).
Мой следующий подход может заключаться в использовании связанных массивов (в которыхУ меня очень мало опыта или желания учиться) с Девартом.На данный момент я просто исследую что-то, что будет работать с аналогичным приростом производительности ...
EDIT : использование подхода с массивом на параметр возможно, но ужасно неудобно при большом размереклассы заканчиваются с 12+ массивами.Я бы хотел альтернативу этому подходу.