2016-12-20 25 views
0

Я пытаюсь проверить поле: ResultBufferSize при работе с Vertica 7.2.3 с использованием ODBC. Из моего понимания это поле должно влиять на набор результатов. ResultBufferSizeVertica, ResultBufferSize не влияет

Setting BufferSize

, но даже со значением 1 я получаю 20K результаты.

В любом случае, чтобы это сработало?

ответ

0

ResultBufferSize - размер буфера результатов, настроенного в источнике данных ODBC. Не во время выполнения. Вы получаете фактический размер извлеченного буфера, создавая инструкцию SQL - SQLPrepare(), подсчитывая столбцы результатов - SQLNumResultCols(), а затем для каждого найденного столбца работает SQLDescribe(). Удача - Marco

+0

Вы уверены, что это не во время выполнения? из описания ResultBufferSize это звучит для меня, как будто я должен получить меньший набор результатов, а затем я должен снова попросить следующий фрагмент – Tsahi

0

Мне нужно добавить еще один ответ на ваш комментарий, Tsahi. Я не совсем уверен, хотя я все еще неправильно понимаю вас. Возможно, объяснение того, как я это делаю в интерпретаторе SQL на базе ODBC, проливает свет на этот вопрос.

  1. SQLPrepare() на строку, содержащую, скажем, "SELECT * FROM обув", возвращает SQL_SUCCESS, и проходящее дескриптором становится действительным.

  2. SQLNumResultCols (& stmt, & colcount) в этом дескрипторе инструкции возвращает количество столбцов во втором параметре.

  3. В цикле for от 0 до (colcount-1) я вызываю SQLDescribeCol(), чтобы получить, помимо прочего, размер столбца - это то, сколько байтов я должен был бы выделить для извлечения самое большое возможное возникновение для этой колонки.

  4. Я выделяю достаточно памяти, чтобы иметь возможность выбирать блок строк вместо одной строки в последующем вызове SQLFetchScroll(). Например, блок из 10 000 строк. Для этого мне нужно выделить для каждого столбца в colcount в 10 000 раз максимальный возможный выборный размер. Плюс двухбайтовое целое число для индикатора Null для каждого столбца. Эти два: выделенная область данных и область нулевого индикатора, для 10 000 строк в моем примере, делают размер буфера выборки, другими словами, размер буфера результата.

  5. Для подготовленного дескриптора инструкции я вызываю SQLSetStmtAttr(), чтобы установить SQL_ATTR_ROW_ARRAY_SIZE в 10 000 строк.

  6. SQLFetchScroll() вернет либо 10000 строк в один вызов, либо, если таблица foo содержит меньше строк, все строки в foo.

Вот как я понимаю это, чтобы работать.

Вы можете сделать математику наоборот:

Вы установите максимальные выборки буфера.

Вы готовите и описываете инструкцию и столбцы, как описано выше.

Для каждого столбца вы подсчитываете два байта для нулевого индикатора и максимально возможный размер выборки из SQLDescribeCol(), чтобы получить сумму байтов для одной строки, которая должна быть выделена.

Вы целых разделите буфер максимальной выборки на сумму байтов для одной строки.

И вы используете этот результат целочисленного деления для вызова SQLSetStmtAttr() для установки SQL_ATTR_ROW_ARRAY_SIZE.

Надеюсь, что это имеет смысл ...

 Смежные вопросы

  • Нет связанных вопросов^_^