Bonjour,
J'interviens chez un client dont une application annexe au coeur de métier utilise une base de données MS SQL server.
Cette application possède des tables relativement volumineuses, allant de quelques millions de lignes à plus d'un milliard pour celles que j'ai pu vérifier.
(je n'ai examiné qu'une dizaine de tables, celles décrites comme au coeur de l'application par le document à ma disposition).
Jusqu'ici rien de révolutionnaire.
Les temps de traitement sont considérablement longs (les batchs du WE débordent régulièrement sur la journée du lundi, voire jusqu'au mercredi )
A temps perdu, bien que je ne sois pas missionné pour ce sujet, j'ai donc entrouvert le capot du bousin pour voir ce que se passait la dessous.
Et là... c'est le drame !
Voici le constat :
La version SQL server est antédiluvienne : select @@version ==> Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64).
Le serveur dispose 14 giga de RAM
Aucune table ne possède de PK : select * from sys.indexes where is_primary_key=1 ==> vide.
Cohérence dans l'effort, aucune intégrité référentielle n'est trouvée : select * from sys.foreign_keys ==> vide.
Droit dans mes bottes, je m'enquiers de ce qu'il en est des index :
Le résultat est probant : tous les index, aucune exception, sont multicolonnes et utilisent à minima deux colonnes varchar (jusqu'à varchar(72) tant qu'à faire)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 select substring(TAB.name, 01, 25) as TabName , substring(IND.name, 01, 25) as NdxName , substring(IND.type_desc, 01, 25) as Descr , IND.is_unique as UNQ , IND.is_primary_key as PK , IXC.key_ordinal as KeySeq , substring(COL.name, 01, 25) as ColName , substring(TYP.name, 01, 12) as Coltype , COL.max_length as Lng from sys.tables TAB inner join sys.indexes IND on IND.object_id = TAB.object_id inner join sys.index_columns IXC on IXC.object_id = IND.object_id and IXC.index_id = IND.index_id inner join sys.columns COL on COL.object_id = IXC.object_id and COL.column_id = IXC.column_id inner join sys.types TYP on TYP.user_type_id=COL.user_type_id where TAB.name in [...] order by TAB.name , IND.name , IXC.key_ordinal
N'ayant plus rien à craindre, je me dis, mignonne, allons voir si la rose ou plutôt les tables sont obèses :
Bingo, on dépasse les 170 colonnes...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 select table_name as TNAME , count(COLUMN_NAME) from information_schema.columns where TABLE_CATALOG=[...] and TABLE_SCHEMA =[...] and TABLE_NAME in [...] group by TABLE_NAME
Bref, bilan tellement monstrueux que je me demande si j'ai loupé un truc ?
Bien évidemment, pas question de refondre tout ça, il s'agit d'un progiciel, facturé comme il se doit par son prestataire, mais auquel on ne touche pas.
Question à 595 francs (soit 15 francs+15 francs+15 francs) : pensez-vous que faute de mieux, une montée de version SQL server pourrait au moins apporter un petit quelque chose d'un point de vue performances.
Partager