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-деревья и хэш-индексы.

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

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

Оператор fulleq (==) отличается от обычного равенства (=) тем, что возвращает 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 (boolean)

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

По умолчанию, параметр устанавливается в значение false.

online_analyze.verbose (boolean)

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

По умолчанию, параметр устанавливается в значение false.

online_analyze.table_type (enum)

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

По умолчанию, параметр устанавливается в значение temporary.

online_analyze.exclude_tables (string)

Указывает список таблиц, исключаемых из немедленного анализа. Например, "имя_таблицы_1, имя_таблицы_2 ..."**.

По умолчанию, параметр устанавливается в пустое значение ('').

online_analyze.include_tables (string)

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

По умолчанию, параметр устанавливается в пустое значение ('').

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

online_analyze.local_tracking (boolean)

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

По умолчанию, параметр устанавливается в значение false

online_analyze.capacity_threshold (integer)

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

По умолчанию, параметр устанавливается в значение 100000.

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

online_analyze.scale_factor (floating point)

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

По умолчанию, параметр устанавливается в значение 0.1.

online_analyze.threshold (integer)

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

По умолчанию, параметр устанавливается в значение 50.

online_analyze.lower_limit (integer)

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

По умолчанию, параметр устанавливается в значение 0.

online_analyze.min_interval (integer)

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

По умолчанию, параметр устанавливается в значение 10000.

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

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

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

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

plantuner.disable_index (string)

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

plantuner.enable_index (string)

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

plantuner.only_index (string)

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

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

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

plantuner.fix_empty_table (boolean)

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