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-Tree и Hash.


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

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

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

Писать в лог при сборе статистики аналогично ANALYZE VERBOSE:

online_analyze.verbose = off

Параметры, задающие таблицы, для которых следует применять немедленный анализ.

Типы таблиц, для которых выполняется немедленный анализ: all (все), persistent (постоянные), temporary (временные), none (никакие):

online_analyze.table_type = "temporary"

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

online_analyze.exclude_tables = ""

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

online_analyze.include_tables = ""

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

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

online_analyze.local_tracking = on

Максимальное число временных таблиц, сохраняемых в локальном кеше:

online_analyze.capacity_threshold = 100000

Параметры, задающие события, при которых происходит сбор статистики.

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

online_analyze.scale_factor = 0.1

Минимальное число изменённых строк, после которого может начаться немедленный анализ:

online_analyze.threshold = 50

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

online_analyze.lower_limit = 0

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

online_analyze.min_interval = 10000

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

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

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

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

plantuner.disable_index = 'index1, sch.index2'

Список индексов, которые всё-таки можно использовать, перекрывает plantuner.disable_index:

plantuner.enable_index = 'scheme2.index4, index1'

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

plantuner.only_index = 'index5, sch.index2'

Значения этих 3-х параметров — список имён индексов через запятую. Разрешение имени индекса происходит для конкретного пользователя, даже если параметр задан на уровне сервера. Если индекс не найден по имени, например, когда индекс вообще не существует, он игнорируется.

Этот параметр меняет оценку совсем пустых таблиц планировщиком (свежесозданных или оттранкированных):

plantuner.fix_empty_table = true

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