Невозможно получить полный набор результатов в R DBI

Это база данных Oracle 12. Я использую R DBI с RODBC.

У меня сложный запрос с несколькими подзапросами и операторами WITH. Набор результатов составляет всего около 3000 строк, но он возвращает только 800 в R и ровно 800 строк каждый раз.

Я пробовал dbSendQuery, за которым следует dbFetch, или просто dbGetQuery сам по себе, установив n = 5000 и другие значения, которые должны возвращать все строки, но ничего не работает. Я могу успешно получить меньше, чем 800 строк, установив n = 500, но не более 800.

Когда я добавляю столбцы в оператор SELECT, количество возвращаемых строк уменьшается. Это не проблема JOIN, полный запрос отлично работает при его исходном запуске, только не в R.

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

while (!dbHasCompleted(rs)) {
    chunk <- dbFetch(rs, 100)
    print(nrow(chunk))
}

Если я сохраню все операторы WITH одинаковыми и сохраню все подзапросы, но уменьшу окончательный SELECT до одного столбца из каждого WITH или подзапроса, это нормально, я получу все строки. И, как я уже сказал, полный запрос отлично работает в SQL Developer.

Кажется, что может быть какой-то предел размера / памяти, но для 3000 строк это не должно быть проблемой, и в любом случае у меня тонны оперативной памяти, а количество ресурсов, используемых R при отправке и извлечении результатов, незначительно , а набор данных крошечный. Сложен только запрос.


person Odj fourth    schedule 27.07.2020    source источник
comment
Я не думал, что RODBC использует DBI интерфейс. Вы имеете в виду пакет odbc?   -  person r2evans    schedule 27.07.2020
comment
Пожалуйста, опубликуйте образец SQL-запроса. Необходимо понимать содержание. Возможно, вы не выполняете тот же запрос в R или Oracle. Процедурная семантика PL / SQL, такая как IF, не может выполняться в вызовах R dbGetQuery.   -  person Parfait    schedule 27.07.2020
comment
@ r2evans: Я использую RODBC с другим пакетом RODBCDBI, который объединяет оба. Итак, мой код инициализации выглядит примерно так: библиотека (RODBC) библиотека (DBI) библиотека (RODBCDBI) con ‹- dbConnect (RODBCDBI :: ODBC (), dsn. = ....   -  person Odj fourth    schedule 28.07.2020
comment
аааа я забыл про RODBCDBI, tx   -  person r2evans    schedule 28.07.2020
comment
Я не знаю, что RODBCDBI не является частью проблемы. Можете ли вы воспроизвести проблему, используя (возможно) odbc? (RODBCDBI не обновлялся более 4 лет.) Тест может быть таким же простым, как con <- dbConnect(odbc::odbc(), ...).   -  person r2evans    schedule 28.07.2020
comment
@Parfait Без использования каких-либо специальных функций PL / SQL. Просто операторы WITH и JOIN. Операторы WITH представляют собой прямые запросы SELECT, условные JOIN. В SQL Developer он выполняется примерно за 20 секунд. Я не могу опубликовать SQL по соображениям безопасности. Вам просто нужно поверить мне на слово, что это просто операторы SELECT и JOIN. Как я сказал в своем вопросе, удаление столбцов дает правильное количество строк: SELECT col1 в порядке. SELECT col1, col2, col3 возвращает половину результатов. SELECT col1 ... col5 возвращает еще меньше. Всегда блоками по 100, так что это будет 1900 строк, затем 1100, затем 800.   -  person Odj fourth    schedule 28.07.2020
comment
Является ли какое-либо поле большим CLOB, BLOB или неограниченным текстовым полем? Числа с очень высокой точностью? Или даже расширенные типы, такие как XML или JSON? Драйвер ODBC может иметь ограничение на чтение или кэш. Попробуйте добавлять столбцы по одному, чтобы изолировать проблемный. Какие типы для col2. col3 и т. Д.? Может быть, даже вызвать CAST для преобразования в известные, более короткие типы.   -  person Parfait    schedule 28.07.2020


Ответы (1)


Я нашел проблему.

Проблема заключалась в недопустимом значении в возвращенных результатах. Запрос работал нормально в SQL Developer, потому что он возвращает результаты только фрагментами по 50. R DBI / RODBC извлекает полный набор результатов, хотя также и фрагментами (очевидно) по 100, поэтому он всегда извлекает круглое количество записей: Блок 800+ имел недопустимое значение, поэтому он получил только первые 800 до получения ошибки.

Даже попытка экспортировать результаты запроса из Developer не выявила конкретной ошибки, это просто не удалось. Мне пришлось пролистать все результаты, чтобы найти значение, о котором идет речь, и исправить его. После этого все заработало.

person Odj fourth    schedule 07.08.2020