Параметры ODBC драйвера PostgreSQL

Это описание, в основном, представляет собой более-менее точный перевод документации с официального сайта ODBC драйвера для сервера PostgreSQL. К сожалению, документация эта довольно старая и не содержит даже упоминания о некоторых опциях. В будущем я постараюсь восполнить этот пробел.

  • CommLog (C:\psqlodbc.log): Логирует в файл обмен информацией с сервером. Может быть полезен при отладке.
  • MyLog (C:\mylog_xxxx.log): Записывает в файл отладочную информацию. Обычно её просят прислать разработчики драйвера, если Вы сообщаете о найденном баге.
  • Disable Genetic Optimizer: Отключает генетический оптимизатор при установлении соединения с сервером. Это сделано только для удобства, чтобы не указывать соответствующий параметр в свойствах соединения вручную. Данный параметр был добавлен разработчиками драйвера, когда они обратили внимание, что сервер не в состоянии успешно оптимизировать некоторые запросы.
  • KSQO (Keyset Query Optimization): Включение этого параметра позволяет серверу безаварийно выполнять некоторые запросы. Ряд приложений, в частности MS Access, используют "keyset" запросы примерно такого вида:

    SELECT ... WHERE (a=1 AND b=1 AND c=1) OR (a=1 AND b=1 AND c=2) ...

    Есть вероятность, что такого типа запросы могут вызвать сбой сервера, если не задействовать данный параметр.

  • Recognize Unique Indexes: Этот параметр контролирует работу функции ODBC SQLStatistics() в части информации, которую та возвращает об уникальных индексах. Если он установлен, то MS Access может автоматически распознать первичный ключ. Только в этом случае присоединённые таблицы будут обновляемыми.
  • ReadOnly (default): Новые источники данных наследуют значение этого параметра для установки атрибута "ReadOnly" ("Только для чтения").
  • Use Declare/Fetch: Если опция включена (по умолчанию), драйвер автоматически создаёт и использует курсор для поддержки SELECT операторов SQL, сохраняя при этом 100 строк в кэше. Это даёт большое преимущество, особенно если Вы заинтересованы только в чтении, а не обновлении записей. Драйвер не забирает столько памяти, сколько потребовалось бы для буферизации всего результата.

    Однако, в этом случае таблица постоянно остаётся открытой, что может вызвать снижение производительности при обновлении записей. Кроме того, данный параметр является наследием стиля совсем старого драйвера podbc32. Сейчас модель распределения памяти значительно улучшена и производительность без использования курсора, как минимум, лучше, чем в старом драйвере.

    При использовании же MS Access, важно помнить, что он применяет свои собственные алгоритмы работы с результатом запроса. Поэтому, установка данной опции, вероятно, даст ожидаемый эффект не во всех случаях.

  • Parse Statements: Когда эта опция включена, драйвер будет анализировать переданную ему команду SQL, чтобы идентифицировать таблицы и поля с целью получения информации о точности, допустимости NULL, о псевдонимах и т.д. Затем эти данные будут использованы в функциях драйвера SQLDescribeCol, SQLColAttributes и SQLNumResultCols.

    До версии 6.4 сервера, это был единственный способ получения сведений о точности для результата запроса.

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

    Синтаксический анализатор достаточно «умён» и способен распознавать множество вещей, таких как псевдонимы полей и таблиц, идентификаторы в кавычках, объединения и многое другое. Он может корректно обработать поле-функцию или выражение независимо от сложности, но даже не пытается в этом случае определить тип данных и точность таких столбцов.

  • Unknown Sizes: Этот параметр контролирует функции SQLDescribeCol и SQLColAttributes в случае возникновения проблем с определением точности (имеется ввиду количество знаков) полей символьных типов данных (varchar, text и unknown). Первоначально это было сделано, чтобы обойти неспособность сервера версии до 6.4 правильно возвращать ширину varchar-полей.

    • Maximum : Всегда возвращается максимальная точность (количество знаков) типа данных.
    • Dont Know : Возвращается величина "Don't Know" и приложению позволяется самому строить дальнейшие предположения.
    • Longest : Возвращает размер самой длинной строки в любом столбце любой записи в выборке. Остерегайтесь этой опции при использовании курсоров, так как размер кэша может давать не самое лучшее представление о длине самой длинной колонки в кэше.
    В случае MS Access наиболее безопасно использовать значение Maximum .
  • Data Type Options: Влияет на отображение некоторых типов данных:
    • Text as LongVarChar : Тип данных TEXT отображается в SQLLongVarchar (в MS Access - это поле Memo), иначе - в SQLVarchar.
    • Unknowns as LongVarChar : Неизвестные типы (массивы и т.п.) отображаются в SQLLongVarChar (для MS Access в случае полей BYTEA и LO - это поле OLE объекта), иначе - в SQLVarchar
    • Bools as Char : Тип Boolean отображается в SQL_CHAR, иначе - в SQL_BIT.
    В случае MS Access, первые два флажка должны быть установлены, а третий - сброшен.

  • Cache Size: При использовании курсоров - это строковый размер кэша кортежей. Если курсоры не используются, то данный параметр определяет, под какое количество кортежей следует иметь уже выделенную память в каждый момент времени. В обоих случаях, значение по умолчанию - 100 строк.
  • Max Varchar Максимальное количество знаков для типов Varchar. Значение по умолчанию 254 соответствует строке в 255 символов, включающей завершающий нуль-символ. Если установить значение, превышающее 254, то MS Access будет воспринимать поля с таким размером как Memo и не даст использовать индексы по ним.
  • Max LongVarChar: Максимальное количество знаков для LongVarChar (в MS Access - это Memo). Значение по умолчанию 4094 соответствует 4095 символам, включая завершающий нуль-символ. Вы даже можете указать здесь значение -4, которое является стандартным для ODBC обозначением величины SQL_NO_TOTAL.
  • SysTable Prefixes: Дополнительные префиксы в именах таблиц, которые должны считаться системными. Драйвер уже воспринимает имена, начинающиеся с "pg_" как имена системных таблиц. Здесь Вы можете добавить собственные префиксы, разделенные точкой с запятой (;), такие как "dd_" который присутствует по умолчанию для таблиц словаря данных.
  • Connect Settings: Это команды, которые будут переданы серверу при успешном подключении. Для разделения команд следует использовать точку с запятой (;). Эти команды будут сопровождать каждый запрос, даже если он возвращает записи. Однако, в таком случае результат может быть потерян.
  • Row Versioning: Позволяет приложениям определять при попытке записи изменённой строки, что данные были модифицированы другим пользователем. Это также ускоряет процесс записи изменений, так как в условие WHERE не нужно включать каждый столбец. Для реализации данного механизма драйвер использует системное поле "xmin". Продукты Microsoft, кажется, успешно используют эту опцию.
  • Disallow Premature: Эта опция компенсирует определённый недостаток функциональности сервера, а именно подготовленные (prepared) запросы, которые PostgreSQL не поддерживал до версии 7.3. Когда приложение уже выполнило prepare-часть запроса, драйвер не знает, как получить информацию о полях результата.

    При использовании данной опции, драйвер открывает курсор на основе переданного запроса и выполняет команду "fetch backward", после чего закрывает курсор. Данные при этом, конечно, не возвращаются, но информация о результирующем множестве уже может быть получена обычным путём.

  • Show System Tables: Заставляет драйвер воспринимать системные таблицы как обычные. Установите этот флажок, если хотите получить доступ к системным таблицам.
  • OID Options:
    • Show Column - Включить служебное поле OID в список полей. Может быть полезно, если таблица не содержит первичного ключа или он состоит из слишком многих частей и неудобен для использования.
    • Fake Index - Эта опция позволяет «подделать» уникальный индекс по полю OID. Данная опция полезна, когда реального уникального индекса по полю OID нет, а приложение этого требует.
  • Protocol:
    • 6.2: Заставляет драйвер использовать Postgres 6.2 протокол, который имеет иную последовательность байтов, протокол и другие семантические отличия.
    • 6.3: Заставляет драйвер использовать Postgres 6.3 протокол. Он совместим и с 6.3 и с 6.4 серверами.
    • 7.X, 6.4+: Заставляет драйвер использовать протокол, совместимый с серверами версий 6.4 и старше.

Как видите, параметров много. Как лучше ими распорядиться, чтобы приложения MS Access могли работать с сервером PostgreSQL максимально корректно? В конференциях не утихают дебаты по этому вопросу, постоянно обнаруживаются новые и новые нюансы настройки тех или иных опций. Однако, для начала, необходимо установить следующие значения (некоторые по умолчанию уже заданы как надо):

  • Установить флаг «Disable Genetic Optimizer».
  • Установить флаг «KSQO».
  • Установить флаг «Recognize Unique Indexes».
  • Снять флаг «ReadOnly».
  • В группе «Data Type Options» установить флаги «Text as LongVarChar» и «Unknowns as LongVarChar», а также снять флаг «Bools as Char».
  • «Max Varchar» задать равным 254.
  • «Max LongVarChar» задать равным 8190.
  • В группе «Unknown Sizes» указать «Maximum».
  • В группе «Protocol» выставить версию Вашего сервера.

Также, я всё-таки рекомендую попробовать установить флаг «Use Declare/Fetch» и не описанный здесь флаг «True is -1».

 


Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6442