Index en doublon sur certaines table de simplicité

Problem description

La table bpm_activity et m_agenda contiennent des indexes suivants en double:

"m_agenda_agd_date_id_fk" btree (agd_date_id)
"m_agenda_fk2" btree (agd_date_id) 
"m_agenda_agd_duration_id_fk" btree (agd_duration_id)
"m_agenda_fk3" btree (agd_duration_id) "m_agenda_agd_group_id_fk" btree (agd_group_id)
"m_agenda_fk4" btree (agd_group_id) "m_agenda_agd_object_id_fk" btree (agd_object_id)
"m_agenda_fk1" btree (agd_object_id) "m_agenda_uk" UNIQUE, btree (agd_name)
"m_agenda_agd_name_idx" btree (agd_name)
"m_agenda_fk0" btree (row_module_id)
"m_agenda_row_module_id_fk" btree (row_module_id)
"m_agenda_agd_label1_id_fk" btree (agd_label1_id)
"m_agenda_fk6" btree (agd_label1_id)
"m_agenda_agd_label2_id_fk" btree (agd_label2_id)
"m_agenda_fk7" btree (agd_label2_id)
"m_agenda_agd_label3_id_fk" btree (agd_label3_id)
"m_agenda_fk8" btree (agd_label3_id)
"m_agenda_agd_label4_id_fk" btree (agd_label4_id)
"m_agenda_fk9" btree (agd_label4_id)
"m_agenda_agd_label5_id_fk" btree (agd_label5_id)
"m_agenda_fk10" btree (agd_label5_id)

y aurait une explication à ca?
En plus j’ai remarqué que plus de 60 tables dans simplicité ont ce problème d’indexes doublés

[Health check]

[Platform] Status=OK Version=5.1.22 BuiltOn=2021-12-29 12:44 Git=release/a4a4aafa93310ec3387ad178ae2001072320c3f3 Encoding=UTF-8 EndpointIP=172.20.181.139 EndpointURL=http://mla-api-b94d885ff-6sxkn:8080 TimeZone=Europe/Paris SystemDate=2022-02-28 17:58:48 [Application] ApplicationVersion=0.10 ContextPath= ContextURL=https://app-mladv2.gke.dev.gcp.renault.com ActiveSessions=2 TotalUsers=14 EnabledUsers=10 LastLoginDate=2022-02-28 15:53:41 [Server] ServerInfo=Apache Tomcat/9.0.56 ServerType=WEB ServerActiveSessions=4 [OS] Name=Linux Architecture=amd64 Version=5.4.144+ DockerImageName=centos7 SystemEncoding=UTF-8 [Disk] DiskFree=16488 DiskUsable=16472

Quelle base (type et version) utilisez vous ?

NB: Cette info est dans le health check mais celui que vous avez copié est incomplet…

Status=OK
Version=5.1.22
BuiltOn=2021-12-29 12:44
Git=release/a4a4aafa93310ec3387ad178ae2001072320c3f3
Encoding=UTF-8
EndpointIP=172.20.181.139
EndpointURL=http://mla-api-b94d885ff-6sxkn:8080
TimeZone=Europe/Paris
SystemDate=2022-02-28 17:58:48

[Application]
ApplicationVersion=0.10
ContextPath=
ContextURL=https://app-mladv2.gke.dev.gcp.renault.com
ActiveSessions=2
TotalUsers=14
EnabledUsers=10
LastLoginDate=2022-02-28 15:53:41

[Server]
ServerInfo=Apache Tomcat/9.0.56
ServerType=WEB
ServerActiveSessions=4

[OS]
Name=Linux
Architecture=amd64
Version=5.4.144+
DockerImageName=centos7
SystemEncoding=UTF-8

[Disk]
DiskFree=16488
DiskUsable=16472
DiskTotal=96551

[JavaVM]
Version=17.0.1
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.1+12
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=225843
HeapSize=1679360
HeapMaxSize=7131136
TotalFreeSize=5677619

[Cache]
GrantCache=0
GrantCacheMax=0
GrantCacheRatio=0
ObjectCache=36
ObjectCacheMax=10000
ObjectCacheRatio=0
ProcessCache=0
ProcessCacheMax=10000
ProcessCacheRatio=0

[Database]
Vendor=3
ProductName=PostgreSQL
ProductVersion=11.13
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.3.1
DBDate=2022-02-28 17:58:48
DBDateOffset=0
DBPatchLevel=5;P01;8eec3aaa281ce44b39212dcadbfe22cf
UsingBLOBs=true

[Healthcheck]
Date=2022-02-28 17:58:48
ElapsedTime=15

OK PostgreSQL 11. Merci

Quand vous dites “doublon” vous voulez dire des indexes portant sur les mêmes colonnes mais avec un nom différent ? Je pose la question car Simplicité créé 3 types d’indexes:

  • des primary keys qui portent sur le row ID (colonne row_id) => suffixe en _pkey
  • des unique keys qui portent sur la combinaison des colonnes des attributs paramétrés comme “clés fonctionnelle” => suffixe en _uk
  • des indexes simples sur les colonnes de attributs de type “référence” (i.e. les foreign keys) => suffixe en _fk
  • des indexes simples sur les colonnes des attributs obligatoires de type chaine de caractère (donc colonnes varchar) => suffixe en _idx

Il peut donc potentiellement y avoir des doublons entre les unique keys et les indexes simples (ex: quand un objet n’a qu’un seul attribut identifiant et que celui-ci est un attribut de type chaine de caractère obligatoire).

En outre, je vois effectivement que les nommages d’index des objets de paramétrage du script de création initiale (ceux en _fk<n>) ne suivent pas la même logique de nommage que les indexes générés ultérieurement au niveau applicatif.

Du coup sur chaque objet de paramétrage sur lequel à un moment ou à un autre il y a eu un save (ex: manuel ou via une mise à jour système) ce qui induit une régénération des indexes, cela aboutit donc à des doublons d’index.

Nous allons regarder pour améliorer cela en alignant (si possible) le nommage au niveau du script initial et par un traitement ad hoc au moment du save applicatif.

PS: En attendant vous pouvez supprimer manuellement les indexes en doublon de même type (= les indexes en _fk<n> pour lesquels il y a un index identique en _fk)

Les noms d’indexes “courts” sont historiques et étaient surtout dédiés à Oracle pre-V12 qui limitait la taille des noms à 30 caractères. Donc à laisser de préférence. Oracle 12+ autorise les indexes de 128 caractères.

Il faudrait plutôt voir si on peut tester l’existence d’un index sur des colonnes avant de le recréer.
Sinon on va devoir effectivement retirer les anciens indexes en doublon avec les nouveaux noms, mais Oracle va poser problème (comme toujours).

Oui c’est ce que je voulais dire par “un traitement ad hoc au moment du save applicatif” = retrouver un éventuel index déjà existant (et, au passage, supprimer d’éventuels doublons)

Nous allons supprimer manuellement ces indexes en doublons.

Bonjour,

Il n’y a pas d’API standardisée JDBC pour tester si un index existe sur des colonnes ordonnées. Il faudrait le développer pour chaque base de données et ce n’est pas forcement le métier de Simplicité.

Il va donc plutôt falloir :

  1. soit recréer les indexes des tables du socle pour les rendre compatible avec le runtime qui les recrées avec un nom différent => alter global de la base assez lourd
  2. soit ne pas générer d’index si on est sur une table socle car déjà livré avec d’autres noms courts => il faut juste prévoir de droper les autres générés par erreur avant correction.

Le 2) me semble plus simple à mettre en place.

Oui le 2) semble la bonne chose à faire dans le contexte. A nous de toujours bien livrer les indexes des objets système.

Ok, ce changement sera livré en 5.2 actuellement en beta.

Pour supprimer les indexes en doublons (de noms différents mais sur les mêmes colonnes), il faudra relancer la tache de génération des indexes sur les objets sur lesquels vous l’aviez fait.

Du coup j’ai un doute sur ceux que vous avez supprimés ?
Attention, il faut bien conserver les indexes suffixés par un numéro.
Par exemple garder m_agenda_fk9, et supprimer m_agenda_agd_label4_id_fk généré en trop.
@Userenault