Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Несмотря на эти небольшие изменения, база данных Employee остается в значительной степени тем, чем она всегда и была, - примером того, как не надо проектировать базы данных! Новый пример базы данных для Firebird сейчас создается. Он должен быть готов к концу 2004 года наи на других сайтах сообщества Firebird. В конце концов этот пример будет поставляться в комплекте Firebird.
Приложение 7. Ограничения Firebird
Большинство фактических ограничений Firebird практически шире того, что нужно в программах. Например, вы можете определить до 32 767 [169] столбцов в таблице, однако зачем вы будете это делать? В табл. 7.1 представлены теоретические и практические ограничения, применимые к Firebird 1.0.x и 1.5. Некоторые из этих ограничений будут изменены в сторону улучшения в следующих версиях, так что просматривайте заметки по релизу, чтобы отследить изменения.
169
На самом деле, как показывает практика, не более 16 000 столбцов INTEGER.- Прим. науч. ред.
Таблица П7.1. Ограничения Firebird 1.0.x и 1.5
Объект | Элемент | Firebird 1.0.x | Firebird 1.5 | Замечания |
Идентификаторы | Почти все объекты | 31 символ | 31 символ | Нельзя использовать символы вне диапазона US ASCII (ASCIIZ) |
Имена ограничений | 27 символов | 27 символов | ||
Даты | Самые ранние и самые поздние даты | января 100 г. | ||
Самая поздняя | 31 декабря 9999 г. Замечание: считается, что сервер может аварийно завершаться, если системная дата на сервере установлена больше, чем 2039 [170] . | |||
Сервер | Максимальное количество подключенных клиентов [171] | 024 (TCP/IP) | 024 (TCP/IP) | Теоретическое ограничение меньше для Windows с именованными каналами (NetBEUI) - сервер, скорее всего, зависнет при более чем 930 одновременных соединениях. Практически нормальным будет не более 150 одновременных подключений клиентов Суперсервера при обычных интерактивных приложениях для сервера с низкими спецификациями. Для Классического сервера это количество может быть меньше по причине того, что каждый клиент использует больше ресурсов |
Максимальное | Количество баз данных, открытых при запуске транзакции с помощью isc_start_multiple, ограничивается только доступными системными ресурсами. Транзакция, запущенная с помощью isc start transaction, ограничивает количество одновременно подключенных баз данных 16 | |||
База данных | Количество таблиц | 32 767 | 32 767 | |
Максимальный размер | 7 Тбайт | 7 Тбайт | Приблизительное теоретическое ограничение. Не известна база данных Firebird с таким количеством записей, чтобы ее размер превышал 7 Тбайт | |
Максимальный размер файла | Зависит от файловой системы. В FAT32 и ext2 2 Гбайт. Более старая NTFS и ext3 обычно дают 4 Гбайт. Многие 64-битовые файловые системы не устанавливают ограничений на размер файла с совместным доступом | |||
Максимальное количество файлов в базе данных | Теоретически 216 (65 536) включая файлы оперативной копии (shadow). Порог будет ниже, если операционная система накладывает ограничения на количество файлов, которое может быть одновременно открыто в одном процессе. Некоторые позволяют увеличить эту границу | |||
Максимальный размер страницы | 16 386 байт | 16 386 байт | Другими размерами являются 1024, 2048, 4096 (по умолчанию) и 8192 байт | |
Максимальное количество буферов кэша | 65 536 страниц | 65 536 страниц | Практическое ограничение зависит от доступного объема RAM. Общий размер (страницы * размер страницы для Суперсервера, страницы * размер страницы * количество одновременных пользователей для Классического сервера) никогда не должен превышать половины доступной памяти RAM. Рассматривайте в качестве практического ограничения 10 000 страниц и увеличивайте или уменьшайте, отходя от этого количества, в соответствии с требованиями производительности | |
Таблицы | Максимальное количество версий для структуры таблицы | 255 | 255 | Firebird сохраняет не более 255 форматов для каждой таблицы. Версия формата увеличивается на 1 каждый раз, когда выполняется изменение метаданных. Когда таблица достигает ограничения, вся база данных становится недоступной - нужно сделать ее резервную копию и выполнить восстановление |
Максимальный размер строки | 64 Кбайт | 64 Кбайт | Подсчитывается в байтах. Столбцы массивов и BLOB каждый занимает 8 байт для хранения идентификатора; VARCHAR - длина в байтах + 2; CHAR - длина в байтах; SMALLINT - 2; INTEGER, FLOAT, DATE и TIME - 4; BIDINT, DOUBLE PRECISION и TIMESTAMP - 8; NUMERIC и DECIMAL - 4 или 8 в зависимости от точности. Системные таблицы имеют ограничение на размер страницы 128 Кбайт | |
Максимальное количество строк [172] | 2(^32^) строки | 2(^32^) строки | Больше или меньше. Строки под- считываются с помощью 32-битового беззнакового целого для таблиц и 32-битового для индекса. Таблица с длинной строкой - имеющая много полей или с очень длинными полями - может хранить меньше строк, чем таблица с очень короткими строками. Все строки - включая удаленные - попадают в это число; поля BLOB, хранимые на страницах данных таблицы, также входят в это число | |
Максимальное количество столбцов | Зависит от используемых типов данных (см. Максимальный размер строки) | |||
Максимальное количество индексов на таблицу | 64 | 256 | ||
Максимальный размер внешнего файла | 4 Гбайт в Windows NTSF, 2 Гбайт в Windows FAT32, Linux ext2, ext3 и Solaris | |||
Индексы | Максимальный размер [173] | 252 байт | 252 байт | Этот теоретический максимум применяется к индексу из одного столбца, где набор символов является однобайтовым и использует порядок сортировки по умолчанию (двоичный). Подсчитываются байты, а не символы. Практический максимум уменьшается для составных индексов, многобайтовых наборов символов и сложных порядков сортировки. Например, индекс для одного столбца, использующего 3-байтовые символы UNICODE_FSS, может иметь максимум (253/3) = 84 символа. Некоторые последовательности сортировки для ISO8859 используют до 4 байт на символ только для атрибутов сортировки |
Максимальное количество сегментов | 16 | 16 | ||
Запросы | Максимальное количество соединяемых таблиц | 256 | 256 | Теоретическое ограничение |
Максимальное количество вложенных подзапросов | Теоретически предела нет, но большая вложенность подзапросов ухудшает производительность. Производительность и потребление ресурсов определяется практическими лимитами, конкретно для каждого запроса | |||
Максимальный размер столбца, составляющего поля ORDER BY | 32 Кбайт | 32 Кбайт | ||
Модули PSQL | Максимальный размер BLR | 48 Кбайт | 48 Кбайт | Текст хранимых процедур и триггеров компилируется в байт-код (BLR), который более компактен, чем исходный текст. Если вы все- таки обнаружили ограничение, попробуйте разбить вашу монументальную процедуру на несколько частей, вызываемых из главной процедуры |
Максимальное количество событий в процедуре или триггере | Нет ограничения | Нет ограничения | Практический лимит совпадает с ограничением на размер BLR | |
Количество рекурсивных вызовов | 750 на Windows, 1000 на платформах POSIX | |||
BLOB | Максимальный размер BLOB | Максимум зависит от размера страницы. Для страницы 2 Кбайт максимальный размер - 512 Мбайт. Для 4 Кбайт - 4 Гбайт. Для страниц размера 4 и 8 Кбайт - 32 и 256 Гбайт соответственно | ||
Максимальный размер сегмента | BLOB хранятся посегментно, теоретический максимальный размер которого не более 64 Кбайт. В DSQL нет возможности указать размер сегмента, поскольку его устанавливает клиентская программа или библиотека-компонент, как правило, игнорируя размер сегмента, указанный в определении BLOB |
170
Мало какие нынешние приложения переживут 19 января 2038 года - это проблема переполнения даты еще более худшая, чем проблема 2000 года. Устаревший формат даты в языке С (структура time t) не способен хранить года более 2038. С другой стороны, так долго приложения не эксплуатируются, а для внедряемой сейчас 64-битовой архитектуры и новых приложений такой проблемы нет.
– Прим. науч. ред.
171
3 Это число больше реального числа, которое способна обеспечить операционная система. Например, RedHat Linux без изменения настроек и перекомпиляции ядра допускает до -600 соединений. Чаще всего проблема с числом соединений возникает из за "несконфигурированного" xinetd на Linux, где по умолчанию задано ограничение в -50-60 соединений на конкретное приложение.
– Прим. науч. ред.
172
Реальное физическое ограничение на объем одной таблицы - 36.7 Гбайт. Это примерно 600 миллионов записей, состоящих из двух INTEGER Ограничение связано с внутренним 32-разрядным идентификатором. В Firebird 2.0 это ограничение устранено (используются 64(40)-битовые идентификаторы).
– Прим. науч. ред.
173
В Firebird 2.0 максимальный размер ключа индекса- 1/4 размера страницы. Например, для страницы 4 Кбайт это 1024 байт.
– Прим. науч. ред.
Приложение 8. Наборы символов и порядков сортировки
В табл. П8.1 содержатся наборы символов и порядки сортировки, которые существовали на момент создания Firebird 1.5.0. Некоторые из указанных элементов недоступны в более ранних версиях Firebird. Если вы инсталлировали более позднюю версию, и набор символов или порядок сортировки, нужные вам, здесь не указаны, обратитесь к заметкам по релизу вашей версии и любой другой версии после 1.5, чтобы узнать были ли они добавлены.
Таблица П8.1. Наборы символов и порядок сортировки для Firebird 1.5.0
ID | Название | Байтов на символ | Порядок сортировки | Язык | Алиас |
2 | ASCII | 1 | ASCII | Английский | ASCII7 USASCII |
56 | BIG_5 | 2 | BIG_5 | Китайский, Вьетнамский, Корейский | BIG5, DOS_950, WIN_950 |
50 | CYRL | 1 | CYRL, DB_RUS, PDOX_CYRL | Русский, Русский dBase, Русский Paradox | |
10 | DOS437 | 1 | DOS437, DB_DEU437, DB_ESP437, DB_FIN437, DB_FRA437, DB_ITA437, DB_NLD437, DB_SVE437, DB_UK437 | Английский (США), Немецкий dBase, Испанский dBase, Финский dBase, Французский dBase, Итальянский dBase, Голландский dBase, Шведский dBase, Английский (Великобритания) dBase, | DOS_437 |
DB_US437 | Английский (США) dBase, | ||||
PDOX_ASCII | Кодовая страница Paradox- ASCII, | ||||
PDOX_SWEDFIN | Paradox Шведская / Финская кодовые страницы, | ||||
PDOX_NTL | Paradox международный английский кодовая страница | ||||
9 | DOS737 | 1 | DOS737 | Греческий | DOS_737 |
15 | DOS775 | 1 | DOS775 | Страны Балтии | DOS_775 |
11 | DOS850 | 1 | DOS850, DB_DEU850, DB_ESP850, DB_FRA850, DB_FRC850, DB_ITA850, DB_NLD850, DB_PTB850, DB_SVE850, DB_UK850, DB_US850 | Латинский I (нет символа Евро), Немецкий, Испанский, Французский, Французский - Канада, Итальянский, Голландский, Португальский - Бразилия, Шведский, Английский - Великобритания, Английский - США | DOS_85C> |
45 | DOS852 | 1 | DOS852, DB_CSY, DB_PLK, DB_SLO, PDOX_CSY, PDOX_HUN, PDOX_PLK, PDOX_SLO | Латинский II, Чешский dBase, Польский dBase, Словацкий dBase, Чешский Paradox, Венгерский Paradox, Польский Paradox, Словацкий Paradox | DOS_852 |
46 | DOS857 | 1 | DOS857 DB_TRK | Турецкий, Турецкий dBase | DOS_857 |
16 | DOS858 | 1 | DOS858 | Латинский I с символом Евро | DOS_858 |
13 | DOS86Q | 1 | DOS86O DB PTG860 | Португальский, Португальский dBase | 1 |
47 | DOS861 | 1 | DOS861 PDOX_SL | Исландский, | DOS_861 |
17 | DOS862 | 1 | DOS862 | Иврит | DOS_862 |
14 | DOS863 | 1 | DOS863 DB_FRC863 | Французский - Канада, Французский dBase - Канада | DOS_863 |
18 | DOS864 | 1 | DOS864 | Арабский | DOS_864 |
12 | DOS865 | 1 | DOS865 DB_DAN865 DB_NOR865 PDOX_NORDAN4 | Скандинавские, Датский dBase, Норвежский dBase, Paradox Норвегия и Дания | DOS_865 |
48 | DOS866 | 1 | DOS866 | Русский | DOS_866 |
49 | DOS869 | 1 | DOS869 | Современный греческий | DOS_869 |
6 | EUCJ_0208 | 2 | EUCJ_0208 | Японские EUC | EUCJ |
57 | GB_2312 | 2 | GB_2312 | Упрощенный китайский (Гонконг, Корея) | DOS_936, GB2312, WIN_936 |
21 | ISO8859_1 | 1 | ISO8859_1, DA_DA, DE_DE, DU_NL, EN_UK, EN_US, ES_ES, FI_FI, FR_CA, FR_FR, IS_IS, IT_IT NO_NO, PT_PT, sv_sv | Латинский I, Датский, Немецкий, Голландский, Английский, Великобритания, Английский, США, Испанский, Финский, Французский, Канада, Французский, Исландский, Итальянский, Норвежский, Португальский, Шведский | ANSI, ISO88591, LATIN 1 |
22 | ISO8859_2 | 1 | ISO8859_2, CS_CZ ISO_HUN | Латинский 2 - Центральная Европа (хорватский, чешский, венгерский, польский, румынский, сербский, словацкий, словенский), Чешский, Венгерский | ISO-8859-2, ISO88592, LATIN2 |
23 | ISO8859_3 | 1 | ISO8859_3 | Латинский 3 - Южная Европа (мальтийский, эсперанто) | ISO-8859-3, ISO88593, LATIN3 |
34 | ISO8859_4 | 1 | ISO8859_4 | Латинский 4 - Северная Европа (эстонский, латышский, литовский, гренландский, саамский) | ISO-8859-4, ISO88594, LATIN4 |
35 | ISO8859_5 | 1 | ISO8859_5 | Кириллица (русский) | ISO-8859-5, ISO88595 |
36 | ISO8859_6 | 1 | ISO8859_6 | Арабский | ISO-8859-6, ISO88596 |
37 | ISO8859_7 | 1 | ISO8859_7 | Греческий | ISO-8859-7, ISO88597 |
38 | ISO8859_8 | 1 | ISO8859_8 | Иврит | ISO-8859-8, ISO88598 |
39 | ISO8859_9 | 1 | ISO8859_9 | Латинский 5 | ISO-8859-9, ISO88599, LATIN5 |
40 | ISO8859_1 3 | 1 | ISO8859_13 | Латинский 7 - Балтика | ISO-8859- 13, ISO885913, LATIN 7 |
44 | KSC_5601 | 2 | KSC_5601 KSC_DICTIONARY | Корейский, Корейский - словарный порядок сортировки | DOS_949, KSC5601, WIN_949 |
19 | NEXT | 1 | NEXT NXT_DEU NXT_FRA NXT_ITA NXT_US | Кодирование NeXTSTEP, Немецкий, Французский, Итальянский, Английский, США | |
0 | NONE | 1 | NONE | Нейтральная кодовая страница. Перевод в верхний регистр ограничен кодами ASCII 97-122 | |
1 | OCTETS | 1 | OCTETS | Двоичный символ | BINARY |
5 | SJIS_0208 | 2 | SJIS_0208 | Японский | SJIS |
3 | UNICODE FSS | 3 | UNICODE_FSS | UNICODE | SQL_TEXT, UTF-8, UTF8, UTF_FSS |
51 | WIN1250 | 1 | WIN1250, PXW_CSY, PXW_HUN, PXW_HUNDC, PXW_PLK PXW_SLO | ANSI, Центральная Европа, Чешский, Венгерский, Венгерский, словарная сортировка, Польский, Словацкий | WIN.1250 |
52 | WIN1251 | 1 | WIN1251 WIN1251_UA PXW_CYRL | ANSI кириллица, Украинский, Paradox кириллица (русский) | WIN_1251 |
53 | WIN1252 | 1 | WIN1252 PXW_NTL PXW_INTL850 PXW_NORDAN4 PXW_SPAN PXW_SWE D FIN | ANSI - Латинский I, Английский интернациональный, Paradox многоязыковой Латинский I, Норвежский и датский, Paradox испанский, Шведский и финский | WIN_1252 |
54 | WIN1253 | 1 | WIN1253 PXW_GREEK | ANSI греческий, Paradox греческий | WIN_1253 |
55 | WIN1254 | 1 | WIN1254 PXW_TURK | ANSI турецкий, Paradox турецкий | WIN_1254 |
58 | WIN1255 | 1 | WIN1255 | ANSI иврит | WIN_1255 |
59 | WIN1256 | 1 | WIN1256 | ANSI арабский | WIN_1256 |
60 | WIN1257 | 1 | WIN1257 | ANSI стран Балтии | WIN_1257 |
Приложение 9. Системные таблицы и просмотры
Когда вы создаете базу данных, Firebird начинает с создания своих собственных таблиц, в которых он сохраняет метаданные всех объектов базы данных - не только определенных вами объектов, но также и своих собственных внутренних объектов. Эти таблицы называются системными таблицами. Просматривая определения метаданных для системных таблиц, вы найдете листинги DDL для множества просмотров для системных таблиц, которые могут оказаться вам полезными.
Системные таблицы
Описания в этом разделе помогут вам в проектировании запросов для понимания и администрирования ваших баз данных. Для изменения метаданных существуют операторы DDL. Вообще не рекомендуется использовать операторы SQL для изменения таблиц метаданных. Риск разрушения базы данных при выполнении таких действий весьма высок.
В таблицах применяются следующие аббревиатуры:
* 1DX-индексировано;
* UQ - уникальное.
Где существуют составные индексы, приведены цифры для указания последовательности индексных сегментов.
RDB$CHARACTER_SETS хранит ключи для наборов символов, доступных базе данных.
Идентификатор столбца | Тип | IDX | UN | Описание |
RDB$CHARACTER_SET_NAME | CHAR(31) | Y | Y | Имя набора символов, известного в Firebird |
RDB$FORM_OF_USE | CHAR(31) | Не используется | ||
RDB$NUMBER_OF_CHARACTERS | INTEGER | Количество символов в наборе (не используется для доступных наборов символов) | ||
RDB $ DEFAULT COLLATE_NAME | CHAR(31) | Название двоичной последовательности сортировки для этого набора символов. Это название всегда совпадает с названием набора символов | ||
RDB $ CHARACT ER_SET_I D1 | SMALLINT | Y | Y | Уникальный идентификатор для этого набора символов, если он используется |
RDB$SYSTEM_FIAG | SMALLINT | Будет 1, если набор символов был определен в системе при создании базы данных; 0 для набора символов, определенного пользователем | ||
RDB$DESCRIPTION | BLOB TEXT | Для хранения документации | ||
RDB$FUNCTION_NAME . | CHAR(31) | Не используется, но может стать доступным для наборов символов, определенных пользователем, доступ к которым осуществляется через внешнюю функцию | ||
RDB$BYTES_PER_CHARACTER | SMALLINT | Размер символов в наборе, указанный в байтах. Например, UNICODE_FSS использует 3 байта на символ |
KDB$CHECK_CONSTKAXNTS содержит перекрестные ссылки имен и триггеров для ограничений CHECK и NOT NULL.
Идентификатор столбца | Тип | IDX | UN | Описание |
RDB$CONSTRAINT_NAME | CHAR(31) | Y | Имя ограничения | |
RDB$TRIGGER_NAME | CHAR(31) | Для ограничения CHECK это имя триггера, который поддерживает данное ограничение. Для ограничения NOT NULL это имя столбца, к которому применяется ограничение - имя таблицы может быть найдено через имя ограничения |
RDB$COLLATIONS хранит определения последовательностей сортировки.
Идентификатор столбца | Тип | IDX | UN | Описание |
RDB$COLLATION_NAME | VARCHAR(31) | Y | Y | Имя последовательности сортировки |
RDB $ COLLATI ON_I D | SMALLINT | Y(1) | Y(1) | Вместе с идентификатором набора символов является уникальным идентификатором последовательности сортировки |
RDB$CHARACTER_SET_IB | SMALLINT | Y(2) | Y(2) | Вместе с идентификатором последовательности сортировки является уникальным идентификатором |
RDB$COLLATI ON_ATTRIBOTES | CHAR(31) | Не используется | ||
RDB$SYSTEM_FLAG | SMALLINT | Определенное пользователем = 0; определенное в системе = 1 или выше | ||
RDB$DESCRIPTION | BLOB TEXT | Для хранения документации | ||
RDB$FONCTION_NAME | CHAR(31) | В настоящий момент не используется |
RDB$DATABASE является файлом из одной записи, содержащей основную информацию о базе данных.
Идентификатор столбца | Тип | IDX | UN | Описание |
RDB$DESCRIPTION | BLOB TEXT | Текст комментария, включенный в оператор CREATE DATABASE/CREATE SCHEMA, предназначен для того, чтобы быть записанным здесь. Этого не происходит. Однако вы можете сюда добавить любое количество текста с целью документирования. Он сохранится после резервного копирования и восстановления | ||
RDB$RELATION_ID | SMALLINT | Число, которое каждый раз увеличивается на единицу, когда к базе данных добавляется новая таблица или просмотр | ||
RDB$SECORITY_CLASS | CHAR(31) | Может ссылаться на класс безопасности, определенный в RDB$SECORITY_CLASSES, для обращения к общим для базы данных ограничениям доступа | ||
RDB$CHARACTER_SET_NAME | CHAR(31) | Набор символов по умолчанию для базы данных. NULL - набор символов NONE |