среда, 27 марта 2013 г.

Макросы в pgAdmin. Количество записей в таблице и размер в мегабайтах.


Я уже рассказывал про макросы для замечательной программы pgAdmin в предыдущем посте. В этом сообщении хочу поделиться еще двумя полезными макросами, которые могут пригодиться для оценки объема таблиц и не только.


  1. Макрос для получения количества строк в таблице, чье название выделено в окне Query Tool.

    SELECT COUNT(*) FROM $SELECTION$

  2. Макрос, позволяющий определить размер объекта, в название которого входит выделенный в Query Tool текст. Среди таких объектов могут быть таблицы, индексы, последовательности (sequence).

    SELECT pg_class.relkind AS "Тип", pg_namespace.nspname AS "Схема", pg_class.relname AS "Имя", 
    pg_class.relpages::FLOAT*8192/1024/1024 AS "Размер (Мб)", 
    pg_class.reltuples AS "Записей" FROM pg_class
    LEFT JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid 
    WHERE 
    NOT pg_class.relname LIKE 'pg_%' 
    AND NOT (pg_namespace.nspname ILIKE 'pg_%' OR pg_namespace.nspname ILIKE 'information_%') 
    AND pg_class.relname ILIKE ('%' || TRIM('$SELECTION$') ||  '%')  ORDER BY pg_class.relpages DESC;


Благодаря этим макросам можно оперативно оценить объем тех или иных объектов в базе.

вторник, 26 марта 2013 г.

Макросы в pgAdmin. Список таблиц и поля таблицы.


Я работаю программистом и мне часто приходится иметь дело с базами данных. Основная часть моих обязанностей на текущей работе -это разработка схемы БД для Postgresql и создание функций на языке pgSQL. Для разработки кода функций используется программа pgAdmin 3, поставляемая вместе с PostgreSQL. Программа бесплатна, но не всегда удобна. Особенно это касается задач, связанных с созданием структуры СУБД. Для этих целей лучше всего подходит PostgreSQL Maestro, чей дружелюбный интерфейс позволяет упростить и ускорить построение структуры базы.
Однако за долгое время работы с этими программами я заметил, что pgAdmin гораздо стабильней работает, чем PostgreSQL Maestro. Последняя в случае недоступности сервера БД может просто  завершиться с ошибкой, не давая возможности сохранить набранный текст. Другой проблемой этой программы является отображение не в той кодировке сообщений от сервера БД. Из-за этого часто невозможно узнать, в чем причина ошибки того или иного запроса. Поэтому для написания и отладки функций я использую родную программу pgAdmin.
Однако и при написании кода возникает потребность узнать точное наименование таблицы ее структуру. Раньше приходилось постоянно лазить дереву с таблицами и искать нужные названия полей. Это замедляло написание коды. Однако недавно я открыл для себя
замечательную функцию этой программы - макросы.

Макрос - это команда SQL, которая может запускаться по нажатию определенного сочетания клавиш в окне Query Tool.Макросы предназначены для выполнения каких-либо типовых операций.
Чтобы создать макрос, необходимо нажать на команду "Макрос" в главном меню Query Tool. 


В появившемся окне слева выбираем сочетание клавиш, а справа вставляем текст макроса, который будет соответствовать данному сочетанию клавиш. 



Макросу нужно задать имя, а затем нажать кнопку "Сохранить".
 Текст макроса представляет собой обычный запрос, за исключением специального ключевого слова $SELECTION$. В это слово подставляется выделенный при редактировании в Query Tool текст. 
Получается, чтобы узнать какую-либо информацию о таблице, вовсе не обязательно писать полный запрос к этой таблице, достаточно написать ее имя, выделить данное имя и запустить макрос, запрашивающий нужную информацию.
А теперь приведу примеры полезных макросов, которые я использую в своей работе.

  1.  Макрос, получающий список таблиц для схемы public базы данных PostgreSQL.


    SELECT * FROM information_schema.TABLES
    WHERE 
    table_type='BASE TABLE' AND table_schema='public'
    ORDER BY table_name


  2.  Макрос, получающий список полей в таблице, чье название выделено (очень не хватало этой возможности, когда я перешел с MS SQL Server 2008, в Microsoft Management Studio она была по-умолчанию).

    SELECT quote_ident(nspname) || '.' || quote_ident(relname) AS table_name, 
           quote_ident(attname) AS field_name, 
           format_type(atttypid,atttypmod) AS field_type, 
           case when attnotnull then ' NOT NULL' else '' end AS null_constraint,
           case when atthasdef then 'DEFAULT ' || 
                                    ( SELECT pg_get_expr(adbin, attrelid) 
                                        FROM pg_attrdef 
                                       WHERE adrelid = attrelid AND adnum = attnum )::text else ''
           end AS dafault_value,
           case when nullif(confrelid, 0) IS NOT NULL
                then confrelid::regclass::text || '( ' || 
                     array_to_string( ARRAY( SELECT quote_ident( fa.attname ) 
                                               FROM pg_attribute AS fa 
                                              WHERE fa.attnum = ANY ( confkey ) 
                                                AND fa.attrelid = confrelid
                                              ORDER BY fa.attnum 
                                            ), ','
                                     ) || ' )'
                else '' end AS references_to
      FROM pg_attribute 
           LEFT OUTER JOIN pg_constraint ON conrelid = attrelid 
                                        AND attnum = conkey[1] 
                                        AND array_upper( conkey, 1 ) = 1,
           pg_class, 
           pg_namespace
     WHERE pg_class.oid = attrelid
       AND pg_namespace.oid = relnamespace
       AND relname = btrim( '$SELECTION$' )
       AND attnum > 0
       AND NOT attisdropped
     ORDER BY attrelid, attnum;
 
Таким образом, когда, в случае разработки, я забываю точное название таблицы, я выполняю команду для первого макроса. И у меня перед глазами появляется весь список таблиц схемы public. А когда мне хочется узнать список полей данной таблицы, то я просто выделяю ее название и запускаю второй макрос. Теперь разработка PgSql-функций для меня значительно ускорилась :)


Каталог блогов Blogolist