PostgreSQL - PostgreSQL

PostgreSQL
O banco de dados relacional de código aberto mais avançado do mundo [1]
O banco de dados relacional de código aberto mais avançado do mundo
Desenvolvedor (s) Grupo de Desenvolvimento Global PostgreSQL
lançamento inicial 8 de julho de 1996 ;
25 anos atrás
 ( 1996-07-08 )
Versão estável
14.0  Edite isso no Wikidata / 30 de setembro de 2021 ; 10 dias atrás ( 30 de setembro de 2021 )
Repositório
Escrito em C
Sistema operacional macOS , Windows , Linux , FreeBSD , OpenBSD
Modelo RDBMS
Licença Licença PostgreSQL ( gratuita e de código aberto , permissiva )
Local na rede Internet www .postgresql .org Edite isso no Wikidata
Licença PostgreSQL
Editor PostgreSQL Global Development Group
Regents da University of California
Compatível com Debian FSG sim
FSF aprovado sim
OSI aprovado sim
Compatível com GPL sim
Copyleft Não
Vinculando a partir do código com uma licença diferente sim
Local na rede Internet postgresql .org / about / license

PostgreSQL ( / p s t ɡ r ɛ s ˌ k JU ɛ l / , POHST -gres kyoo el ), também conhecido como Postgres , é uma livre e-fonte aberto sistema de gestão de base de dados relacional (RDBMS), enfatizando a extensibilidade e SQL conformidade . Ele foi originalmente denominado POSTGRES, referindo-se às suas origens como um sucessor do banco de dados Ingres desenvolvido na Universidade da Califórnia, Berkeley . Em 1996, o projeto foi renomeado para PostgreSQL para refletir seu suporte para SQL . Após uma revisão em 2007, a equipe de desenvolvimento decidiu manter o nome PostgreSQL e o apelido Postgres.

PostgreSQL apresenta transações com propriedades de Atomicidade, Consistência, Isolamento, Durabilidade (ACID), visualizações atualizáveis ​​automaticamente , visualizações materializadas , gatilhos , chaves estrangeiras e procedimentos armazenados . Ele é projetado para lidar com uma variedade de cargas de trabalho, de máquinas individuais a data warehouses ou serviços da Web com muitos usuários simultâneos . É o banco de dados padrão do macOS Server e também está disponível para Windows , Linux , FreeBSD e OpenBSD .

História

PostgreSQL evoluiu do projeto Ingres na Universidade da Califórnia, Berkeley. Em 1982, o líder da equipe Ingres, Michael Stonebraker , deixou Berkeley para fazer uma versão proprietária do Ingres. Ele voltou para Berkeley em 1985 e começou um projeto pós-Ingres para resolver os problemas com sistemas de banco de dados contemporâneos que se tornaram cada vez mais claros durante o início dos anos 1980. Ele ganhou o Prêmio Turing em 2014 por esses e outros projetos e técnicas pioneiras neles.

O novo projeto, POSTGRES, teve como objetivo adicionar o mínimo de recursos necessários para oferecer suporte completo aos tipos de dados . Esses recursos incluíam a capacidade de definir tipos e descrever totalmente os relacionamentos - algo amplamente usado, mas mantido inteiramente pelo usuário. No POSTGRES, o banco de dados entendia os relacionamentos e podia recuperar informações em tabelas relacionadas de forma natural usando regras . O POSTGRES usou muitas das idéias de Ingres, mas não seu código.

A partir de 1986, artigos publicados descreveram a base do sistema, e uma versão do protótipo foi mostrada na Conferência SIGMOD da ACM de 1988 . A equipe lançou a versão 1 para um pequeno número de usuários em junho de 1989, seguida pela versão 2 com um sistema de regras reescrito em junho de 1990. A versão 3, lançada em 1991, reescreveu novamente o sistema de regras e adicionou suporte para vários gerenciadores de armazenamento e um mecanismo de consulta aprimorado. Em 1993, o número de usuários começou a sobrecarregar o projeto com solicitações de suporte e recursos. Depois de lançar a versão 4.2 em 30 de junho de 1994 - principalmente uma limpeza - o projeto terminou. Berkeley lançou o POSTGRES sob uma variante da licença MIT , que permitiu que outros desenvolvedores usassem o código para qualquer uso. Na época, o POSTGRES usava um interpretador de linguagem de consulta POSTQUEL influenciado por Ingres , que poderia ser usado interativamente com um aplicativo de console denominado monitor.

Em 1994, os alunos de graduação de Berkeley, Andrew Yu e Jolly Chen, substituíram o interpretador de linguagem de consulta POSTQUEL por um para a linguagem de consulta SQL, criando o Postgres95. O monitorconsole também foi substituído por psql. Yu e Chen anunciaram a primeira versão (0,01) para testadores beta em 5 de maio de 1995. A versão 1.0 do Postgres95 foi anunciada em 5 de setembro de 1995, com uma licença mais liberal que permitia que o software fosse livremente modificável.

Em 8 de julho de 1996, Marc Fournier da Hub.org Networking Services forneceu o primeiro servidor de desenvolvimento não universitário para o esforço de desenvolvimento de código aberto. Com a participação de Bruce Momjian e Vadim B. Mikheev, começaram os trabalhos de estabilização do código herdado de Berkeley.

Em 1996, o projeto foi renomeado para PostgreSQL para refletir seu suporte para SQL. A presença online no site PostgreSQL.org começou em 22 de outubro de 1996. O primeiro lançamento do PostgreSQL formou a versão 6.0 em 29 de janeiro de 1997. Desde então, desenvolvedores e voluntários em todo o mundo têm mantido o software como The PostgreSQL Global Development Group.

O projeto continua a disponibilizar versões sob sua licença PostgreSQL de software livre e de código aberto . O código vem de contribuições de fornecedores proprietários, empresas de suporte e programadores de código aberto.

Controle de simultaneidade multiversão (MVCC)

O PostgreSQL gerencia a simultaneidade por meio do controle de simultaneidade multiversão (MVCC), que dá a cada transação um "instantâneo" do banco de dados, permitindo que alterações sejam feitas sem afetar outras transações. Isso elimina amplamente a necessidade de bloqueios de leitura e garante que o banco de dados mantenha os princípios ACID . O PostgreSQL oferece três níveis de isolamento de transação : leitura confirmada, leitura repetida e serializável. Como o PostgreSQL é imune a leituras sujas, solicitar um nível de isolamento de transação Read Uncommitted fornece leitura confirmada. O PostgreSQL oferece suporte à serialização total por meio do método serializable de isolamento de instantâneo (SSI).

Armazenamento e replicação

Replicação

O PostgreSQL inclui replicação binária embutida com base no envio das alterações ( logs de gravação antecipada (WAL)) para nós de réplica de forma assíncrona, com a capacidade de executar consultas somente leitura nesses nós replicados. Isso permite dividir o tráfego de leitura entre vários nós de forma eficiente. O software de replicação anterior que permitia dimensionamento de leitura semelhante normalmente contava com a adição de gatilhos de replicação ao mestre, aumentando a carga.

O PostgreSQL inclui replicação síncrona incorporada que garante que, para cada transação de gravação, o mestre aguarde até que pelo menos um nó de réplica tenha gravado os dados em seu log de transações. Ao contrário de outros sistemas de banco de dados, a durabilidade de uma transação (seja assíncrona ou síncrona) pode ser especificada por banco de dados, por usuário, por sessão ou mesmo por transação. Isso pode ser útil para cargas de trabalho que não exigem tais garantias e pode não ser desejado para todos os dados, pois retarda o desempenho devido à necessidade de confirmação da transação atingindo o modo de espera síncrono.

Os servidores em espera podem ser síncronos ou assíncronos. Os servidores em espera síncronos podem ser especificados na configuração que determina quais servidores são candidatos à replicação síncrona. O primeiro na lista que está transmitindo ativamente será usado como o servidor síncrono atual. Quando isso falha, o sistema passa para o próximo da linha.

A replicação multimestre síncrona não está incluída no núcleo do PostgreSQL. O Postgres-XC, que é baseado no PostgreSQL, fornece replicação multimestre síncrona escalonável. Ele é licenciado sob a mesma licença do PostgreSQL. Um projeto relacionado é denominado Postgres-XL . Postgres-R é mais uma bifurcação . A replicação bidirecional (BDR) é um sistema de replicação multimestre assíncrono para PostgreSQL.

Ferramentas como repmgr tornam o gerenciamento de clusters de replicação mais fácil.

Vários pacotes de replicação baseados em gatilhos assíncronos estão disponíveis. Eles permanecem úteis mesmo após a introdução das habilidades centrais expandidas, para situações em que a replicação binária de um cluster de banco de dados completo é inadequada:

YugabyteDB é um banco de dados que usa o front-end do PostgreSQL com um backend mais parecido com NoSQL . Embora possa ser considerado um banco de dados diferente, é essencialmente PostgreSQL com um back-end de armazenamento diferente. Ele aborda os problemas de replicação com uma implementação das ideias do Google Spanner . Esses bancos de dados são chamados de NewSQL e incluem CockroachDB e TiDB, entre outros.

Índices

PostgreSQL inclui suporte integrado para índices regulares de árvore B e tabela hash , e quatro métodos de acesso de índice: árvores de pesquisa generalizadas ( GiST ), índices invertidos generalizados (GIN), GiST particionado por espaço (SP-GiST) e índices de intervalo de bloco ( BRIN). Além disso, métodos de índice definidos pelo usuário podem ser criados, embora este seja um processo bastante complicado. Os índices no PostgreSQL também suportam os seguintes recursos:

  • Os índices de expressão podem ser criados com um índice do resultado de uma expressão ou função, em vez de simplesmente o valor de uma coluna.
  • Índices parciais , que indexam apenas parte de uma tabela, podem ser criados adicionando uma cláusula WHERE ao final da instrução CREATE INDEX. Isso permite que um índice menor seja criado.
  • O planejador é capaz de usar vários índices juntos para satisfazer consultas complexas, usando operações de índice de bitmap temporário na memória (útil para aplicativos de data warehouse para unir uma grande tabela de fatos a tabelas de dimensões menores , como aquelas organizadas em um esquema em estrela ).
  • A indexação de k -nearest neighbors ( k -NN) (também referida como KNN-GiST) fornece uma pesquisa eficiente de "valores mais próximos" ao especificado, útil para encontrar palavras semelhantes ou objetos próximos ou locais comdados geoespaciais . Isso é alcançado sem correspondência exaustiva de valores.
  • As varreduras apenas de índice geralmente permitem que o sistema busque dados de índices sem nunca ter que acessar a tabela principal.
  • Índices de intervalo de blocos (BRIN).

Esquemas

No PostgreSQL, um esquema contém todos os objetos, exceto papéis e espaços de tabela. Os esquemas atuam efetivamente como namespaces, permitindo que objetos com o mesmo nome coexistam no mesmo banco de dados. Por padrão, os bancos de dados recém-criados têm um esquema chamado público , mas qualquer outro esquema pode ser adicionado, e o esquema público não é obrigatório.

Uma search_pathconfiguração determina a ordem em que o PostgreSQL verifica os esquemas para objetos não qualificados (aqueles sem um esquema prefixado). Por padrão, ele é definido como $user, public( $userrefere-se ao usuário do banco de dados conectado no momento). Este padrão pode ser definido em um banco de dados ou nível de função, mas como é um parâmetro de sessão, pode ser alterado livremente (mesmo várias vezes) durante uma sessão de cliente, afetando apenas aquela sessão.

Os esquemas inexistentes listados em search_path são ignorados silenciosamente durante a pesquisa de objetos.

Novos objetos são criados em qualquer esquema válido (um que exista atualmente) que apareça primeiro no search_path.

Tipos de dados

Uma grande variedade de tipos de dados nativos são suportados, incluindo:

  • boleano
  • De precisão arbitrária numerics
  • Caráter (texto, varchar, char)
  • Binário
  • Data / hora (carimbo de data / hora / hora com / sem fuso horário, data, intervalo)
  • Dinheiro
  • Enum
  • Strings
  • Tipo de pesquisa de texto
  • Composto
  • HStore, um armazenamento de valor-chave habilitado para extensão no PostgreSQL
  • Matrizes (comprimento variável e podem ser de qualquer tipo de dados, incluindo texto e tipos compostos) de até 1 GB no tamanho total de armazenamento
  • Primitivas geométricas
  • Endereços IPv4 e IPv6
  • Blocos de roteamento entre domínios sem classe (CIDR) e endereços MAC
  • XML com suporte a consultas XPath
  • Identificador universalmente exclusivo (UUID)
  • JavaScript Object Notation ( JSON ) e um JSONB binário mais rápido (diferente do BSON )

Além disso, os usuários podem criar seus próprios tipos de dados, que normalmente podem ser totalmente indexados por meio das infraestruturas de indexação do PostgreSQL - GiST, GIN, SP-GiST. Exemplos disso incluem os tipos de dados do sistema de informações geográficas (GIS) do projeto PostGIS para PostgreSQL.

Também existe um tipo de dados denominado domínio , que é igual a qualquer outro tipo de dados, mas com restrições opcionais definidas pelo criador desse domínio. Isso significa que todos os dados inseridos em uma coluna usando o domínio deverão estar em conformidade com as restrições definidas como parte do domínio.

Um tipo de dados que representa um intervalo de dados pode ser usado, os chamados tipos de intervalo. Podem ser intervalos discretos (por exemplo, todos os valores inteiros de 1 a 10) ou intervalos contínuos (por exemplo, qualquer horário entre 10h00 e 11h00 ). Os tipos de intervalos integrados disponíveis incluem intervalos de inteiros, inteiros grandes, números decimais, carimbos de hora (com e sem fuso horário) e datas.

Os tipos de intervalos personalizados podem ser criados para disponibilizar novos tipos de intervalos, como intervalos de endereços IP usando o tipo inet como base, ou intervalos flutuantes usando o tipo de dados flutuante como base. Tipos Faixa apoiar limites do intervalo inclusivos e exclusivos usando os [/ ]e (/ )caracteres, respectivamente. (por exemplo, [4,9)representa todos os inteiros começando e incluindo 4 até, mas não incluindo 9.) Os tipos de intervalo também são compatíveis com os operadores existentes usados ​​para verificar se há sobreposição, contenção, direito de etc.

Objetos definidos pelo usuário

Novos tipos de quase todos os objetos dentro do banco de dados podem ser criados, incluindo:

  • Casts
  • Conversões
  • Tipos de dados
  • Domínios de dados
  • Funções, incluindo funções de agregação e funções de janela
  • Índices incluindo índices personalizados para tipos personalizados
  • Operadores (os existentes podem ser sobrecarregados )
  • Linguagens procedimentais

Herança

As tabelas podem ser definidas para herdar suas características de uma tabela pai . Os dados nas tabelas-filho parecerão existir nas tabelas-pai, a menos que os dados sejam selecionados da tabela-pai usando a palavra-chave ONLY, isto é . Adicionar uma coluna na tabela pai fará com que essa coluna apareça na tabela filho. SELECT * FROM ONLY parent_table;

A herança pode ser usada para implementar o particionamento de tabela, usando gatilhos ou regras para direcionar as inserções à tabela pai nas tabelas filho adequadas.

Em 2010, esse recurso ainda não era totalmente compatível - em particular, as restrições de tabela não eram herdáveis. Todas as restrições de verificação e restrições não nulas em uma tabela pai são herdadas automaticamente por seus filhos. Outros tipos de restrições (restrições exclusivas, de chave primária e de chave estrangeira) não são herdados.

A herança fornece uma maneira de mapear os recursos das hierarquias de generalização representadas nos diagramas de relacionamento entre entidades (ERDs) diretamente no banco de dados PostgreSQL.

Outros recursos de armazenamento

  • Restrições de integridade referencial , incluindo restrições de chave estrangeira , restrições de coluna e verificações de linha
  • Armazenamento de objetos grandes binários e textuais
  • Tablespaces
  • Agrupamento por coluna
  • Backup online
  • Recuperação pontual, implementada usando registro de write-ahead
  • Upgrades no local com pg_upgrade para menos tempo de inatividade

Controle e conectividade

Wrappers de dados estrangeiros

O PostgreSQL pode se conectar a outros sistemas para recuperar dados por meio de wrappers de dados externos (FDWs). Eles podem assumir a forma de qualquer fonte de dados, como um sistema de arquivos, outro sistema de gerenciamento de banco de dados relacional (RDBMS) ou um serviço da web. Isso significa que as consultas regulares ao banco de dados podem usar essas fontes de dados como tabelas regulares e até mesmo juntar várias fontes de dados.

Interfaces

Para conectar-se aos aplicativos, o PostgreSQL inclui as interfaces integradas libpq (a interface oficial do aplicativo C) e ECPG (um sistema C incorporado). Bibliotecas de terceiros para conexão com PostgreSQL estão disponíveis para muitas linguagens de programação , incluindo C ++ , Java , Julia , Python , Node.js , Go e Rust .

Linguagens procedimentais

As linguagens procedurais permitem que os desenvolvedores estendam o banco de dados com sub-rotinas (funções) personalizadas, geralmente chamadas de procedimentos armazenados . Essas funções podem ser usadas para construir gatilhos de banco de dados (funções chamadas na modificação de certos dados) e tipos de dados personalizados e funções agregadas . As linguagens procedurais também podem ser chamadas sem definir uma função, usando um comando DO no nível SQL.

Os idiomas são divididos em dois grupos: Os procedimentos escritos em idiomas seguros são colocados em área restrita e podem ser criados e usados ​​com segurança por qualquer usuário. Os procedimentos escritos em linguagens não seguras só podem ser criados por superusuários , porque permitem contornar as restrições de segurança de um banco de dados, mas também podem acessar fontes externas ao banco de dados. Algumas linguagens como Perl fornecem versões seguras e não seguras.

PostgreSQL tem suporte integrado para três linguagens procedurais:

  • SQL simples (seguro). Funções SQL mais simples podem ser expandidas embutidas na consulta de chamada (SQL), o que economiza a sobrecarga da chamada de função e permite que o otimizador de consulta "veja dentro" da função.
  • Linguagem procedural / PostgreSQL ( PL / pgSQL ) (seguro), que se assemelha à linguagem procedural da Oracle para SQL ( PL / SQL ) e SQL / Persistent Stored Modules ( SQL / PSM ).
  • C (inseguro), que permite carregar uma ou mais bibliotecas compartilhadas personalizadas no banco de dados. Funções escritas em C oferecem o melhor desempenho, mas bugs no código podem travar e potencialmente corromper o banco de dados. A maioria das funções integradas é escrita em C.

Além disso, o PostgreSQL permite que linguagens procedurais sejam carregadas no banco de dados por meio de extensões. Três extensões de linguagem estão incluídas no PostgreSQL para oferecer suporte a Perl , Tcl e Python . Para Python, o Python 2 descontinuado é usado por padrão ( plpythonuou plpython2u), mesmo no PostgreSQL 14; Python 3 também é compatível com a escolha do idioma plpython3u). Projetos externos fornecem suporte para muitas outras linguagens, incluindo PL / Java , JavaScript (PL / V8), PL / Julia PL / R , PL / Ruby e outros.

Gatilhos

Gatilhos são eventos disparados pela ação de instruções da linguagem de manipulação de dados SQL (DML). Por exemplo, uma instrução INSERT pode ativar um gatilho que verifica se os valores da instrução são válidos. A maioria dos gatilhos são ativados apenas por instruções INSERT ou UPDATE .

Os gatilhos são totalmente suportados e podem ser anexados a tabelas. Os gatilhos podem ser por coluna e condicionais, em que os gatilhos UPDATE podem ter como alvo colunas específicas de uma tabela, e os gatilhos podem ser executados sob um conjunto de condições conforme especificado na cláusula WHERE do gatilho. Os gatilhos podem ser anexados às visualizações usando a condição INSTEAD OF. Vários gatilhos são disparados em ordem alfabética. Além de chamar funções escritas no PL / pgSQL nativo, os triggers também podem chamar funções escritas em outras linguagens como PL / Python ou PL / Perl.

Notificações assíncronas

O PostgreSQL fornece um sistema de mensagens assíncrono que é acessado através dos comandos NOTIFY, LISTEN e UNLISTEN. Uma sessão pode emitir um comando NOTIFY, junto com o canal especificado pelo usuário e uma carga opcional, para marcar a ocorrência de um determinado evento. Outras sessões são capazes de detectar esses eventos emitindo um comando LISTEN, que pode ouvir um canal específico. Essa funcionalidade pode ser usada para uma ampla variedade de finalidades, como permitir que outras sessões saibam quando uma tabela foi atualizada ou para aplicativos separados para detectar quando uma determinada ação foi executada. Esse sistema evita a necessidade de pesquisa contínua por aplicativos para ver se algo mudou, e reduzindo a sobrecarga desnecessária. As notificações são totalmente transacionais, em que as mensagens não são enviadas até que a transação da qual foram enviadas seja confirmada. Isso elimina o problema de mensagens enviadas para uma ação executada, que é então revertida.

Muitos conectores para PostgreSQL fornecem suporte para este sistema de notificação (incluindo libpq, JDBC, Npgsql, psycopg e node.js) para que ele possa ser usado por aplicativos externos.

O PostgreSQL pode atuar como um servidor "pub / sub" ou servidor de tarefas eficaz e persistente, combinando LISTEN com FOR UPDATE SKIP LOCKED.

Regras

As regras permitem que a "árvore de consulta" de uma consulta recebida seja reescrita. "Regras de reescrita de consulta" são anexadas a uma tabela / classe e "reescrever" o DML recebido (selecionar, inserir, atualizar e / ou excluir) em uma ou mais consultas que substituem a instrução DML original ou executam em além disso. A reescrita da consulta ocorre após a análise da instrução DML, mas antes do planejamento da consulta.

Outros recursos de consulta

  • Transações
  • Pesquisa de texto completo
  • Visualizações
    • Vistas materializadas
    • Vistas atualizáveis
    • Vistas recursivas
  • Interno, externo (completo, esquerdo e direito) e junções cruzadas
  • Sub- seleciona
    • Subconsultas correlacionadas
  • Expressões regulares
  • expressões de tabela comuns e expressões de tabela comuns graváveis
  • Conexões criptografadas via Transport Layer Security (TLS); as versões atuais não usam SSL vulnerável, mesmo com essa opção de configuração
  • Domínios
  • Savepoints
  • Compromisso de duas fases
  • O Oversized-Attribute Storage Technique (TOAST) é usado para armazenar de forma transparente grandes atributos de tabela (como grandes anexos MIME ou mensagens XML) em uma área separada, com compactação automática.
  • SQL embutido é implementado usando pré-processador. O código SQL é primeiro escrito embutido no código C. Em seguida, o código é executado por meio do pré-processador ECPG, que substitui o SQL por chamadas para a biblioteca de código. Então o código pode ser compilado usando um compilador C. A incorporação também funciona com C ++, mas não reconhece todas as construções C ++.

Modelo de simultaneidade

O servidor PostgreSQL é baseado em processo (não em thread) e usa um processo do sistema operacional por sessão de banco de dados. Várias sessões são automaticamente distribuídas em todas as CPUs disponíveis pelo sistema operacional. Muitos tipos de consultas também podem ser paralelizados em vários processos de trabalho em segundo plano, aproveitando as vantagens de várias CPUs ou núcleos. Os aplicativos cliente podem usar threads e criar várias conexões de banco de dados a partir de cada thread.

Segurança

O PostgreSQL gerencia sua segurança interna por função . Uma função geralmente é considerada um usuário (uma função que pode efetuar login) ou um grupo (uma função da qual outras funções são membros). As permissões podem ser concedidas ou revogadas em qualquer objeto até o nível da coluna e também podem permitir / impedir a criação de novos objetos nos níveis do banco de dados, esquema ou tabela.

O recurso SECURITY LABEL do PostgreSQL (extensão para os padrões SQL), permite segurança adicional; com um módulo carregável empacotado que suporta controle de acesso obrigatório baseado em rótulo (MAC) com base na política de segurança Security-Enhanced Linux (SELinux).

PostgreSQL oferece suporte nativo a um grande número de mecanismos de autenticação externa, incluindo:

Os métodos GSSAPI, SSPI, Kerberos, peer, ident e certificado também podem usar um arquivo de "mapa" especificado que lista quais usuários correspondidos por esse sistema de autenticação têm permissão para se conectar como um usuário de banco de dados específico.

Esses métodos são especificados no arquivo de configuração de autenticação baseada em host do cluster ( pg_hba.conf), que determina quais conexões são permitidas. Isso permite controlar qual usuário pode se conectar a qual banco de dados, de onde ele pode se conectar (endereço IP, intervalo de endereço IP, soquete de domínio), qual sistema de autenticação será aplicado e se a conexão deve usar Transport Layer Security (TLS).

Conformidade de padrões

PostgreSQL afirma alta, mas não completa, conformidade com o padrão SQL mais recente (para a versão 13 "em setembro de 2020, PostgreSQL está em conformidade com pelo menos 170 dos 179 recursos obrigatórios para SQL: conformidade com o núcleo 2016 ", e nenhum outro banco de dados totalmente em conformidade com ele ) Uma exceção é o tratamento de identificadores sem aspas, como nomes de tabelas ou colunas. No PostgreSQL, eles são dobrados, internamente, para caracteres minúsculos, enquanto o padrão diz que os identificadores não citados devem ser dobrados para maiúsculas. Portanto, Foodeve ser equivalente a FOOnão estar de fooacordo com o padrão.

Benchmarks e desempenho

Muitos estudos informais de desempenho do PostgreSQL foram feitos. As melhorias de desempenho destinadas a melhorar a escalabilidade começaram fortemente com a versão 8.1. Comparações simples entre a versão 8.0 e a versão 8.4 mostraram que a última era mais de 10 vezes mais rápida em cargas de trabalho somente leitura e pelo menos 7,5 vezes mais rápida em cargas de trabalho de leitura e gravação.

O primeiro benchmark de padrão da indústria e validado por pares foi concluído em junho de 2007, usando o Sun Java System Application Server (versão proprietária do GlassFish ) 9.0 Platform Edition, servidor Sun Fire baseado em UltraSPARC T1 e PostgreSQL 8.2. Este resultado de 778,14 SPECjAppServer2004 JOPS @ Standard se compara favoravelmente com o 874 JOPS @ Standard com Oracle 10 em um sistema HP-UX baseado em Itanium .

Em agosto de 2007, a Sun apresentou uma pontuação de benchmark aprimorada de 813,73 SPECjAppServer2004 JOPS @ Standard. Com o sistema em teste a um preço reduzido, o preço / desempenho melhorou de $ 84,98 / JOPS para $ 70,57 / JOPS.

A configuração padrão do PostgreSQL usa apenas uma pequena quantidade de memória dedicada para fins de desempenho crítico, como armazenamento em cache de blocos de banco de dados e classificação. Essa limitação ocorre principalmente porque os sistemas operacionais mais antigos exigiam alterações no kernel para permitir a alocação de grandes blocos de memória compartilhada . PostgreSQL.org fornece conselhos sobre as práticas básicas de desempenho recomendadas em um wiki .

Em abril de 2012, Robert Haas da EnterpriseDB demonstrou a escalabilidade linear da CPU do PostgreSQL 9.2 usando um servidor com 64 núcleos.

Matloob Khushi realizou benchmarking entre PostgreSQL 9.0 e MySQL 5.6.15 para sua capacidade de processar dados genômicos. Em sua análise de desempenho, ele descobriu que o PostgreSQL extrai regiões genômicas sobrepostas oito vezes mais rápido do que o MySQL, usando dois conjuntos de dados de 80.000 cada, formando regiões aleatórias de DNA humano. A inserção e o upload de dados no PostgreSQL também foram melhores, embora a capacidade geral de pesquisa de ambos os bancos de dados fosse quase equivalente.

Plataformas

PostgreSQL está disponível para os seguintes sistemas operacionais: Linux (todas as distribuições recentes), instaladores x86 de 64 bits disponíveis e testados para macOS (OS X) versão 10.6 e mais recente - Windows (com instaladores disponíveis e testados para Windows Server 2019 de 64 bits e 2016; algumas versões mais antigas do PostgreSQL são testadas no Windows 2008 R2, enquanto para o PostgreSQL versão 10 e anteriores um instalador de 32 bits está disponível e testado até o Windows 2008 R1 de 32 bits; compilável por exemplo, Visual Studio , versão 2013 até o versão mais recente de 2019) - FreeBSD , OpenBSD , NetBSD , AIX , HP-UX , Solaris e UnixWare ; e não testado oficialmente: DragonFly BSD , BSD / OS , IRIX , OpenIndiana , OpenSolaris , OpenServer e Tru64 UNIX . A maioria dos outros sistemas do tipo Unix também podem funcionar; mais modernos oferecem suporte.

PostgreSQL funciona em qualquer uma das seguintes arquiteturas de conjunto de instruções : x86 e x86-64 no Windows XP (ou posterior) e outros sistemas operacionais; estes são suportados em outro que não Windows: IA-64 Itanium (suporte externo para HP-UX), PowerPC , PowerPC 64, S / 390 , S / 390x , SPARC , SPARC 64, ARMv8 -A ( 64 bits ) e ARM mais antigo ( 32 bits , incluindo mais antigos, como ARMv6 no Raspberry Pi ), MIPS , MIPSel e PA-RISC . Também era conhecido por funcionar em algumas outras plataformas (embora não fosse testado há anos, ou seja, para as versões mais recentes).

Administração de banco de dados

Front-ends e ferramentas de código aberto para administrar PostgreSQL incluem:

psql
O front-end principal do PostgreSQL é o psql programa de linha de comando , que pode ser usado para inserir consultas SQL diretamente ou executá-las a partir de um arquivo. Além disso, o psql fornece vários meta-comandos e vários recursos semelhantes a shell para facilitar a escrita de scripts e automatizar uma ampla variedade de tarefas; por exemplo, preenchimento de tabulação de nomes de objetos e sintaxe SQL.
pgAdmin
O pacote pgAdmin é uma ferramenta de administração de interface gráfica do usuário (GUI) gratuita e de código aberto para PostgreSQL, que é compatível com muitas plataformas de computador. O programa está disponível em mais de uma dúzia de idiomas. O primeiro protótipo, denominado pgManager, foi escrito para PostgreSQL 6.3.2 de 1998 e reescrito e lançado como pgAdmin sob a GNU General Public License (GPL) nos meses seguintes. A segunda encarnação (denominada pgAdmin II) foi uma reescrita completa, lançada pela primeira vez em 16 de janeiro de 2002. A terceira versão, pgAdmin III, foi originalmente lançada sob a Licença Artística e então lançada sob a mesma licença do PostgreSQL. Ao contrário das versões anteriores escritas em Visual Basic , o pgAdmin III é escrito em C ++, usando a estrutura wxWidgets , permitindo que seja executado na maioria dos sistemas operacionais comuns. A ferramenta de consulta inclui uma linguagem de script chamada pgScript para oferecer suporte a tarefas administrativas e de desenvolvimento. Em dezembro de 2014, Dave Page, o fundador do projeto pgAdmin e desenvolvedor principal, anunciou que com a mudança para modelos baseados na web, o trabalho começou no pgAdmin 4 com o objetivo de facilitar as implantações em nuvem. Em 2016, o pgAdmin 4 foi lançado. O backend do pgAdmin 4 foi escrito em Python , usando o framework Flask e Qt .
phpPgAdmin
phpPgAdmin é uma ferramenta de administração baseada na web para PostgreSQL escrita em PHP e baseada na popular interface phpMyAdmin originalmente escrita para administração MySQL .
PostgreSQL Studio
O PostgreSQL Studio permite que os usuários realizem tarefas essenciais de desenvolvimento de banco de dados PostgreSQL a partir de um console baseado na web. O PostgreSQL Studio permite que os usuários trabalhem com bancos de dados em nuvem sem a necessidade de abrir firewalls.
TeamPostgreSQL
Interface da web baseada em AJAX / JavaScript para PostgreSQL. Permite navegar, manter e criar dados e objetos de banco de dados por meio de um navegador da web. A interface oferece editor de SQL com guias com autocompletar, widgets de edição de linha, navegação de chave estrangeira por clique entre linhas e tabelas, gerenciamento de favoritos para scripts comumente usados, entre outros recursos. Suporta SSH para a interface da web e as conexões de banco de dados . Os instaladores estão disponíveis para Windows, Macintosh e Linux, e um arquivo simples de plataforma cruzada executado a partir de um script.
LibreOffice, OpenOffice.org
O LibreOffice e o OpenOffice.org Base podem ser usados ​​como front-end para PostgreSQL.
pgBadger
O analisador de log PostgreSQL pgBadger gera relatórios detalhados a partir de um arquivo de log PostgreSQL.
pgDevOps
pgDevOps é um conjunto de ferramentas da web para instalar e gerenciar várias versões, extensões e componentes da comunidade do PostgreSQL, desenvolver consultas SQL, monitorar bancos de dados em execução e encontrar problemas de desempenho.
Administrador
Adminer é uma ferramenta de administração simples baseada na web para PostgreSQL e outros, escrita em PHP.
pgBackRest
pgBackRest é uma ferramenta de backup e restauração para PostgreSQL que fornece suporte para backups completos, diferenciais e incrementais.
pgaudit
pgaudit é uma extensão do PostgreSQL que fornece log detalhado de auditoria de sessão e / ou objeto por meio do recurso de log padrão fornecido pelo PostgreSQL.
wal-e
Wal-e é uma ferramenta de backup e restauração para PostgreSQL que fornece suporte para backups físicos (baseados em WAL), escritos em Python

Várias empresas oferecem ferramentas proprietárias para PostgreSQL. Eles geralmente consistem em um núcleo universal que é adaptado para vários produtos de banco de dados específicos. Essas ferramentas compartilham principalmente os recursos de administração com as ferramentas de código aberto, mas oferecem melhorias na modelagem , importação, exportação ou geração de relatórios de dados.

Usuários notáveis

Organizações e produtos notáveis ​​que usam PostgreSQL como banco de dados principal incluem:

  • Em 2009, o site de rede social Myspace usou o banco de dados nCluster da Aster Data Systems para armazenamento de dados, que foi construído em PostgreSQL não modificado.
  • Geni.com usa PostgreSQL como seu principal banco de dados genealógico.
  • OpenStreetMap , um projeto colaborativo para criar um mapa do mundo editável gratuitamente.
  • Afilias , registros de domínio para .org , .info e outros.
  • Jogos online multijogador Sony Online .
  • BASF , plataforma de compras de seu portal de agronegócio.
  • Site de notícias sociais do Reddit .
  • Aplicativo Skype VoIP, bancos de dados centrais de negócios .
  • Sun xVM , a suíte de virtualização e automação de datacenter da Sun.
  • MusicBrainz , abra uma enciclopédia de música online.
  • A Estação Espacial Internacional - para coletar dados de telemetria em órbita e replicá-los para o solo.
  • Site de rede social MyYearbook .
  • Instagram , um serviço móvel de compartilhamento de fotos.
  • Disqus , um serviço online de discussão e comentários.
  • TripAdvisor , site de informações de viagens com conteúdo gerado principalmente pelo usuário.
  • A Yandex , uma empresa russa de Internet, mudou seu serviço Yandex.Mail da Oracle para o Postgres.
  • Amazon Redshift , parte da AWS, um sistema de processamento analítico online colunar (OLAP) baseado nas modificações Postgres do ParAccel .
  • National Oceanic and Atmospheric Administration (NOAA), National Weather Service (NWS), Interactive Forecast Preparation System (IFPS), um sistema que integra dados dos radares meteorológicos NEXRAD , sistemas de superfície e hidrologia para construir modelos detalhados de previsão localizada.
  • O serviço meteorológico nacional do Reino Unido , o Met Office , começou a trocar o Oracle pelo PostgreSQL em uma estratégia de implantar mais tecnologia de código aberto.
  • WhitePages.com estava usando Oracle e MySQL , mas quando se tratou de mover seus diretórios centrais internamente, ele recorreu ao PostgreSQL. Como o WhitePages.com precisa combinar grandes conjuntos de dados de várias fontes, a capacidade do PostgreSQL de carregar e indexar dados em altas taxas foi a chave para sua decisão de usar o PostgreSQL.
  • FlightAware , um site de rastreamento de voos.
  • Grofers , um serviço online de entrega de alimentos.
  • O Guardian migrou do MongoDB para o PostgreSQL em 2018.

Implementações de serviço

Alguns fornecedores notáveis ​​oferecem PostgreSQL como software como serviço :

  • Heroku , uma plataforma como um serviço de provedor, tem apoiado PostgreSQL desde o início, em 2007. Eles oferecem recursos de valor agregado, como banco de dados completo roll-back (capacidade de restaurar um banco de dados a partir de qualquer tempo especificado), que é baseado no WAL-E, software de código aberto desenvolvido por Heroku.
  • Em janeiro de 2012, o EnterpriseDB lançou uma versão em nuvem do PostgreSQL e de seu próprio Postgres Plus Advanced Server proprietário com provisionamento automatizado para failover, replicação, balanceamento de carga e escalonamento. Ele é executado na Amazon Web Services . Desde 2015, o Postgres Advanced Server é oferecido como ApsaraDB para PPAS, um banco de dados relacional como serviço no Alibaba Cloud.
  • A VMware oferece o vFabric Postgres (também denominado vPostgres) para nuvens privadas no VMware vSphere desde maio de 2012. A empresa anunciou o fim da disponibilidade (EOA) do produto em 2014.
  • Em novembro de 2013, a Amazon Web Services anunciou a adição do PostgreSQL à sua oferta de serviço de banco de dados relacional .
  • Em novembro de 2016, a Amazon Web Services anunciou a adição da compatibilidade PostgreSQL à sua oferta de banco de dados gerenciado Amazon Aurora nativa da nuvem .
  • Em maio de 2017, o Microsoft Azure anunciou os Bancos de Dados Azure para PostgreSQL
  • Em maio de 2019, o Alibaba Cloud anunciou o PolarDB para PostgreSQL.
  • Jelastic Multicloud Platform as a Service fornece suporte PostgreSQL baseado em contêiner desde 2011. Eles oferecem replicação mestre-escravo assíncrona automatizada de PostgreSQL disponível no mercado.
  • Em junho de 2019, a IBM Cloud anunciou o IBM Cloud Hyper Protect DBaaS para PostgreSQL .
  • Em setembro de 2020, a Crunchy Data anunciou a Crunchy Bridge .

Histórico de lançamento

Histórico de lançamento
Liberar Primeiro lançamento Última versão secundária Último lançamento Fim de
vida
Milestones
6,0 29/01/1997 N / D N / D N / D Primeira versão formal do PostgreSQL, índices únicos, utilitário pg_dumpall, autenticação ident
6,1 08/06/1997 Versão antiga, não mais mantida: 6.1.1 22/07/1997 N / D Índices de várias colunas, sequências, tipo de dados de dinheiro, GEQO (GEnetic Query Optimizer)
6,2 02/10/1997 Versão antiga, não mais mantida: 6.2.1 17/10/1997 N / D Interface JDBC, gatilhos, interface de programação de servidor, restrições
6,3 01/03/1998 Versão antiga, não mais mantida: 6.3.2 07/04/1998 01/03/2003 Habilidade de subselecionar SQL-92, PL / pgTCL
6,4 30/10/1998 Versão antiga, não mais mantida: 6.4.2 20/12/1998 30/10/2003 VIEWs (então somente leitura) e RULEs, PL / pgSQL
6,5 09/06/1999 Versão antiga, não mais mantida: 6.5.3 13/10/1999 09/06/2004 MVCC , tabelas temporárias, mais suporte a instruções SQL (CASE, INTERSECT e EXCEPT)
7,0 08/05/2000 Versão antiga, não mais mantida: 7.0.3 11/11/2000 08-05-2004 Chaves estrangeiras, sintaxe SQL-92 para junções
7,1 13/04/2001 Versão antiga, não mais mantida: 7.1.3 15/08/2001 13/04/2006 Registro de escrita antecipada, junções externas
7,2 04/02/2002 Versão antiga, não mais mantida: 7.2.8 09/05/2005 04/02/2007 PL / Python, OIDs não são mais necessários, internacionalização de mensagens
7,3 27/11/2002 Versão antiga, não mais mantida: 7.3.21 07/01/2008 27/11/2007 Esquema, função de tabela, consulta preparada
7,4 17/11/2003 Versão antiga, não mais mantida: 7.4.30 04/10/2010 01-10-2010 Otimização em JOINs e funções de data warehouse
8,0 19/01/2005 Versão antiga, não mais mantida: 8.0.26 04/10/2010 01-10-2010 Servidor nativo no Microsoft Windows , pontos de salvamento , espaços de tabela , recuperação pontual
8,1 08/11/2005 Versão antiga, não mais mantida: 8.1.23 16-12-2010 08-11-2010 Otimização de desempenho, confirmação de duas fases, particionamento de tabela , varredura de bitmap de índice, bloqueio de linha compartilhada, funções
8,2 05-12-2006 Versão antiga, não mais mantida: 8.2.23 05-12-2011 05-12-2011 Otimização de desempenho, criações de índice online, bloqueios consultivos, espera ativa
8,3 04/02/2008 Versão antiga, não mais mantida: 8.3.23 07/02/2013 07/02/2013 Tuplas somente heap, pesquisa de texto completo , SQL / XML , tipos ENUM, tipos UUID
8,4 01-07-2009 Versão antiga, não mais mantida: 8.4.22 24/07/2014 24/07/2014 Funções de janela, permissões em nível de coluna, restauração de banco de dados paralelo, agrupamento por banco de dados, expressões de tabela comuns e consultas recursivas
9,0 20/09/2010 Versão antiga, não mais mantida: 9.0.23 08/10/2015 08/10/2015 Replicação de streaming binário integrado , hot standby , capacidade de atualização local, Windows de 64 bits
9,1 12/09/2011 Versão antiga, não mais mantida: 9.1.24 27/10/2016 27/10/2016 Replicação síncrona , agrupamentos por coluna , tabelas não registradas, isolamento de instantâneo serializável , expressões de tabelas comuns graváveis, integração SELinux , extensões, tabelas estrangeiras
9,2 10/09/2012 Versão antiga, não mais mantida: 9.2.24 09-11-2017 09-11-2017 Replicação de streaming em cascata, varreduras apenas de índice, suporte nativo a JSON , gerenciamento de bloqueio aprimorado, tipos de intervalo, ferramenta pg_receivexlog, índices GiST particionados por espaço
9,3 09/09/2013 Versão antiga, não mais mantida: 9.3,25 08/11/2018 08/11/2018 Trabalhadores em segundo plano personalizados, somas de verificação de dados, operadores JSON dedicados, LATERAL JOIN, pg_dump mais rápido, nova ferramenta de monitoramento de servidor pg_isready, recursos de acionamento, recursos de visualização, tabelas externas graváveis, visualizações materializadas , melhorias de replicação
9,4 18/12/2014 Versão antiga, não mais mantida: 9.4.26 13/02/2020 13/02/2020 Tipo de dados JSONB, instrução ALTER SYSTEM para alterar valores de configuração, capacidade de atualizar visualizações materializadas sem bloquear leituras, registro / início / parada dinâmico de processos de trabalho em segundo plano, API de decodificação lógica, melhorias no índice GiN, suporte a página grande do Linux, recarregamento de cache de banco de dados via pg_prewarm , reintroduzindo Hstore como o tipo de coluna de escolha para dados de estilo de documento.
9,5 07/01/2016 Versão antiga, não mais mantida: 9.5.25 11/02/2021 11/02/2021 UPSERT, segurança de nível de linha, TABLESAMPLE, CUBE / ROLLUP, GROUPING SETS e novo índice BRIN
9,6 29/09/2016 Versão mais antiga, mas ainda mantida: 9,6,23 2021-08-12 2021-11-11 Suporte de consulta paralela, melhorias do wrapper de dados externos PostgreSQL (FDW) com pushdown de classificação / junção, múltiplas esperas síncronas, aspiração mais rápida de grandes tabelas
10 05/10/2017 Versão mais antiga, mas ainda mantida: 10,18 2021-08-12 2022-11-10 Replicação lógica, particionamento de tabela declarativa, paralelismo de consulta aprimorado
11 18/10/2018 Versão mais antiga, mas ainda mantida: 11,13 2021-08-12 09/11/2023 Maior robustez e desempenho para particionamento, transações com suporte em procedimentos armazenados, habilidades aprimoradas para paralelismo de consulta, compilação just-in-time (JIT) para expressões
12 03/10/2019 Versão mais antiga, mas ainda mantida: 12,8 2021-08-12 2024-11-14 Melhorias no desempenho de consultas e utilização de espaço; Suporte à expressão de caminho SQL / JSON; colunas geradas; melhorias para internacionalização e autenticação; nova interface de armazenamento de mesa conectável.
13 24-09-2020 Versão mais antiga, mas ainda mantida: 13,4 2021-08-12 13/11/2025 Economia de espaço e ganhos de desempenho com a eliminação da duplicação de entradas de índice B-tree, desempenho aprimorado para consultas que usam agregados ou tabelas particionadas, melhor planejamento de consulta ao usar estatísticas estendidas, aspiração paralela de índices, classificação incremental
14 2021-09-30 Versão estável atual: 14,0 2021-09-30 2026-11-12 Adicionadas cláusulas SEARCH e CYCLE do padrão SQL para expressões de tabela comuns, permitindo que DISTINCT seja adicionado a GROUP BY
Lenda:
Versão antiga
Versão mais antiga, ainda mantida
Última versão
Versão de visualização mais recente
Lançamento futuro

Veja também

Referências

Leitura adicional

links externos