DDL для управления коллекциями схем
В базе данных можно создавать коллекции схем XML и связывать их с переменными и столбцами типа xml . Для управления коллекциями схем в базе данных в SQL Server предусмотрены следующие инструкции DDL:
-
CREATE XML SCHEMA COLLECTION (Transact-SQL) импортирует компоненты схемы в базу данных.
-
ALTER XML SCHEMA COLLECTION (Transact-SQL) изменяет компоненты схемы в существующей коллекции схем XML.
-
DROP XML SCHEMA COLLECTION (Transact-SQL) полностью удаляет коллекцию схем XML и все ее компоненты.
Чтобы использовать коллекцию XML-схем и содержащиеся в ней схемы, следует сначала создать коллекцию и схемы с помощью инструкции CREATE XML SCHEMA COLLECTION. После создания коллекции схемы можно создавать переменные и столбцы типа xml и связывать с ними коллекцию схем
Обратите внимание, что после создания коллекции различные компоненты схем будут храниться в метаданных. Кроме того, добавлять большие компоненты в существующие схемы или новые схемы в существующую коллекцию можно с помощью инструкции ALTER XML SCHEMA COLLECTION
Удалить коллекцию схем можно с помощью инструкции DROP XML SCHEMA COLLECTION. При этом удаляются все схемы в коллекции и сам объект коллекции
Обратите внимание, что для удаления коллекции схем должны выполняться условия, описанные в разделе DROP XML SCHEMA COLLECTION (Transact-SQL)
Работа с большими строками (TOAST)
В PostgreSQL одна строка должна помещаться в одну страницу, то есть не быть больше 8 КБ. Чтобы поместить большую строку у PostgreSQL есть следующие стратегии:
- сжать большие атрибуты;
- вынести большие атрибуты в отдельную служебную TOAST таблицу;
- можно объединить оба способа.
Механизм работы с большими строками называется – TOAST. Внешняя таблица в которую по кусочкам помещают длинную строку называют TOAST-таблица.
TOAST-таблица имеет собственную версионность. Например, хранится у вас в такой табличке фотография сотрудника. Вы изменяете сотруднику фамилию, появляется новая версия длинной строки, но фотография в новую версию не копируется. Фотография в TOAST табличке остаётся в той-же версии. Просто новая версия строки (из обычной таблички) ссылается на туже самую фотографию. Это экономит место на диске и увеличивает скорость работы.
Разделение и склеивание длинных строк PostgreSQL делает самостоятельно, то есть вам не нужно обо всем этом задумываться. Вы просто пишите запрос (SELECT), а PostgreSQL склеивает из нескольких частей длинную строку.
Но про них нужно знать. Так как длинные строки обрабатываются отдельно, то это замедляет работу базы данных, но только при запросах к длинному атрибуту, например к фотографии.
TOAST-таблица имеет свою схему pg_toast. А если это временная таблица, то pg_toast_temp_N.
Если в табличке есть поле с типом, куда может поместиться большое значение (numeric, text и т.д.), то TOAST-таблица создается сразу (как бы на всякий случай). Но до помещения больших атрибутов в TOAST-таблицу, она будет пустой.
Строки
Имя | Описание | Пример |
varchar(n) | Строка переменной длины, но не длиннее “n”. | abc |
char(n) | Строка фиксированной длины, длинной “n”. | abc |
text | Строка неограниченной и переменной длины. | abcde |
# CREATE TABLE text (varchar varchar(5), char char(3), text text); # INSERT INTO text (varchar, char, text) VALUES ('abc', 'abc', 'hello word'), ('abcde', 'abc', 'by-by'); # SELECT * FROM text; varchar | char | text ---------+------+------------ abc | abc | hello word abcde | abc | by-by (2 rows)
В результате в varchar можно записать любую строку не более 5 символов, в char строка должна быть ровно 3 символа, а в text можем записать строку любой длины.
Дата и время
Имя | Размер | Описание | Диапазон | Точность | Пример |
timestamp | 8 байт | Дата и время | от 4713 года до нашей эрыдо 294276 года нашей эры | 1 микросекунда | 2021-07-13 14:21:41 |
timestamptz | 8 байт | Дата и время с часовым поясом | от 4713 года до нашей эрыдо 294276 года нашей эры | 1 микросекунда | 2021-07-13 14:21:41+03 |
date | 4 байта | Дата год-месяц-число | от 4713 года до нашей эры до 5874897 года нашей эры | 1 день | 2021-07-13 |
time | 8 байт | Время | от 00:00:00 до 24:00:00 | 1 микросекунда | 14:21:41 |
# CREATE TABLE time (timestamp timestamp, timestamptz timestamptz, date date, time time); # SELECT now(); now ------------------------------- 2021-07-13 14:21:41.406081+03 # INSERT INTO time (timestamp, timestamptz, date, time) VALUES ('2021-07-13 14:21:41', '2021-07-13 14:21:41 +03', '2021-07-13', '14:21:41'); # INSERT INTO time (timestamp, timestamptz, date, time) VALUES (now(), now(), now(), now()); # SELECT * FROM time; timestamp | timestamptz | date | time ----------------------------+-------------------------------+------------+----------------- 2021-07-13 14:21:41 | 2021-07-13 14:21:41+03 | 2021-07-13 | 14:21:41 2021-07-13 14:29:43.235957 | 2021-07-13 14:29:43.235957+03 | 2021-07-13 | 14:29:43.235957 (3 rows)
Функция now() возвращает текущее время в формате timestamptz, но помещая вывод этой функции в различные типы данных, возвращаемое значение подстраивается под конкретный тип данных.
Пример 3
Еще один быстрый и простой способ дублировать таблицу — использовать оператор «AS TABLE» в команде CREATE TABLE PostgreSQL. В этом случае мы увидим, как этот запрос работает волшебным образом. Итак, мы открыли инструмент запроса по его значку. Затем мы должны написать в нем следующий запрос. Мы создали таблицу с именем «новая» как копию таблицы «test» с помощью предложения «AS TABLE» в нашем запросе. Попробуйте выполнить команду в области запроса оболочки командной строки PostgreSQL, чтобы увидеть результаты. Щелкните значок «Выполнить» на панели задач графического пользовательского интерфейса pgAdmin или нажмите клавишу «Ввод» на клавиатуре, если вы работаете в командной оболочке SQL для выполнения этого запроса. Вы увидите, что запрос работает правильно в соответствии с выводом, показанным в области вывода моментального снимка, например сообщениями. Это означает, что таблица «test» была успешно продублирована,
Вы можете увидеть вновь созданную таблицу «новая» в списке таблиц в базе данных Postgres.
После извлечения содержимого таблицы «новая» инструментом запроса с помощью команды SELECT он показывает те же данные, что и таблица «test» вместе со структурой, например, имена столбцов.
Пример 2
Пользователь также может создать дублирующую таблицу в PostgreSQL с помощью другой команды. Это дублирование будет выполнено без дублирования данных таблицы. Следовательно, мы будем использовать ключевое слово «no data» после оператора select в соответствии с приведенным ниже запросом. Запрос создавал новую таблицу с именем «duplicate» с помощью оператора CREATE TABLE и копировал структуру таблицы «test» с помощью оператора SELECT. Оператор «без данных» будет использоваться для предотвращения копирования данных из таблицы «test» в таблицу «duplicate». После выполнения запрос был успешным, как показано ниже, и таблица была успешно продублирована.
Создайте новую базу данных Postgres
Для того, чтобы создать новую базу данных Postgres, используйте команду createdb, как показано ниже.
Ниже команда создаст новую пользовательскую базу данных PostgreSQL под названием “andreyex”.
# createdb andreyex
Если команда createdb нет в вашей системе, или что-то пошло не так во время установки. Вы могли бы быть иметь в своей среде PATH.
При установке с помощью yum, эта команда будет в /usr/pgsql-X.Y/bin/createdb (где, XY это номер версии), с соответствующей ссылкой на /usr/bin. Таким образом, вы не будете иметь проблему здесь.
Но, если вы установили из исходных текстов, то вы можете убедиться, что каталог /usr/local/pgsql/bin/ находиться в вашей переменной PATH.
Кроме того, убедитесь, что вы создаете базу данных от пользователя, обладающего правами на создание базы данных. Если вы новичок в понятиях пользователей/роли в PostgreSQL, на данный момент, идти вперед и войдите в систему с правами администратора (при условии, что вы установили POSTGRESQL как root), и выполните команду createdb оттуда.
В следующем примере, мы создадим базу данных из Linux пользователя под названием “Maxim”, который не имеет соответствующего привилегию, чтобы создать новую базу данных.
$ createdb andreyex createdb: could not connect to database template1: FATAL: role "Maxim" does not exist
И, наконец, когда вы создаете новую базу данных, и если ваш сервер PostgreSQL не запущен, то вы получите следующее сообщение об ошибке “could not connect to database template1”.
# createdb andreyex createdb: could not connect to database template1: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Примечание: Если вы создали базу данных по ошибке, вы можете удалить базу данных с помощью команды “dropdb”, как показано ниже.
# dropdb andreyex
Исходные данные
Давайте представим, что нам нужно создать две таблицы, первая – для хранения товаров, и вторая – для хранения категорий, к которым относятся эти товары.
Структура таблиц будет следующая:
- goods – таблица будет содержать информацию о товарах:
- product_id – идентификатор товара, данное значение должно автоматически генерироваться. Столбец не может содержать значения NULL и является первичным ключом;
- product_name – наименование товара, столбец не может содержать значения NULL;
- category – ссылка на категорию товара, столбец не может содержать значения NULL, но имеет значение по умолчанию, например, для случаев, когда товар еще не распределили в необходимую категорию, в этом случае товару будет присвоена категория по умолчанию («Не определена» или «Не указана»);
- price – цена товара, столбец может содержать значения NULL, например, с ценой еще не определились.
- categories — таблица будет содержать описание категорий товаров:
- category_id – идентификатор категории, данное значение должно автоматически генерироваться. Столбец не может содержать значения NULL и является первичным ключом;
- category_name – наименование категории, столбец не может содержать значения NULL.
При этом внести товар с несуществующей категорией нельзя, поэтому мы добавим еще и ограничение внешнего ключа.
Вставка записи в таблицу
Следующий шаг должен вставить некоторые записи сотрудников в таблицу сотрудников.
Синтаксис точно такое же, как и любой стандартный синтаксис SQL вставки.
Далее будет вставить 5 записей в таблицу сотрудников с заданными значениями для всех полей.
INSERT INTO employee VALUES (100,'Thomas','Sales',5500); INSERT INTO employee VALUES (200,'Maxim','Technology',5600); INSERT INTO employee VALUES (300,'Artem','Technology',7600); INSERT INTO employee VALUES (400,'Andrey','Marketing',9200); INSERT INTO employee VALUES (500,'Vasil','Technology',6100);
Порядок значений должен соответствовать порядку имен столбцов, которые вы видите в выводе команды “\d employee”, то есть в том же порядке, как вы создали таблицу.
Примечание
В приведенной выше вставке, хотя идентификатор может быть автоматически сгенерирован, мы указали значение идентификатора сотрудника (для столбца ID).
В следующем примере, мы можем вставить значения только в определенных столбцах таблицы сотрудников, указав имя столбца в скобках, как показано ниже.
В следующем примере мы вставим новую запись сотрудника только со значениями имен и столбцов.
andreyex=# INSERT INTO employee (name,dept) VALUES ('Oleg', 'Accounting'); INSERT 0 1
Если команда вставки выполнена успешно, то появится сообщение “INSERT 0 1”, как показано выше.
Результаты тестов
Этот тест показывает общее влияние различных размеров больших страниц. Первый набор тестов был создан с размером страницы по умолчанию в Linux 4 КБ без включения больших страниц
Обратите внимание, что прозрачные огромные страницы также были отключены и оставались отключенными на протяжении всех этих тестов.
Затем второй набор тестов был выполнен размером больших страниц в 2 MБ. Наконец, третий набор тестов выполняется с размером больших страниц 1 ГБ.
Все эти тесты были выполнены в PostgreSQL версии 11
Наборы включают в себя комбинацию разных размеров базы данных и клиентов. На приведенном ниже графике показаны сравнительные результаты производительности для этих тестов с TPS (транзакций в секунду) по оси Y, размером базы данных и количеством клиентов на размер базы данных по оси X.
Из приведенного выше графика видно, что прирост производительности с большими страницами увеличивается с увеличением количества клиентов и размера базы данных, если размер остается в предварительно выделенном буфере в разделяемой памяти (shared buffer).
Этот тест показывает TPS в сравнении с количеством клиентов. В этом случае размер базы данных составляет 48 ГБ. На оси Y у нас есть TPS, а на оси X у нас есть количество подключенных клиентов. Размер базы данных достаточно мал, чтобы поместиться в shared buffer, который установлен на 64 ГБ.
Если для больших страниц установлено значение 1 ГБ, то чем больше клиентов, тем выше сравнительный прирост производительности.
Следующий график такой же, как приведенный выше, за исключением размера базы данных 96 ГБ. Это превышает размер shared buffer, который установлен на 64 ГБ.
Ключевое наблюдение здесь заключается в том, что производительность с большими страницами, равными 1 ГБ, увеличивается по мере увеличения числа клиентов, и в конечном итоге она дает большую производительность, чем большие страницы в 2 МБ или стандартный размер страницы в 4 КБ.
Этот тест показывает TPS в зависимости от размера базы данных. В этом случае количество подключенных клиентов составляет 32. На оси Y у нас TPS, а на оси X — размеры базы данных.
Как и ожидалось, когда база данных выходит за пределы предварительно выделенных больших страниц, производительность значительно снижается.
Утилиты (программы) PosgreSQL:
- createdb и dropdb – создание и удаление базы данных (соответственно)
- createuser и dropuser – создание и пользователя (соответственно)
- pg_ctl – программа предназначенная для решения общих задач управления (запуск, останов, настройка параметров и т.д.)
- postmaster – многопользовательский серверный модуль PostgreSQL (настройка уровней отладки, портов, каталогов данных)
- initdb – создание новых кластеров PostgreSQL
- initlocation – программа для создания каталогов для вторичного хранения баз данных
- vacuumdb – физическое и аналитическое сопровождение БД
- pg_dump – архивация и восстановление данных
- pg_dumpall – резервное копирование всего кластера PostgreSQL
- pg_restore – восстановление БД из архивов (.tar, .tar.gz)
Примеры создания резервных копий:
Создание бекапа базы mydb, в сжатом виде
pg_dump -h localhost -p 5440 -U someuser -F c -b -v -f mydb.backup mydb
Создание бекапа базы mydb, в виде обычного текстового файла, включая команду для создания БД
pg_dump -h localhost -p 5432 -U someuser -C -F p -b -v -f mydb.backup mydb
Создание бекапа базы mydb, в сжатом виде, с таблицами которые содержат в имени payments
pg_dump -h localhost -p 5432 -U someuser -F c -b -v -t *payments* -f payment_tables.backup mydb
Дамп данных только одной, конкретной таблицы. Если нужно создать резервную копию нескольких таблиц, то имена этих таблиц перечисляются с помощью ключа -t для каждой таблицы.
pg_dump -a -t table_name -f file_name database_name
Создание резервной копии с сжатием в gz
pg_dump -h localhost -O -F p -c -U postgres mydb | gzip -c > mydb.gz
Список наиболее часто используемых опций:
- -h host — хост, если не указан то используется localhost или значение из переменной окружения PGHOST.
- -p port — порт, если не указан то используется 5432 или значение из переменной окружения PGPORT.
- -u — пользователь, если не указан то используется текущий пользователь, также значение можно указать в переменной окружения PGUSER.
- -a, —data-only — дамп только данных, по-умолчанию сохраняются данные и схема.
- -b — включать в дамп большие объекты (blog’и).
- -s, —schema-only — дамп только схемы.
- -C, —create — добавляет команду для создания БД.
- -c — добавляет команды для удаления (drop) объектов (таблиц, видов и т.д.).
- -O — не добавлять команды для установки владельца объекта (таблиц, видов и т.д.).
- -F, —format {c|t|p} — выходной формат дампа, custom, tar, или plain text.
- -t, —table=TABLE — указываем определенную таблицу для дампа.
- -v, —verbose — вывод подробной информации.
- -D, —attribute-inserts — дамп используя команду INSERT с списком имен свойств.
Бекап всех баз данных используя команду pg_dumpall.
pg_dumpall > all.sql
Восстановление таблиц из резервных копий (бэкапов):
psql — восстановление бекапов, которые хранятся в обычном текстовом файле (plain text);
pg_restore — восстановление сжатых бекапов (tar);
Восстановление всего бекапа с игнорированием ошибок
psql -h localhost -U someuser -d dbname -f mydb.sql
Восстановление всего бекапа с остановкой на первой ошибке
psql -h localhost -U someuser —set ON_ERROR_STOP=on -f mydb.sql
Для восстановления из tar-арихива нам понадобиться сначала создать базу с помощью CREATE DATABASE mydb; (если при создании бекапа не была указана опция -C) и восстановить
pg_restore —dbname=mydb —jobs=4 —verbose mydb.backup
Восстановление резервной копии БД, сжатой gz
gunzip mydb.gz psql -U postgres -d mydb -f mydb
Псевдо роль public
Псевдо роль public не видна, но про неё следует знать. Это групповая роль, в которую включены все остальные роли. Это означает, что все роли по умолчанию будут иметь привилегии наследуемые от public. Поэтому иногда у public отбирают некоторые привилегии, чтобы отнять их у всех пользователей.
Роль public по умолчанию имеет следующие привилегии:
-
для всех баз данных:
- CONNECT – это означает что любая созданная роль сможет подключаться к базам данных, но не путайте с привилегией LOGIN;
- TEMPORARY – любая созданная роль сможет создавать временные объекты во всех база данных и объекты эти могут быть любого размера;
-
для схемы public:
- CREATE (создание объектов) – любая роль может создавать объекты в этой схеме;
- USAGE (доступ к объектам) – любая роль может использовать объекты в этой схеме;
-
для схемы pg_catalog и information_schema
USAGE (доступ к объектам) – любая роль может обращаться к таблицам системного каталога;
:
-
для всех функций
EXECUTE (выполнение) – любая роль может выполнять любую функцию. Ещё нужны ещё права USAGE на ту схему, в которой функция находится, и права к объектам к которым обращается функция.
:
Это сделано для удобства, но снижает безопасность сервера баз данных.
Листинг баз данных
Вы можете подключиться к серверу PostgreSQL, используя psqlкоманду как любой системный пользователь. В зависимости от конфигурации сервера пользователю может потребоваться ввести свой пароль для подключения к терминалу psql. Чтобы получить доступ к терминалу psql от имени пользователя, в который вы вошли, просто введите psql.
Когда пакет PostgreSQL установлен, создается административный пользователь с именем «postgres». По умолчанию этот пользователь может подключиться к локальному серверу PostgreSQL без пароля.
Чтобы получить доступ к psqlтерминалу как пользователь «postgres», запустите:
sudo -u postgres psql
Команда sudo позволяет запускать команды в качестве другого пользователя.
Из терминала psql выполните мета-команду \l или \list, чтобы вывести список всех баз данных:
\l
Вывод будет включать количество баз данных, имя каждой базы данных, ее владельца, кодирование и привилегии доступа:
List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+---------+---------+----------------------- odoo | odoo | UTF8 | C | C.UTF-8 | postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 | template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)
Сервер PostgreSQL имеет три базы данных, созданные по умолчанию: template0, template1 и postgres. Первые два – это шаблоны, которые используются при создании новых баз данных.
Если вы хотите получить информацию о размерах баз данных, табличных пространствах по умолчанию и описаниях, используйте \l+ или \list+. Размер базы данных будет показан, только если текущий пользователь может подключиться к нему.
Чтобы получить список всех баз данных без доступа к оболочке psql, используйте переключатель -c, как показано ниже:
sudo -u postgres psql -c "\l"
Другой способ составить список баз данных – использовать следующий оператор SQL:
SELECT datname FROM pg_database;
В отличие от мета-команды \l, приведенный выше запрос покажет только имена баз данных:
datname ----------- postgres odoo template1 template0 (4 rows)
Мониторинг
-
Monitoring Database Activity
-
pgFouine — a PostgreSQL log analyzer
- bucardo.org check_postgres — Perl cкрипт для мониторинга более 20 параметров, определяющих состояние СУБД PostgreSQL.
Текущую активность базы данных легко оценить с помощью команды ps, для вывода в реальном времени (с задержкой 1 секунда) можно использовать утилиту Команда watch с практическим примерами:
# watch -n 1 'ps auxww | grep ^postgres' postgres 14164 0.0 0.0 188492 5296 ? S Dec13 0:46 /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data postgres 14166 0.0 0.0 159904 1264 ? Ss Dec13 0:05 postgres: logger process postgres 14168 0.0 0.1 188636 27208 ? Ss Dec13 0:49 postgres: writer process postgres 14169 0.0 0.0 188492 1348 ? Ss Dec13 0:23 postgres: wal writer process postgres 14170 0.0 0.0 188804 1752 ? Ss Dec13 0:17 postgres: autovacuum launcher process postgres 14171 0.0 0.0 160176 1468 ? Ss Dec13 0:45 postgres: stats collector process postgres 21596 0.0 0.1 190228 30476 ? Ss Dec27 0:58 postgres: postgres mbill 127.0.0.1(37047) idle postgres 21597 0.0 0.0 189716 5672 ? Ss Dec27 0:00 postgres: postgres mbill 127.0.0.1(37048) idle
Так как для каждого клиента создаётся своя копия процесса postmaster, то это позволяет подсчитать число активных клиентов. Статусная строка даёт информацию о состоянии клиента. Фразы writer process, stats buffer process и stats collector process соответствуют системным процессам, запущенным самим PostgreSQL при старте. Пользовательские процессы имеют статусную строку вида:
postgres: «пользователь» «база» «хост» «статус»
«пользователь», «база» и «хост» соответствуют имени пользователя «пользователь» подсоединявшегося к базе «база» с компьютера «хост». «статус» может принимать следующие параметры:
- idle — ожидание команды от клиента,
- idle in transaction — ожидание команды от клиента внутри транзакции (между BEGIN и окончанием транзакции),
- SQL- команда — выполняется эта команда, например, SELECT,
- waiting — ждём когда разблокируется занятая другим процессом таблица. Для уточнения из-за чего возникла блокировка, нужно анализировать представление pg_locks.
Отчет по конфигурации: «Справочники, документы, регистры. Подсчет количества записей и переход в форму списка объекта» Промо
Отчет даёт моментальное представление о качественном и количественном заполнении базы данных по видам справочников, документов, регистров (накопления, бухгалтерии, сведений).
Отбор документов по периоду, по организации (при наличии такого реквизита). Авто установка фильтра по периоду, по организации при переходе в форму списка.
Отбор регистров по периоду (кроме непериодических регистров сведений), по организации (при наличии такого измерения). Авто установка фильтра по периоду, по организации при переходе в форму списка.
Дополнительный подсчёт количества справочников, документов по статусу «Помечен на удаление» в отчёте. Авто установка фильтра по статусу «Помечен» при переходе в форму списка.
Дополнительный подсчёт количества документов по статусу «Проведён / Не проведён». Авто установка фильтра по статусу «Проведён» при переходе в форму списка.
Двойной клик по ячейке отчёта выполняет переход в форму списка выбранного справочника, документа, регистра (накопления, бухгалтерии, сведений).
3 стартмани
Основные команды PostgreSQL в интерактивном режиме:
- \connect db_name – подключиться к базе с именем db_name
- \du – список пользователей
- \dp (или \z) – список таблиц, представлений, последовательностей, прав доступа к ним
- \di – индексы
- \ds – последовательности
- \dt – список таблиц
- \dt+ — список всех таблиц с описанием
- \dt *s* — список всех таблиц, содержащих s в имени
- \dv – представления
- \dS – системные таблицы
- \d+ – описание таблицы
- \o – пересылка результатов запроса в файл
- \l – список баз данных
- \i – читать входящие данные из файла
- \e – открывает текущее содержимое буфера запроса в редакторе (если иное не указано в окружении переменной EDITOR, то будет использоваться по умолчанию vi)
- \d “table_name” – описание таблицы
- \i запуск команды из внешнего файла, например \i /my/directory/my.sql
- \pset – команда настройки параметров форматирования
- \echo – выводит сообщение
- \set – устанавливает значение переменной среды. Без параметров выводит список текущих переменных (\unset – удаляет).
- \? – справочник psql
- \help – справочник SQL
- \q (или Ctrl+D) – выход с программы
Кто уложил 1С, или мониторинг загрузки кластера в разрезе пользователей с помощью Grafana
Мониторингом различных параметров работы кластера 1С в zabbix сейчас уже никого не удивишь. Собственно потребление памяти, процов и места на серверах обычно настраивают первыми. Потом идет мониторинг в разрезе rphost’ов и различные метрики функционирования SQL сервера. Но вот когда уже все это есть, то временами возникает вопрос — какой же конкретно нехороший человек пытается съесть все (ну не все, но много) ресурсы сервера?
Можно смотреть в консоль кластера и ловить редиску там. Можно анализировать журнал регистраций, включать технологический журнал или накапливать статистку в специализированных базах 1С. Но, «настоящим» сисадминам проще как-то с внешними скриптами, базами данных и, например, Grafana. Расскажу что у нас получилось.
1 стартмани
02.09.2019
14166
32
DonAlPatino
26
Числовые типы
Имя | Размер | Описание | Диапазон | Пример |
integer | 2 байта | Отрицательное или положительное целое число. | от -2147483648 до +2147483647 | 516 |
numeric(m, n) | переменный | Вещественное число с фиксированной точностью. Точность для этого типа настраиваемая, это значит, что её можно указать с помощью точности (m) и масштаба (n). Точность – общее количество цифр, масштаб – количество цифр после запятой.Например число 468,45 – NUMERIC(5, 2). Можно задать только точность, например NUMERIC(3), тогда масштаб станет равен 0. На самом деле точность и масштаб можно не задавать. В таком случае можно будет сохранить число с любой точностью и масштабом в рамках ограничений. Этот тип применяется для чисел, где важна точность, например для хранения денежных сумм. | 131072 цифр до точки 16383 цифр после точки | 12,12958 |
real | 4 байта | Число с плавающей точкой. Как следствие точность меньше чем у numeric, зато вычисления происходят быстрее. | 6 цифр после точки | 56,13 |
serial | 4 байта | Целое число из последовательности, то есть оно автоматически увеличивается для каждой новой строки. Проще говоря, создавая этот тип для столбца, вам не нужно придумывать значения в нём. Так как за вас это сделает система. Этот тип гарантирует уникальность в рамках диапазона. | от 1 до 2147483647 | 50 |
money | 8 байт | Тип для хранения денежной суммы. | от -92233720368547758.08до +92233720368547758.07 | 100,50 |
# CREATE TABLE test (integer integer, numeric numeric(4,3), real real, serial serial, money money); # INSERT INTO test (integer, numeric, real, money) VALUES (123, 1.343, 1233.2, 245.65); INSERT 0 1 # SELECT * FROM test; integer | numeric | real | serial | money ---------+---------+--------+--------+---------- 123 | 1.343 | 1233.2 | 1 | 245,65 ₽ (1 row)
Из вывода выше стоит отметить, что в примере выше мы не вставляли значение в колонку serial, система это проделала за нас. А также в колонке money при выводе мы видим знак денежной единицы.
Комментарии
Метод GetSchemaTable возвращает метаданные о каждом столбце в следующем порядке:
Столбец DataReader | Описание |
---|---|
ColumnName | Имя столбца в том виде, в котором оно отображается в DataTable . |
ColumnOrdinal | Порядковый номер столбца |
ColumnSize | значение-1 ColumnSize , если свойство (или MaxLength ) DataColumn не может быть определено или не является релевантным; в противном случае — 0 или положительное целое число, содержащее значение. |
NumericPrecision | Если типом столбца является числовой тип, это максимальная точность столбца. Если тип столбца не является числовым типом данных, это значение равно null. |
NumericScale | Если тип данных столбца имеет компонент масштабирования, возвращается число цифр справа от десятичной запятой. В противном случае возвращается значение null. |
DataType | Базовый тип столбца. |
ProviderType | Признак типа данных столбца. Если тип данных столбца отличается от строки к строке, это значение равно Object . Этот столбец не может содержать значение NULL. |
IsLong | значение, если столбец имеет тип данных String , а его MaxLength свойство имеет значение-1. В противном случае — значение . |
AllowDBNull | значение, если для столбца задано ограничение AllowDbNull, равное true. в противном случае — . |
IsReadOnly | значение, если столбец не может быть изменен; в противном случае — значение . |
IsRowVersion | для каждого столбца. |
IsUnique | : Ни одна из двух строк в не DataTable может иметь одинаковое значение в этом столбце. гарантированно будет иметь значение true, если столбец представляет ключ самостоятельно или если существует ограничение типа UNIQUE, которое применяется только к этому столбцу. : Столбец может содержать дублирующиеся значения в . По умолчанию этот столбец имеет значение . |
IsKey | : Столбец является одним из набора столбцов, которые вместе однозначно идентифицируют строку в DataTable . Набор столбцов с параметром, равным, должен однозначно идентифицировать строку в . Нет необходимости, чтобы этот набор столбцов являлся минимальным. Этот набор столбцов может быть создан из первичного ключа, уникального ограничения или уникального индекса. : Столбец не требуется для уникальной идентификации строки. Это значение равно, Если столбец участвует в одном или составном первичном ключе. В противном случае его значение равно . |
IsAutoIncrement | : Столбец присваивает значения новым строкам с фиксированным приращением. : Столбец не присваивает значения новым строкам с фиксированным приращением. По умолчанию этот столбец имеет значение . |
BaseCatalogName | Имя каталога в хранилище данных, содержащем столбец. значение, если невозможно определить базовое имя каталога. Значением по умолчанию для этого столбца является значение. |
BaseSchemaName | Это значение всегда равно . |
BaseTableName | Имя DataTable. |
BaseColumnName | Имя столбца в DataTable . |
аутоинкрементсид | Значение DataTable AutoIncrementSeed Свойства. |
аутоинкрементстеп | Значение DataTable AutoIncrementStep Свойства. |
DefaultValue | Значение DataColumn DefaultValue Свойства. |
Expression | Строка выражения, если текущий столбец является столбцом выражения, а все столбцы, используемые в выражении, принадлежат к тому же , что содержат столбец выражения. в противном случае — значение . |
ColumnMapping | MappingTypeЗначение, связанное с DataColumn . Тип может быть одним из , , или . Значение по умолчанию — . |
басетабленамеспаце | Значение DataTable Namespace Свойства. |
басеколумннамеспаце | Значение DataColumn Namespace Свойства. |
Уникальный идентификатор
Имя | Описание | Пример |
uuid | 128-битное значение, генерируемое специальным алгоритмом, практически гарантирующим, что этим же алгоритмом оно не будет получено больше нигде в мире. Записывается в виде 32 шестнадцатеричных цифр, разделённых на несколько групп. | a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 |
# CREATE TABLE uid (uid uuid, name varchar(15)); # INSERT INTO uid (uid, name) VALUES (gen_random_uuid (), 'alex'), (gen_random_uuid (), 'bob'), (gen_random_uuid (), 'max'); # SELECT * FROM uid; uid | name --------------------------------------+------ 650d3f16-c81c-4bbb-83a8-1964a6d2912e | alex 7eb5cf8e-9755-48b3-8e66-753a09c6a7ed | bob b7837e0a-3519-4812-89f1-c7a9784406a3 | max (3 rows)
Функция gen_random_uuid () предназначена для генерирования уникального uuid. Хотя есть мизерная вероятность что будет сгенерирован неуникальный uuid.
Существуют и другие типы, например для хранения двоичных данных, json, массивов, xml и другой информации. Но так как я их не применял, то и описывать пока не буду.
Сводка
Имя статьи
Типы данных PostgreSQL
Описание
В PostgreSQL важно знать про типы данных. Каждая колонка в таблице имеет свой тип и может хранить только данные определенного типа
Рассмотрим основные типы