sql >> Database >  >> RDS >> PostgreSQL

Mijn favoriete PostgreSQL-extensies - deel één

Dit is een vervolg op mijn vorige blogbericht waarin ik een onderwerp over PostgreSQL-extensies had aangeroerd. PostgreSQL-extensies zijn een plug-and-play-set met verbeteringen die een extra functieset toevoegen aan een PostgreSQL-cluster. Sommige van deze functies zijn zo eenvoudig als lezen of schrijven naar een externe database, terwijl andere een geavanceerde oplossing kunnen zijn om databasereplicatie, monitoring, enz. te implementeren.

PostgreSQL is in de loop der jaren geëvolueerd van een eenvoudig open source ORDBMS naar een krachtig databasesysteem met meer dan 30 jaar actieve ontwikkeling die betrouwbaarheid, prestaties en alle ACID-compatibele functies biedt. Nu PostgreSQL 12 een paar maanden geleden is uitgebracht, wordt deze databasesoftware alleen maar groter, beter en sneller.

Af en toe moesten extensies worden toegevoegd aan een PostgreSQL-cluster om verbeterde functionaliteit te bereiken die niet beschikbaar was in de oorspronkelijke code, omdat ze ofwel niet waren ontwikkeld vanwege tijdgebrek of vanwege onvoldoende bewijs van een edge case-database problemen. Ik ga een paar van mijn favoriete extensies in willekeurige volgorde bespreken, met enkele demo's die worden gebruikt door ontwikkelaars en DBA's.

Sommige van deze extensies moeten mogelijk worden opgenomen in de serverparameter shared_preload_libraries als een door komma's gescheiden lijst die vooraf moet worden geladen bij het opstarten van de server. Hoewel de meeste extensies zijn opgenomen in de contrib-module van de broncode, moeten sommige worden gedownload van een externe website die alleen is bedoeld voor PostgreSQL-extensies, het zogenaamde PostgreSQL Extension Network.

In deze tweedelige blogserie bespreken we extensies die worden gebruikt om toegang te krijgen tot gegevens (postgres_fwd) en om databases te verkleinen of te archiveren (pg_partman). Extra extensies zullen in het tweede deel worden besproken.

postgres_fdw

De postgres_fdw is een externe datawrapper-extensie die kan worden gebruikt om toegang te krijgen tot gegevens die zijn opgeslagen op externe PostgreSQL-servers. Deze extensie is vergelijkbaar met een oudere extensie genaamd dblink, maar verschilt van zijn voorganger door syntaxis die aan de standaarden voldoet en betere prestaties te bieden.

De belangrijke componenten van postgres_fdw zijn een server, een gebruikerstoewijzing en een vreemde tabel. Er is een kleine overhead toegevoegd aan de werkelijke kosten van het uitvoeren van query's op externe servers, wat de communicatie-overhead is. De postgres_fdw-extensie kan ook communiceren met een externe server met een versie tot PostgreSQL 8.3, en is dus achterwaarts compatibel met eerdere versies.

Demo

De demo toont een verbinding van PostgreSQL 12 naar een PostgreSQL 11-database. De pg_hba.conf-instellingen zijn al geconfigureerd om de servers met elkaar te laten praten. De controlebestanden voor extensies moeten in de gedeelde PostgreSQL-homedirectory worden geladen voordat de extensie wordt gemaakt vanuit Inside a PostgreSQL-cluster.

Externe server:

$ /usr/local/pgsql-11.3/bin/psql -p 5432 -d db_replica postgres

psql (11.3)

Type "help" for help.



db_replica=# create table t1 (sno integer, emp_id text);

CREATE TABLE



db_replica=# \dt t1

        List of relations

 Schema | Name | Type  |  Owner

--------+------+-------+----------

 public | t1   | table | postgres



db_replica=# insert into t1 values (1, 'emp_one');

INSERT 0 1

db_replica=# select * from t1;

 sno | emp_id

-----+---------

   1 | emp_one

(1 row)

Bronserver:

$ /database/pgsql-12.0/bin/psql -p 5732 postgres

psql (12.0)

Type "help" for help.

postgres=# CREATE EXTENSION postgres_fdw;

CREATE EXTENSION



postgres=# CREATE SERVER remote_server

postgres-# FOREIGN DATA WRAPPER postgres_fdw

postgres-# OPTIONS (host '192.168.1.107', port '5432', dbname 'db_replica');

CREATE SERVER



postgres=# CREATE USER MAPPING FOR postgres

postgres-# SERVER remote_server

postgres-# OPTIONS (user 'postgres', password 'admin123');

CREATE USER MAPPING



postgres=# CREATE FOREIGN TABLE remote_t1

postgres-# (sno integer, emp_id text)

postgres-# server remote_server

postgres-# options (schema_name 'public', table_name 't1');

CREATE FOREIGN TABLE



postgres=# select * from remote_t1;

 sno | emp_id

-----+---------

   1 | emp_one

(1 row)



postgres=# insert into remote_t1 values (2,'emp_two');

INSERT 0 1



postgres=# select * from remote_t1;

 sno | emp_id

-----+---------

   1 | emp_one

   2 | emp_two

(2 rows)

De WRITE-bewerking van de bronserver geeft onmiddellijk de externe servertabel weer. Er bestaat ook een vergelijkbare extensie genaamd oracle_fdw die LEES- en SCHRIJFtoegang tussen PostgreSQL- en Oracle-tabellen mogelijk maakt. Daarnaast is er nog een extensie genaamd file_fdw die gegevenstoegang mogelijk maakt vanuit platte bestanden op schijf. Raadpleeg de officiële documentatie van postgres_fdw die hier is gepubliceerd voor meer informatie en details.

pg_partman

Naarmate databases en tabellen groeien, is het altijd nodig om databases te verkleinen, gegevens te archiveren die niet nodig zijn of op zijn minst tabellen op te delen in verschillende kleinere fragmenten. Dit is zo dat de query-optimizer alleen de delen van de tabel bezoekt die aan de queryvoorwaarden voldoen, in plaats van de hele stapel tabellen te scannen.

PostgreSQL biedt al heel lang partitioneringsfuncties, waaronder technieken voor bereik, lijst, hash en subpartitionering. Het vereist echter veel administratie- en beheerinspanningen, zoals het definiëren van onderliggende tabellen die eigenschappen van een bovenliggende tabel erven om de partities ervan te worden, het creëren van triggerfuncties om gegevens naar een partitie om te leiden en het verder creëren van triggers om die functies aan te roepen, enz. Dit is waar pg_partman in het spel komt, waarin al dit gedoe automatisch wordt opgelost.

Demo

Ik zal een korte demo laten zien van het instellen en het invoegen van voorbeeldgegevens. U zult zien hoe de gegevens die in de hoofdtabel zijn ingevoegd automatisch worden doorgestuurd naar de partities door gewoon pg_partman in te stellen. Het is belangrijk dat de partitiesleutelkolom niet null is.

db_replica=# show shared_preload_libraries;

 shared_preload_libraries

--------------------------

 pg_partman_bgw

(1 row)



db_replica=# CREATE SCHEMA partman;

CREATE SCHEMA

db_replica=# CREATE EXTENSION pg_partman SCHEMA partman;

CREATE EXTENSION

db_replica=# CREATE ROLE partman WITH LOGIN;

CREATE ROLE

db_replica=# GRANT ALL ON SCHEMA partman TO partman;

GRANT

db_replica=# GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman;

GRANT

db_replica=# GRANT ALL ON SCHEMA PUBLIC TO partman;

GRANT

db_replica=# create table t1  (sno integer, emp_id varchar, date_of_join date not null);

db_replica=# \d

        List of relations

 Schema | Name | Type  |  Owner

--------+------+-------+----------

 public | t1   | table | postgres

(1 row)



db_replica=# \d t1

                         Table "public.t1"

    Column    |       Type        | Collation | Nullable | Default

--------------+-------------------+-----------+----------+---------

 sno          | integer           |           |          |

 emp_id       | character varying |           |          |

 date_of_join | date              |           | not null |

db_replica=# SELECT partman.create_parent('public.t1', 'date_of_join', 'partman', 'yearly');

 create_parent

---------------

 t

(1 row)



db_replica=# \d+ t1

                                             Table "public.t1"

    Column    |       Type        | Collation | Nullable | Default | Storage  | Stats target | Description

--------------+-------------------+-----------+----------+---------+----------+--------------+-------------

 sno          | integer           |           |          |         | plain    |              |

 emp_id       | character varying |           |          |         | extended |              |

 date_of_join | date              |           | not null |         | plain    |              |

Triggers:

    t1_part_trig BEFORE INSERT ON t1 FOR EACH ROW EXECUTE PROCEDURE t1_part_trig_func()

Child tables: t1_p2015,

              t1_p2016,

              t1_p2017,

              t1_p2018,

              t1_p2019,

              t1_p2020,

              t1_p2021,

              t1_p2022,

              t1_p2023



db_replica=# select * from t1;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# select * from t1_p2019;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# select * from t1_p2020;

 sno | emp_id | date_of_join

-----+--------+--------------

(0 rows)



db_replica=# insert into t1 values (1,'emp_one','01-06-2019');

INSERT 0 0

db_replica=# insert into t1 values (2,'emp_two','01-06-2020');

INSERT 0 0

db_replica=# select * from t1;

 sno | emp_id  | date_of_join

-----+---------+--------------

   1 | emp_one | 2019-01-06

   2 | emp_two | 2020-01-06

(2 rows)



db_replica=# select * from t1_p2019;

 sno | emp_id  | date_of_join

-----+---------+--------------

   1 | emp_one | 2019-01-06

(1 row)



db_replica=# select * from t1_p2020;

 sno | emp_id  | date_of_join

-----+---------+--------------

   2 | emp_two | 2020-01-06

(1 row)

Dit is een eenvoudige partitietechniek, maar elk van de bovenstaande eenvoudige partities kan verder worden onderverdeeld in subpartities. Raadpleeg de officiële documentatie van pg_partman die hier is gepubliceerd voor meer functies en functies die het biedt.

Conclusie

In deel twee van deze blog worden andere PostgreSQL-extensies besproken, zoals pgAudit, pg_repack en HypoPG.


  1. 3 manieren om rijen te retourneren die alfanumerieke tekens bevatten in SQL Server

  2. Benchmarking handmatige database-implementaties versus geautomatiseerde implementaties

  3. SQL 'LIKE'-query met '%' waarbij de zoekcriteria '%' bevatten

  4. Voorloop- en/of volgspaties van een tekenreeks verwijderen in T-SQL