Professional Documents
Culture Documents
15 полезных команд PostgreSQL
15 полезных команд PostgreSQL
43 279314
SELECT pg_database_size(current_database());
SELECT pg_database_size('my_database');
SELECT pg_size_pretty(pg_database_size(current_database()));
Перечень таблиц
Иногда требуется получить перечень таблиц базы данных. Для этого используем
следующий запрос:
Запрос, описанный ниже, выберет все таблицы из указанной схемы текущей базы
данных:
Размер таблицы
SELECT pg_relation_size('accounts');
Для того, чтобы вывести список таблиц текущей базы данных, отсортированный по
размеру таблицы, выполним следующий запрос:
Для того, чтобы вывести информацию о самой большой таблице, ограничим запрос с
помощью LIMIT:
Активность пользователя
Если так получилось, что в таблице нет первичного ключа (primary key), то наверняка
среди записей найдутся дубликаты. Если для такой таблицы, особенно большого
размера, необходимо поставить ограничения (constraint) для проверки целостности, то
удалим следующие элементы:
дублирующиеся строки,
ситуации, когда одна или более колонок дублируются (если эти колонки
предполагается использовать в качестве первичного ключа).
Уникальное для каждой записи поле ctid по умолчанию скрыто, но оно есть в каждой
таблице.
Если допустимо удаление дубликатов без сохранения всех данных, выполним такой
запрос:
Перед удалением такие записи можно перенести во временную таблицу или заменить в
них значение customer_id на другое.
DELETE FROM table_name WHERE ctid NOT IN (SELECT max(ctid) FROM table_name GROUP BY column1, [column 2,] );
Может возникнуть вопрос о включении в этот список такой задачи. Ведь в PostgreSQL
изменить тип поля очень просто с помощью команды ALTER. Давайте для примера снова
рассмотрим таблицу с покупателями.
Для поля customer_id используется строковый тип данных varchar. Это ошибка, так как
в этом поле предполагается хранить идентификаторы покупателей, которые имеют
целочисленный формат integer. Использование varchar неоправданно. Попробуем
исправить это недоразумение с помощью команды ALTER:
Это значит, что нельзя просто так взять и изменить тип поля при наличии данных в
таблице. Так как использовался тип varchar, СУБД не может определить
принадлежность значения к integer. Хотя данные соответствуют именно этому типу.
Для того, чтобы уточнить этот момент, в сообщении об ошибке предлагается
использовать выражение USING, чтобы корректно преобразовать наши данные в integer:
ALTER TABLE customers ALTER COLUMN customer_id TYPE integer USING (customer_id::integer);
ALTER TABLE customers ALTER COLUMN customer_id TYPE varchar USING (customer_id || '-' || first_name);
Первый способ
Выполним следующий запрос, чтобы найти начало интервала с «потерянным»
значением:
SELECT customer_id + 1
FROM customers mo
WHERE NOT EXISTS
(
SELECT NULL
FROM customers mi
WHERE mi.customer_id = mo.customer_id + 1
)
ORDER BY customer_id;
WITH seq_max AS (
SELECT max(customer_id) FROM customers
),
seq_min AS (
SELECT min(customer_id) FROM customers
)
SELECT * FROM generate_series((SELECT min FROM seq_min),(SELECT max FROM seq_max))
EXCEPT
SELECT customer_id FROM customers;
Второй способ
Получаем имя последовательности, связанной с customer_id:
WITH sequence_info AS (
SELECT start_value, last_value FROM "SchemaName"."SequenceName"
)
SELECT generate_series ((sequence_info.start_value), (sequence_info.last_value))
FROM sequence_info
EXCEPT
SELECT customer_id FROM customers;
Использование транзакций
Для того, чтобы откатить все операции, расположенные после BEGIN, используем
команду ROLLBACK.
SELECT pg_cancel_backend(procpid);
SELECT pg_terminate_backend(procpid);
Работа с конфигурацией
Поиск и изменение расположения экземпляра кластера
SHOW data_directory;
SELECT pg_reload_conf();
4 43 279314