Медленная загрузка BLOB от C# до Oracle - PullRequest
1 голос
/ 30 апреля 2020

У меня есть несколько уникальная (и устаревшая) загадка для вас.

Наше программное обеспечение написано на C# и подключается к Oracle с использованием библиотеки Oracle .ManagedDataAccess. У нашего клиента есть таблица с некоторыми двоичными данными, представленная в виде больших двоичных объектов. Каждый BLOB относительно небольшой, чаще всего меньше 1 КБ.

Когда мы пишем запрос, который не выбирает сам BLOB, такой как «SELECT blob_id, blob_name FROM blob_table WHERE blob_name LIKE 'foo%'", это выполняется очень быстро (типичный запрос возвращает от 1000 до 10000 строк). Однако когда мы включаем столбец BLOB и пытаемся прочитать его как байт [], запрос замедляется до сканирования. В худшем случае это может продолжаться до 20 минут (!).

Хотя это еще не все загадки. Я попытался решить эту проблему путем увеличения InitialLobFetchSize. Оказывается, что установка размера выборки в 1 КБ позволяет выполнить запрос примерно за 30 секунд. Установка его выше 500 КБ замедляет запрос до 30 минут. Что происходит и как это возможно - особенно учитывая тот факт, что он загружает всего около 1 МБ данных?

В отчаянии я написал процедуру PL / SQL, которая будет запускаться запрос; объединить все BLOB-объекты в один большой временный BLOB-объект; и затем верните этот BLOB клиенту. Этот подход оказался самым быстрым, независимо от размера выборки. Опять же, мой вопрос, почему? В конечном итоге, как я могу выполнить этот запрос в разумные сроки?

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