2B: Поддержка решений 1С

Поддерживается платформа «1С:Предприятие», начиная с версии 8.3.18.

Дополнительные типы данных для совместимости с Microsoft SQL Server

В версии QHB 1.2.0 добавлены типы данных mchar и mvarchar, являющиеся аналогами типов char и varchar, но имеющие ряд особенностей поведения, повторяющих поведение типов nchar и nvarchar в Microsoft SQL Server.

Отличия от стандартных типов char и varchar в QHB:

  • сравнение без учета регистра, в том числе, если один из аргументов mchar/mvarchar, а второй нет (для сравнения с учетом регистра вводятся специальные версии операторов сравнения: &<, &<=, &=, &>= и &>).
  • mchar фиксированной длины дополняется пробелами справа, но при сравнениях эти пробелы игнорируются;
  • данные типа mchar/mvarchar хранятся в кодировке utf-16 (для пользователя это не важно);
  • для сравнения и приведения к верхнему/нижнему регистру используется ICU, поэтому результат не зависит от операционной системы;
  • функция получения подстроки substr(str, pos [, length]), а не substring.

Отличия от поведения nchar и nvarchar в Microsoft SQL Server:

  • mchar и mvarchar без указания длины трактуются как строки неопределенной неограниченной длины (похоже на nvarchar(max)); mchar неопределенной длины не дополняется пробелами справа (но явно заданные пробелы все-таки хранятся);
  • функция вычисления длины строки length(string), а не len, как в Microsoft SQL Server.

Для типов данных mchar и mvarchar поддерживаются индексы B-деревья и хэш-индексы.

Дополнительный оператор равенства для совместимости с Microsoft SQL Server

Для совместимости с Microsoft SQL Server в версии QHB 1.2.0 добавлен оператор полного равенства ==.

Оператор «полного» равенства (==) отличается от обычного (=) тем, что возвращает TRUE при сравнении двух значений NULL (обычное равенство возвращает NULL согласно стандарту ANSI SQL). Такое поведение принято в СУБД семейства Microsoft SQL.

Оператор == определен для следующих типов данных:

  • bool
  • bytea
  • char
  • mchar
  • varchar
  • mvarchar
  • name
  • int2
  • int4
  • int8
  • int2vector
  • text
  • oid
  • xid
  • cid
  • oidvector
  • float4
  • float8
  • macaddr
  • inet
  • cidr
  • date
  • time
  • timestamp
  • timestamptz
  • interval
  • timetz

Быстрое усечение временных таблиц

В QHB операция TRUNCATE транзакционная: ее можно откатить. Из-за этого она более дорогая, чем в других СУБД.

В версии 1.2.0 добавлена функция fasttruncate, которая очищает таблицу быстрее и предотвращает разрастание системного каталога pg_class. Пока ее можно применять только ко временным таблицам, благодаря чему очистка не вызывает конфликта с другим пользователем.

Внимание!
Функция fasttruncate является внетранзакционной: при откате транзакции очистка таблицы не будет отменена!

Пример использования:

SELECT fasttruncate ('pg_temp.tmp3')

Немедленное обновление статистики отдельных таблиц

Для сильно меняющихся таблиц, например временных, стандартные средства сбора статистики могут быть неэффективны. В версии QHB 1.2.0 появилась возможность немедленного обновления статистики таблицы после ее изменения, т. н. немедленный анализ (online analyze).

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

Конфигурационные параметры немедленного обновления статистики

online_analyze.enable = on | off

Включение/выключение функции немедленного анализа.

online_analyze.verbose = on | off

Включение/выключение возможности записи в лог при сборе статистики (аналогично команде SQL ANALYZE VERBOSE).

online_analyze.table_type = "тип_таблицы"

Указывает тип таблиц, для которых следует применять немедленный анализ. Возможные варианты типа_таблицы: all (все), persistent (постоянные), temporary (временные), none (никакие).

online_analyze.exclude_tables = "имя_таблицы_1, имя_таблицы_2 ..."

Указывает список таблиц, исключаемых из немедленного анализа.

online_analyze.include_tables = "имя_таблицы_1, имя_таблицы_2 ..."

Указывает список таблиц, подлежащих немедленному анализу (этот параметр перекрывает online_analyze.exclude_tables).

Примечание
Значения этих двух параметров записываются в виде списка имен таблиц через запятую.

online_analyze.local_tracking = on |off

Включение/выключение хранения статистики временных таблиц в локальном кэше.

online_analyze.capacity_threshold = число_таблиц

Указывает максимальное число временных таблиц, сохраняемых в локальном кэше.

Примечание
По умолчанию используется системная статистика, но имеет смысл хранить ее в локальном кэше процесса, обслуживающего сессию.

online_analyze.scale_factor = процент_измененных_строк

Указывает процент измененных строк от всей таблицы, при котором начинается немедленный анализ.

online_analyze.threshold = число_измененных_строк

Указывает минимальное число измененных строк, после которого может начаться немедленный анализ.

online_analyze.lower_limit = число_строк

Указывает минимальное число строк в таблице, при котором может начаться немедленный анализ.

online_analyze.min_interval = интервал_времени

Минимальный интервал времени между вызовами команды ANALYZE для конкретной таблицы (в миллисекундах).

Поддержка указаний для планировщика, позволяющих отключать или подключать определенные индексы при выполнении запроса

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

Эти новые параметры относятся к настройкам планирования. Как и для других настроек планирования, основным сценарием использования является изменение этих параметров на уровне транзакции, перед выполнением конкретного запроса. Технически возможно использование параметров на уровне базы данных или сервера, но если вам понадобилось отключить использование индекса на уровне базы данных, имеет смысл рассмотреть его удаление.

Конфигурационные параметры для управления использованием индексов

plantuner.disable_index = 'имя_индекса_1, имя_индекса_2'

Указывает список индексов, которые нельзя использовать.

plantuner.enable_index = 'имя_индекса_1, имя_индекса_2'

Указывает список индексов, которые все-таки можно использовать (этот параметр перекрывает plantuner.disable_index).

plantuner.only_index = 'имя_индекса_1, имя_индекса_2'

Указывает точный список индексов, которые можно использовать (этот параметр перекрывает plantuner.disable_index и plantuner.enable_index).

Примечание
Значения этих трех параметров записываются в виде списка имен индексов через запятую.

Разрешение имени индекса происходит для конкретного пользователя, даже если параметр задан на уровне сервера. Если индекс не найден по имени, например, когда индекс вообще не существует, он игнорируется.

plantuner.fix_empty_table = параметр

Этот параметр меняет оценку планировщиком совсем пустых таблиц (только что созданных или опустошенных при помощи команды TRUNCATE). Если значение равно true, то QHB планирует в предположении, что эти таблицы так и будут оставаться пустыми. При значении false QHB по умолчанию будет считать, что таблицы содержат некоторое количество записей (обычно 20).