Время прочтения: 6 мин.

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

          При работе с СУБД GreenPlum или PostgreSQL, как правило, в качестве инструментов управления базами данных используют pgAdmin или Dbeaver. Это хорошие и универсальные инструменты, однако, за универсальность приходится платить скоростью запроса к БД и работой приложения в целом.

Я расскажу, как зная SQL и десяток консольных команд, можно значительно ускорить выполнение запросов в GreenPlum с помощью PSQL.

PSQL — это терминальный клиент для работы с PostgreSQL. Он позволяет вводить запросы в интерактивном режиме, отправлять их в PostgreSQL и просматривать результаты запроса. Так как GreenPlum основан на PostgreSQL, то PSQL работает и с ним.

Устанавливается PSQL при установке PostgreSQL — называется Command Line Tools, в случае Greenplum PSQL устанавливается с pgAdmin. Для его запуска надо открыть командную строку в папке с psql.exe (например, при установке PostgreSQL путь PostgreSQL\14\bin\psql.exe). C PSQL можно работать в двух режимах:

  • интерактивный 
  • из командной строки (не интерактивный)

Оба режима доступны из командной строки. Отличие в том, что в интерактивном режиме подключиться к БД надо один раз в начале, а дальше уже писать SQL-запросы. Не интерактивный режим больше подходит для одиночного запроса, который удобно записать в одну строку, указав в ней и подключение, и сам запрос.

Пример команды по созданию таблицы в неинтерактивном режиме (в командной строке) выглядит так:

psql –h имя_хоста -U имя_пользователя -d имя_бд -c «CREATE TABLE my(some_id int, some_text text)

Далее приведу примеры в интерактивном режиме. Для его открытия надо выполнить команду PSQL и ввести запрашиваемые параметры, такие как: имя хоста (сервера), логин и пароль пользователя, название БД. После этого командная строка перейдет в интерактивный режим.

Пример: psql –h имя_хоста -U имя_пользователя -d имя_бд

Теперь можно вводить команды SQL:

Для выхода из интерактивного режима использую команду: \q

Помимо отправки SQL-запросов нужно ознакомиться со структурой базы и ее таблиц, для этого подойдет ряд команд:

  • \dt – список таблиц
  • \dt+ — список таблиц с описанием
  • \dp (или \z) – список таблиц, представлений, последовательностей, прав доступа к ним
  • \dv – представления
  • \l – список баз данных
  • \d “table_name” – описание таблицы
  • \help – справочник SQL

Данные команды выводят информацию о структуре в виде таблицы:

Каждый SQL-запрос должен заканчиваться точкой с запятой, если ее нет, то запрос не выполнится, а просто переведет строку:

Вводить запросы и получать результаты в командной строке, конечно, неудобно, поэтому есть команды, позволяющие работать с файлами:

  • \o – пересылка результатов запроса в файл
  • \i – читать входящие данные из файла
  • \copy — копирует данные

Для применения команды \i надо после нее указать ссылку на файл с запросом. В файле select.sql указана команда “select div_id, status_date from table limit 5;”. Без кавычек, также с указанием точки с запятой в конце.  

Отдельного внимания заслуживает команда \copy, она позволяет решать такие важные задачи, как экспорт и импорт данных между БД и csv файлом.

Экспорт данных в файл.

Команда \copy имеет ограничение в том, что должна выполняться в одну строку, из-за этого не получится вставить в нее многострочный запрос. Для решения этой проблемы можно создать временное представление и записать запрос в него, а в команде copy вывести все из представления.

Импорт данных из файла.

Перед тем как записать данные из файла в таблицу надо сначала ее создать. Команда DISTRIBUTED by входит в синтаксис создания таблиц в GreenPlum.

Разберу практический кейс по переносу данных с Hadoop на GreenPlum через pxf сервер. Это можно сделать через внешнюю таблицу (external table) в GreenPlum, которая запрашивает данные хранящиеся в Hadoop. После чего данные можно записать в обычную таблицу.

          Для начала надо создать внешнюю таблицу:

CREATE EXTERNAL TABLE caggp2.s_audit_da_sandbox_oapb.ext_st_crm_appeal (
	row_id	text
	, app_num	text
	, created_date	timestamp
	, party_id	text
	, party_lname	text
	, party_fname	text
	, party_mname	text
	, birth_dt	timestamp
	, status	text
	, created_by	text
)
LOCATION (
	'pxf:///user/team/team_audit_oapb/hive/s_crm_appeal?PROFILE=hdfs:parquet&SERVER=audit_da_sandbox'
) ON ALL
FORMAT 'CUSTOM' ( FORMATTER='pxfwritable_import' )
ENCODING 'UTF8'; 

Структуру исходной таблицы можно взять с помощью команды describe в hive. Так как некоторые названия типов данных в Hadoop и GreenPlum не совпадают, надо их переименовать, в моем случае сменить string на text.

          В разделе LOCATION (вывода команды describe в hive) указывается ссылка на таблицу в Hadoop, а также сам pxf сервер. Точный синтаксис ссылки зависит от настроек конкретного кластера.

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

CREATE TABLE s_audit_da_sandbox_oapb.st_crm_appeal (
	row_id	text
	, app_num	text
	, created_date	timestamp
	, party_id	text
	, party_lname	text
	, party_fname	text
	, party_mname	text
	, birth_dt	timestamp
	, status	text
	, created_by	text
)
WITH (
	appendonly=true,
	compresstype=zstd
)
DISTRIBUTED BY (row_id);

Теперь остается выполнить только запись данных из внешней таблицы в обычную:

insert into s_audit_da_sandbox_oapb.st_crm_appeal
select * from s_audit_da_sandbox_oapb.ext_st_crm_appeal; 

Время выполнения этой команды в Dbeaver составило 5 минут:

А в PSQL 15 секунд:

При сравнении скорости выполнения одинаковых запросов в Dbeaver и PSQL, скорость выполнения второго значительно быстрее.

Так же в PSQL является полезным то, что он работает из командной строки, которая легко интегрируется с другими системами и языками программирования.

Инструмент PSQL с первого взгляда кажется неудобным из-за отсутствия графического интерфейса, однако выигрывает в другом. К сильным качествам PSQL можно отнести:

  • Скорость выполнения запроса
  • Экспорт и импорт одной командой
  • Возможность автоматизировать выполнение скриптов.