124 документа
← К списку

Приложение 8. Особенности работы с различными СУБД

страница

Приложение 8. Особенности работы с различными СУБД

8.1. Общие особенности

● В индекс может входить не более 16 полей базы данных, кроме файлового варианта, где ограничением является 256 полей.

● Операции сравнения строк в языке запросов не учитывают концевые пробелы, в отличие от сравнения строк на встроенном языке, где концевые пробелы участвуют в операции сравнения. Например, сравнение строк «bb» и «bb » на встроенном языке вернет Ложь (строки не равны) и Истина в языке запросов (строки равны).

8.2. Файловая база данных

● Файл базы данных (.1CD) внутри организован как множество так называемых внутренних файлов. Каждой из таблиц базы данных соответствует до четырех внутренних файлов:

● Файл описания таблицы – в нем находится описание таблицы.

● Файл записей данных – содержит данные всех записей таблицы, за исключением данных, содержащихся в полях неограниченной длины.

● Файл индексов – размещены все индексы, определенные для таблицы. Если не определено ни одного индекса, то этот файл отсутствует.

● Файл значений неограниченной длины – хранятся значения неограниченной длины, содержащиеся в полях таблицы.

● Размер каждого из вышеперечисленных внутренних файлов не может превышать:

● для формата версии 8.2.14 – 4 Гбайта.

● для формата версии 8.3.8 с размером страницы 4096 байт – 4 Гбайта.

● для формата версии 8.3.8 с размером страницы 8192, 16384, 32768 и 65536 байт – 6 Гбайт.

● Длина ключа в индексе не может превышать 1920 байт.

8.3. IBM DB2

● Правым операндом операции сравнения ПОДОБНО (LIKE) может быть только литерал (параметр) или выражение над литералами. Шаблонными символами являются только «_» – любой символ и «%» – последовательность любых символов.

● Нетипизированный NULL. Тип колонки, являющейся результатом запроса ВЫБРАТЬ NULL, – самый общий составной тип, а не простой тип, совместимый с любым другим. Поэтому такая колонка не может использоваться в операциях, в которых не могут использоваться поля составных типов. Например, ВЫБРАТЬ ЕСТЬNULL(f1 + 1, 1) FROM (ВЫБРАТЬ NULL f1) t1 при работе с DB2 приведет к ошибке, поскольку операндом операции <+> не может быть поле составного типа.

● Максимальная длина числовых данных – 31 знак (а не 38).

● Максимальная длина ресурсов регистров накопления и бухгалтерии – 25 знаков (а не 32).

● Максимальный размер данных неограниченной длины равен 1 Гбайт.

● Максимальное количество колонок в списке выборки оператора не может превышать 1012. При определении количества колонок нужно учитывать, что для полей составного типа «1С:Предприятие» создает несколько колонок в таблице СУБД.

● Отличные от других СУБД правила определения точности результата при выполнении арифметических операций.

● Использование подзапроса на языке запросов в разделе ПО может приводить к замедлению исполнения запросов. При многократном применении подзапроса в разделе ПО (например, соединение нескольких таблиц по условиям, содержащим подзапрос) возможна ситуация, что запрос не будет исполнен.

● Если запрос содержит операцию конкатенации 10 или более строковых значений, включающих поля и литералы и результат конкатенации участвует в сравнении, то возможно возникновение ошибки Ошибка СУБД: SQL0401N. Операнды, заданные для операции '...', имеют несовместимые типы данных.

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

● Если в настройках СУБД параметр COLLATION_SEQUENCE не равен значению UCA500``R``1_``LROOT``_``AN``_``CX``_``EX``_``FX``_``HX``_``NX``_``S``2, то при работе прикладного решения будут присутствовать следующие особенности:

● Не поддерживается работа фонового обновления конфигурации базы данных;

● Чувствительность к регистру букв при сравнении строк. В неявных сравнениях строк, выполняемых в процессе отработки РАЗЛИЧНЫЕ (DISTINCT), СГРУППИРОВАТЬ ПО (GROUP BY), ОБЪЕДИНИТЬ (UNION) языка запросов, большие и маленькие буквы различаются. Поэтому исполнение запросов имеет следующие особенности:

● При использовании конструкции РАЗЛИЧНЫЕ и ОБЪЕДИНИТЬ (без ВСЕ) значения полей результата запроса типа Строка считаются различными, если они отличаются только регистром букв (при использовании других СУБД они считаются одинаковыми).

● При использовании конструкции УПОРЯДОЧИТЬ ПО значения типа Строка, отличающиеся только регистром букв, считаются различными:

● если запрос содержит конструкцию ОБЪЕДИНИТЬ, ОБЪЕДИНИТЬ ВСЕ, РАЗЛИЧНЫЕ;

● список выборки запроса содержит выражение ВЫБОР, в котором имеются вложенные запросы;

● текущий пользователь имеет ограничения доступа к данным, а запрос не содержит ключевого слова РАЗРЕШЕННЫЕ.

● В других случаях сравнение строковых данных нечувствительно к регистрам букв (значения типа Строка, отличающиеся только регистром букв, считаются одинаковыми):

● при явном сравнении полей типа Строка;

● при использовании конструкции СГРУППИРОВАТЬ ПО;

● в конструкции УПОРЯДОЧИТЬ ПО, за исключением перечисленных случаев.

Параметр СУБД COLLATION_SEQUENCE устанавливается при создании базы данных. Если база данных создавалась «1С:Предприятием» версии 8.1.12 и младше, то этот параметр не равен значению UCA500R1_LROOT_AN_CX_EX_FX_HX_NX_S2 и будут наблюдаться вышеописанные особенности. База данных, созданная «1С:Предприятием» версии 8.1.13 и старше, устанавливается этот параметр в значение UCA500R1_LROOT_AN_CX_EX_FX_HX_NX_S2и описанных ограничений наблюдаться не будет.

● В случае обнаружения одной из следующих ситуаций:

● Большое время выполнения запроса;

● Большое количество операций с диском во время выполнения запроса;

● Наличие в плане запроса конструкции HASH JOIN;

● Запрос начинает выполняться существенно быстрее при изменении уровня оптимизации (current query optimization) с 5 до 0,

Рекомендуется выполнить команду db2set DB2_OVERRIDE_BPF=5000 и выполнить перезапуск СУБД IBM DB2. Данную рекомендацию не нужно выполнять на версиях СУБД IBM DB2 9.7 FixPack 5 и выше.

● Если в запросе участвуют таблицы объектов конфигурации, входящих в состав общего реквизита, являющегося разделителем, то использование подзапросов в условиях соединения таблиц не допускается.

8.4. Microsoft SQL Server

● В запросе можно использовать не более 256 таблиц (для версий Microsoft SQL Server 2000 и Microsoft SQL Server 2005).

● Одна запись в таблице не может занимать более 8060 байт;

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

● При использовании Microsoft SQL Server 2000, при группировке по выражению (а не полю), при использовании в разделе ИМЕЮЩИЕ агрегатной функции, не входящей в раздел ВЫБРАТЬ, может происходить ошибка СУБД. При создании решений, ориентированных на Microsoft SQL Server 2000 рекомендуется включать выражения, использующиеся в разделе ИМЕЮЩИЕ в раздел ВЫБРАТЬ. На СУБД Microsoft SQL Server 2005 и выше эта проблема не проявляется.

● В случаях, когда прикладное решение рассчитано на работу на Microsoft SQL Server 2000, не рекомендуется использовать функции работы с датами в разделе запроса СГРУППИРОВАТЬ ПО, т. к. это может приводить к неверным результатам. Вместо использования выражений, содержащих функции, можно использовать группировку по всем полям таблиц, от которых зависело выражение.

● Если в региональных настройках информационной базы указан страна Казахстан, то казахский порядок сортировки в базе данных использоваться не будет. Будет использоваться порядок сортировки Cyrillic_Generic_CI_AS. Сортировка будет аналогичной той, которая будет выполняться при указании страны Россия в региональных настройках информационной базы.

8.5. Oracle Database

● Одна запись индекса не может превышать приблизительно 80% от размера блока:

● Для блока размером 4К – 3318 байт;

● Для блока размером 8К – 6398 байт;

● Для блока размером 16К – 12958 байт.

● В автоматическом режиме Oracle Database использует табличные блокировки. Это означает, что транзакция, захватившая одну запись в таблице, блокирует эту таблицу целиком, что может помешать конкурирующим транзакциям работать с данными этой таблицы. Рекомендуется разработку прикладных решений вести в режиме управляемых блокировок с целью максимального использования возможностей СУБД. Использование прикладного решения в автоматическом режиме рекомендуется для совместимости с предыдущими версиями прикладных решений и не рекомендуется для реальной эксплуатации.

● Отсутствует возможность использования внутри оператора В вложенного запроса с модификатором ПЕРВЫЕ и разделом УПОРЯДОЧИТЬ ПО, если внутри вложенного запроса есть обращения к полям внешнего запроса.

● При сортировке по возрастанию поля со значениями NULL оказываются последними в выборке.

● Использование подзапроса на языке запросов в разделе ПО может приводить к замедлению исполнения запросов. При многократном применении подзапроса в разделе ПО (например, соединение нескольких таблиц по условиям, содержащим подзапрос) возможна ситуация, при которой запрос не будет исполнен.

● Оптимизируется запись первого (по порядку в таблице) реквизита типа ХранилищеЗначений, а если таких нет, то с первого (по порядку в таблице) реквизита с типом Cтрока неограниченной длины.

● Следует учитывать, что при работе с Oracle Database актуальность статистики оказывает влияние на производительность. Рекомендуется поддерживать статистику СУБД в актуальном состоянии (по умолчанию это делается самой СУБД, однако можно самостоятельно запускать сбор статистики с помощью процедуры dbms_stats.gather_schema_stats). В том числе имеет смысл выполнять сбор статистики после загрузки информационной базы из файла выгрузки информационной базы (файлы *.dt). После перезагрузки сервера баз данных сбор статистики также может оказывать влияние на производительность.

● Если у регистров более трех измерений типа Строка, то во время обновления конфигурации базы данных, а также во время загрузки информационной базы может понадобиться табличное пространство для индексов с большим размером ключа. Система «1С:Предприятие» не создает такого табличного пространства, однако может использовать пространство с именем V81C_INDEX_BIG.

Создание табличного пространства должно выполняться администратором базы данных с помощью команды CREATE TABLESPACE, с указанием длины блока в параметре BLOCKSIZE. Чтобы создать табличное пространство с длиной блока, превышающей длину блока базы данных, может потребоваться дополнительная настройка экземпляра базы данных. Например, создание табличного пространства с размером блока 16384 байт можно выполнить, установив параметр DB_16K_CACHE_SIZE с помощью команды ALTER SYSTEM.

● В запросах, использующих операцию сравнения ПОДОБНО, квадратные скобки в шаблоне воспринимаются как специальные символы только в том случае, если они используются в текстовом литерале, а не в выражении.

В следующем примере квадратные скобки имеют специальный смысл – обозначают множество символов:

Копировать в буфер обмена

ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО "123[АБ]%"

В следующем примере квадратные скобки, которые могут находиться в переменной Шаблон, не имеют специального символа:

Копировать в буфер обмена

ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО Шаблон+"%"

8.6. PostgreSQL

● В автоматическом режиме PostgreSQL использует табличные блокировки. Это означает, что транзакция, захватившая одну запись в таблице, блокирует эту таблицу целиком, что может помешать конкурирующим транзакциям работать с данными этой таблицы. Рекомендуется разработку прикладных решений вести в режиме управляемых блокировок с целью максимального использования возможностей СУБД. Использование прикладного решения в автоматическом режиме рекомендуется для совместимости с предыдущими версиями прикладных решений и не рекомендуется для реальной эксплуатации.

● При сортировке по возрастанию поля со значениями NULL оказываются последними в выборке, а при сортировке по убыванию – первыми.

● При выполнении операций, связанных с интенсивным удалением и добавлением записей в таблицы базы данных (например, перепроведение документов), может наблюдаться деградация производительности выполняемой операции. Для восстановления исходной производительности рекомендуется регулярно выполнять операцию REINDEX (или VACUUM) для интенсивно модифицируемых таблиц базы данных. Частота выполнения указанных операций зависит от интенсивности работы с этими таблицами.

● На производительность PostgreSQL оказывает существенное влияние производительность дисковой системы, поскольку по умолчанию параметр fsync включен. Это означает, что при выполнении операции COMMIT данные сразу переписываются из кеша операционной системы на диск; тем самым гарантируется консистентность при возможном аппаратном сбое. Обратной стороной этого является снижение производительности операций записи на диск, поскольку в данном случае не используются возможности отложенной записи данных операционной системы.

● Повышение производительности возможно при использовании многодисковых RAID-массивов, созданных на основе кеширующих RAID-контроллеров с энергонезависимой кеш-памятью, и при использовании источников бесперебойного питания (UPS). В этом случае задачу по обеспечению консистентности данных при аппаратном сбое берут на себя описанные выше устройства, поэтому появляется возможность отключения параметра fsync и увеличения производительности операций записи на диск. Следует отметить, что увеличение количества дисков в RAID-массиве и объема кеша RAID-контроллера само по себе позволяет компенсировать снижение производительности, обусловленное включением параметра fsync.

● Имеются некоторые различия в работе функций даты/времени. Так, в Microsoft SQL select datediff(hour, datetime(2006, 10, 29, 0, 0, 0), datetime(2006, 10, 30, 0, 0, 0)) вернет 24, а в PostgreSQL – 25 из-за того, что между этими двумя датами был переход на зимнее время. Аналогичная ситуация в отношении учета летнего времени существует для функции DATEADD.

● В запросах не рекомендуется использовать ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, т. к. данная конструкция реализована в СУБД недостаточно эффективно. В большинстве случаев без использования этой конструкции можно обойтись, переписав исходный запрос.

● Не допускается одновременно использовать ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и обращение к табличным частям в списке полей выборки.

● В запросах, использующих операцию сравнения ПОДОБНО, квадратные скобки в шаблоне воспринимаются как специальные символы только в том случае, если они используются в текстовом литерале, а не в выражении.

В следующем примере квадратные скобки имеют специальный смысл – обозначают множество символов:

Копировать в буфер обмена

ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО "123[АБ]%"

В следующем примере квадратные скобки, которые могут находиться в колонке Шаблон, не имеют специального смысла:

Копировать в буфер обмена

ВЫБРАТЬ * Справочник.Товары ГДЕ Артикул ПОДОБНО Шаблон+"%"