Vitesse de création des index avec PostgreSQL

Les utilisateurs n'aiment ni interrompre leur travail ni regarder le sablier
Répondre
Phil
Administrateur du site
Messages : 184
Enregistré le : mar. 1 sept. 2015 00:38
Localisation : France
Contact :

Vitesse de création des index avec PostgreSQL

Message par Phil » lun. 5 nov. 2018 18:47

Merci à un administrateur Oracle Database pour sa question :

"J'ai entendu que la création d'index avec PostgreSQL était super lente par rapport à Oracle, est-ce que ça gêne ?"

Réponse :

Je n'observe pas de lenteur en ce qui concerne les créations d'index PostgreSQL par rapport à ce que j'observe avec d'autres SGBD, au moins dans les versions récentes.
Pour des raisons légales, je ne peux publier sur le site ou le forum de résultats de benchmark comparant les performances d'Oracle Database et PostgreSQL mais je peux vous fournir des exemples de code à tester par vous-même.

Exemple, code PostgreSQL :

Code : Tout sélectionner

select version();
                                                    version
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 11.0 (Debian 11.0-1.pgdg+2) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.2.0-7) 8.2.0, 64-bit
(1 ligne)

create table geants( idg serial, idgu uuid, dtn timestamp, taille smallint, devise varchar(128), dicton varchar(128), berserk boolean);
CREATE TABLE

with recursive serie(i) as 
(select 1
 UNION ALL 
 select i + 1 from serie where i < 10000000)
insert into geants(idgu, dtn, taille, devise, dicton, berserk)
select
uuid_generate_v4(),
current_timestamp - (ceil(i/3) || ' minutes')::interval + (trunc(random() * 100 + 1) || ' days')::interval,
200 + (trunc(random() * 200 + 1)),
upper(md5(random()::text)),upper(md5(random()::text)),
case when random() < 0.001 then true else false end
from serie;
INSERT 0 10000000

\dt+ geants
                      Liste des relations
 Schéma   |  Nom   | Type  | Propriétaire | Taille  | Description
----------+--------+-------+--------------+---------+-------------
 postgres | geants | table | postgres     | 1281 MB |
(1 ligne)

\timing
Chronométrage activé

create index geants_i1 on geants(devise, dicton);
CREATE INDEX
Durée : ????

\di+
                            Liste des relations
 Schéma   |    Nom    | Type  | Propriétaire | Table  | Taille | Description
----------+-----------+-------+--------------+--------+--------+-------------
 postgres | geants_i1 | index | postgres     | geants | 911 MB |
Exemple, code Oracle Database :

Code : Tout sélectionner

Connecte a :
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

create table geants( idg integer generated by default as identity, idgu raw(16), dtn timestamp, taille smallint, devise varchar(128), dicton varchar(128), berserk number);

Table creee.

insert into geants(idgu, dtn, taille, devise, dicton, berserk)
with serie(i) as 
(select 1 from dual
 UNION ALL 
 select i + 1 from serie where i < 10000000)
select
sys_guid(),
current_timestamp - i/1440 + trunc(dbms_random.value * 100 + 1),
200 + (trunc(dbms_random.value * 200 + 1)),
DBMS_RANDOM.string('x',32),DBMS_RANDOM.string('x',32),
case when dbms_random.value < 0.001 then 1 else 0 end
from serie;

10000000 lignes creees.

select segment_name , bytes/1024/1024 from user_segments ;


SEGMENT_NAME                   BYTES/1024/1024
------------------------------ ---------------
GEANTS                                    1216

set timi on

create index geants_i1 on geants(devise, dicton);

Index cree.

Ecoule : ?? :?? :??.??

select segment_name , bytes/1024/1024 from user_segments ;
------------------------------ ---------------

GEANTS                                    1216
GEANTS_I1                                  848
Ici, il s'agit d'un index composé sur 2 colonnes de type texte mais vous pouvez créer des index sur les autres colonnes...
Cdlt. Phil - pgphil.ovh

Répondre