Conseils et formations : vos deux atouts pour réussir !
Accueil > Integration Services > Articles
Performances avec SSIS : index ou pas

Introduction :


Dans la suite de mes posts sur les performances, je vais m'attaquer ici aux chargements de masse avec Integration Services : comment aller encore plus vite ?

Le package du benchmark :

 


Après génération d'un fichier de données tests dans une première séquence, je vais faire des insertions dans une table cible sous SQLServer2005.

La création de cette table est dans le package et voici son code SQL :

    if exists (select * from information_schema.tables where table_name = 'COUREUR')

        drop table COUREUR

    go

    create table [dbo].[COUREUR](

    [NO_COUREUR] [int] NOT null,

    [NO_CLUB] [int] null,

    [NATIONALITE] [varchar](3) null,

    [NOM] [varchar](40) null,

    [PRENOM] [varchar](40) null,

    [D_NAISSANCE] [datetime] null,

    [SEXE] [varchar](1) null,

    [ADRESSE_RUE1] [varchar](80) null,

    [ADRESSE_RUE2] [varchar](80) null,

    [CODE_POSTAL] [varchar](10) null,

    [VILLE] [varchar](80) null,

    [NO_LICENCE] [varchar](10) null,

    [ANNEE_PREMIERE_LICENCE] [smallint] null,

    [ADRESSE_ELECTRONIQUE] [varchar](250) null,

    [D_VALIDITE_LICENCE] [datetime] null,

    [D_MUTATION] [datetime] null,

    [D_PREMIERE_LICENCE] [datetime] null,

    [D_MAJ] [datetime] null,

    [ETRANGER] [bit] null,

    [PRATIQUANT] [bit] null,

    [TYPE_LICENCE] [varchar](10) null,

    [PRE_INSCRIPTION] [bit] null,

    [DT_MAJ_USR] [datetime] null,

    CONSTRAint [PK_COUREUR] primary key clustered

    (

    [NO_COUREUR] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_key = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [primary]

    ) ON [primary]

    go

    create NONclustered INDEX [IX1_COUREUR] ON [dbo].[COUREUR]

    (

    [NOM] ASC,

    [PRENOM] ASC,

    [D_NAISSANCE] ASC,

    [SEXE] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_key = OFF, drop_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [primary]

    go

    create NONclustered INDEX [IX2_COUREUR] ON [dbo].[COUREUR]

    (

    [NO_LICENCE] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_key = OFF, drop_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [primary]

    go

    create NONclustered INDEX [IX3_COUREUR] ON [dbo].[COUREUR]

    (

    [NO_CLUB] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_key = OFF, drop_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [primary]

    go


On voit qu'il y a plusieurs index à gérer et ceci aura bien sûr une incidence sur les performances du package.

Mesurons cela :


La tâche qui nous intéresse a duré 23 secondes pour 360 000 lignes, ce qui n'est pas si mal, mais peut aller encore plus vite ?
Une première idée est de faire un disable de tous les index avant les insertions puis un enable après les insertions : cette technique convient bien si la table est permanente..

Voyons cela :

 


Bon , 20 secondes, un peu mieux que précédemment... mais, si on crée la table dans le package on peut faire mieux :

 


Et là, on arrive à quelque chose de très bon à savoir 11 secondes 578 tout compris pour créer la table cible, importer les données et créer tous les index.
Le tout sur 360 000 lignes.... pas si mal !

Conclusion :


Comme souvent, des stratégies d'indexation bien choisies permettront d'obtenir les meilleures performances, et, cerise sur le gâteau, des bases moins fragmentées donc des bonnes performances à venir.

 ‭(Masqué)‬ WebPart1 Web Part

/SSIS/Performances avec SSIS : index ou pas/