A extensão ip4r adiciona tipos de dados dedicados para armazenar endereços IPv4 e IPv6, além de faixas de endereços, no PolarDB for PostgreSQL (Compatible with Oracle). Sua principal vantagem sobre os tipos nativos inet e cidr do PostgreSQL é o suporte a índices GiST para o operador de contenção (>>=). Esse recurso permite buscar com eficiência todas as faixas de IP que contêm um determinado endereço — um padrão de consulta que os tipos nativos não conseguem indexar.
Versões suportadas
As seguintes versões do PolarDB for PostgreSQL (Compatible with Oracle) suportam a extensão ip4r:
Compatibilidade com sintaxe Oracle 2.0: versão secundária do mecanismo 2.0.14.9.13.0 ou posterior
Compatibilidade com sintaxe Oracle 1.0: versão secundária do mecanismo 2.0.11.9.36.0 ou posterior
Visualize sua versão secundária do mecanismo no console ou execute SHOW polardb_version; . Caso sua versão não atenda aos requisitos, atualize a versão secundária do mecanismo .
Por que usar o ip4r
Os tipos nativos inet e cidr do PostgreSQL apresentam duas limitações que a extensão ip4r resolve:
Ausência de suporte a índice para consultas de contenção: Os tipos nativos não utilizam índices em consultas no formato
WHERE column >>= $1(localizar todas as faixas que contêm um determinado IP). Oip4rsuporta varreduras de índice GiST para esse operador, tornando viáveis as consultas de contenção em tabelas grandes com faixas de IP.Sobrecarga de armazenamento de comprimento variável para cargas apenas com IPv4: O PostgreSQL utiliza armazenamento de comprimento variável para suportar tanto IPv4 quanto IPv6, o que gera sobrecarga quando você precisa apenas de endereços IPv4. A extensão
ip4rusa tipos de comprimento fixo para endereços individuais.
O ip4r também estabelece uma distinção semântica mais clara entre um bloco de rede (uma faixa de endereços, como uma sub-rede) e um endereço IP específico dentro desse bloco, reduzindo ambiguidades no design do esquema.
Tipos de dados
A extensão ip4r fornece seis tipos de dados:
|
Tipo de dado |
Descrição |
|
|
Um único endereço IPv4 |
|
|
Uma faixa arbitrária de endereços IPv4 |
|
|
Um único endereço IPv6 |
|
|
Uma faixa arbitrária de endereços IPv6 |
|
|
Um único endereço IPv4 ou IPv6 |
|
|
Uma faixa arbitrária de endereços IPv4 ou IPv6 |
Tipos de endereço único
Os três tipos de endereço único armazenam endereços IP em formatos compactos de comprimento fixo:
ip4: Entrada no formatonnn.nnn.nnn.nnn, armazenada como um inteiro sem sinal de 32 bits.ip6: Entrada como um endereço IPv6 hexadecimal padrão, armazenada como dois valores de 64 bits.ipaddress: Aceita o formatoip4ouip6.
Conversões de tipo para tipos de endereço único
Na tabela a seguir, ipX representa qualquer um dos três tipos de endereço único (ip4, ip6 ou ipaddress).
|
Tipo de source |
Tipo de destino |
Formato |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tipos de faixa de endereços
Os três tipos de faixa de endereços armazenam intervalos de endereços IP:
ip4r: Faixa de endereços IPv4. Por exemplo,192.0.2.100-192.0.2.200. A notação CIDR também é aceita:192.0.2.0/24equivale a192.0.2.0-192.0.2.255.ip6r: Faixa de endereços IPv6. Por exemplo,2001::1234-2001::2000:0000. A notação CIDR também é aceita:2001::/112equivale a2001::-2001::ffff.iprange: Aceita o formatoip4rouip6r.
Conversões de tipo para tipos de faixa de endereços
Na tabela a seguir, ipXr representa qualquer um dos três tipos de faixa de endereços (ip4r, ip6r ou iprange).
|
Tipo de source |
Tipo de destino |
Formato |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Uso
Crie a extensão
CREATE EXTENSION ip4r;
Crie uma tabela de teste e importe dados
CREATE TABLE ipranges (r iprange, r4 ip4r, r6 ip6r);
INSERT INTO ipranges
SELECT r, null, r
FROM (
SELECT ip6r(regexp_replace(ls, E'(....(?!$))', E'\\1:', 'g')::ip6,
regexp_replace(substring(ls FOR n + 1) || substring(us FROM n + 2),
E'(....(?!$))', E'\\1:', 'g')::ip6) AS r
FROM (
SELECT md5(i || ' lower 1') AS ls,
md5(i || ' upper 1') AS us,
(i % 11) + (i/11 % 11) + (i/121 % 11) AS n
FROM generate_series(1,13310) i) s1) s2;
Crie um índice GiST
CREATE INDEX ipranges_r ON ipranges USING gist (r);
Verifique o uso do índice GiST
Para confirme se uma consulta de contenção utiliza o índice GiST, execute EXPLAIN:
EXPLAIN (COSTS OFF) SELECT * FROM ipranges WHERE r >>= '5555::' ORDER BY r;
O plano de consulta exibe uma varredura de índice Bitmap no índice GiST:
QUERY PLAN
-----------------------------------------------------
Sort
Sort Key: r
-> Bitmap Heap Scan on ipranges
Recheck Cond: (r >>= '5555::'::iprange)
-> Bitmap Index Scan on ipranges_r
Index Cond: (r >>= '5555::'::iprange)
(6 rows)
Desinstalar a extensão
DROP EXTENSION ip4r;