Плохая производительность при получении клоб-поля от Oracle в .Net - PullRequest
5 голосов
/ 12 января 2012

Я пытаюсь прочитать столбец clob из oracle в .Net и наблюдаю очень низкую производительность и большое количество сетевого трафика.

Я пробовал ODP + OCI, devArt + OCI способы доступа к данным с помощьютот же результат - требуется около 20 секунд, чтобы получить 1000 строк в считывателе данных и прочитать значение clob для каждой строки.

Изучая следы wireshark, выясняется, что каждый раз, когда я пытаюсь прочитать поле clob для одной строки в считывателе, между клиентом и сервером отправляются дополнительные множественные tcp-пакеты.Таким образом, для 1000 строк это становится в 1000 раз медленнее, чем при запросе только одной строки.

В то же время, если я выполняю тот же запрос в SQL Developer (который, я считаю, использует тонкий драйвер jdbc вместо oci), яполучить результаты мгновенно, включая значения clob.Он не пытается запросить clob для каждой строки - он получает их все за один раз!

Но я не вижу тонкого клиента для .net.Как я могу ускорить процесс?Пожалуйста, помогите!

РЕДАКТИРОВАТЬ: мой тип поля на самом деле XMLTYPE хранится как clob, а не как истинный clob.Использование getClobVal над ним улучшает результат на 50–10 секунд для 1000 строк.Но в то же время Sql Developer возвращает результаты мгновенно, а не через 10 секунд.

1 Ответ

1 голос
/ 12 января 2012

Вы правильно заметили, что Oracle задерживает получение больших объектов. Таким образом, производительность вашего приложения ограничена временем прохождения сигнала по сети.

С помощью свойства InitialLOBFetchSize класса OracleCommand (в ODP.NET см. документация ) вы можете указать Oracle получить часть LOB с начальным извлечением строки. Если ваши рабочие места не слишком длинные, это может иметь большое значение.

...