OVH Cloud OVH Cloud

Insertion dans une base.

11 réponses
Avatar
Jerome
Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer distante de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti terriblement
l'importation (et pourtant les ressources du serveur sont correctes, maxi 5%
des procs).

Jérôme

10 réponses

1 2
Avatar
Christian Robert
Comment se fait l'import d'Excel à SQL Server ?
DTS ? Autres ?

L'import est commandé depuis Excel, depuis SQL Server ou depuis une
application tierce ?

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Jerome" a écrit :

Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer distante de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti terriblement
l'importation (et pourtant les ressources du serveur sont correctes, maxi 5%
des procs).

Jérôme





Avatar
Jerome
Bonjour,

Depuis une application que l'on à developper sous .Net et qui utilise
ADO.Net. On utilise de simples requêtes INSERT via un object command, le
tout entouré par une transaction qui valide l'ensemble, une fois toutes les
requêtes insert sont arrivées.

Jerome


"Christian Robert" (sansspam)> a écrit dans le
message de news:
Comment se fait l'import d'Excel à SQL Server ?
DTS ? Autres ?

L'import est commandé depuis Excel, depuis SQL Server ou depuis une
application tierce ?

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Jerome" a écrit :

Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer distante
de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti terriblement
l'importation (et pourtant les ressources du serveur sont correctes, maxi
5%
des procs).

Jérôme







Avatar
Romelard Fabrice [MVP]
Bonjour,

Alors si vous passez par du développement, utilisez des procédures stockées
(gain potentiel quais *2), ensuite typez vos variables transmises pour
éviter au moteur SQL de devoir le faire.

--
Cordialement.

Romelard Fabrice [MVP]

"Jerome" a écrit dans le message de news:

Bonjour,

Depuis une application que l'on à developper sous .Net et qui utilise
ADO.Net. On utilise de simples requêtes INSERT via un object command, le
tout entouré par une transaction qui valide l'ensemble, une fois toutes
les requêtes insert sont arrivées.

Jerome


"Christian Robert" (sansspam)> a écrit dans
le message de news:
Comment se fait l'import d'Excel à SQL Server ?
DTS ? Autres ?

L'import est commandé depuis Excel, depuis SQL Server ou depuis une
application tierce ?

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Jerome" a écrit :

Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer
distante de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser
l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti
terriblement
l'importation (et pourtant les ressources du serveur sont correctes,
maxi 5%
des procs).

Jérôme











Avatar
Romelard Fabrice [MVP]
Pour information, j'ai un exemple avec un chargement de près de 20 000 ligne
depuis un fichier Texte dont les colonnes sont en taille fixe.
Ce chargement se fait sur un serveur SQL 2000 avec un dev en C# en 4
minutes.


"Jerome" a écrit dans le message de news:

Bonjour,

Depuis une application que l'on à developper sous .Net et qui utilise
ADO.Net. On utilise de simples requêtes INSERT via un object command, le
tout entouré par une transaction qui valide l'ensemble, une fois toutes
les requêtes insert sont arrivées.

Jerome


"Christian Robert" (sansspam)> a écrit dans
le message de news:
Comment se fait l'import d'Excel à SQL Server ?
DTS ? Autres ?

L'import est commandé depuis Excel, depuis SQL Server ou depuis une
application tierce ?

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Jerome" a écrit :

Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer
distante de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser
l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti
terriblement
l'importation (et pourtant les ressources du serveur sont correctes,
maxi 5%
des procs).

Jérôme











Avatar
Christian Robert
Un petit ajout, la transaction joue aussi un rôle dans le cas d'import de la
part de plusieurs utilisateurs simultanément...

On préfère dans le cas d'import faire des commit tous les xxx (à définir)
enregistrements insérés pour libérer des ressources et éviter de bloquer
d'autres utilisateurs...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Romelard Fabrice [MVP]" a écrit :

Pour information, j'ai un exemple avec un chargement de près de 20 000 ligne
depuis un fichier Texte dont les colonnes sont en taille fixe.
Ce chargement se fait sur un serveur SQL 2000 avec un dev en C# en 4
minutes.


"Jerome" a écrit dans le message de news:

> Bonjour,
>
> Depuis une application que l'on à developper sous .Net et qui utilise
> ADO.Net. On utilise de simples requêtes INSERT via un object command, le
> tout entouré par une transaction qui valide l'ensemble, une fois toutes
> les requêtes insert sont arrivées.
>
> Jerome
>
>
> "Christian Robert" (sansspam)> a écrit dans
> le message de news:
>> Comment se fait l'import d'Excel à SQL Server ?
>> DTS ? Autres ?
>>
>> L'import est commandé depuis Excel, depuis SQL Server ou depuis une
>> application tierce ?
>>
>> --
>> Cordialement
>>
>> Christian Robert
>> Consultant - Formateur chez Winwise
>> MCT - MCDBA - MCSD
>>
>>
>> "Jerome" a écrit :
>>
>>> Salut à tous,
>>>
>>> J'ai une application qui fait des INSERT dans une base SQLServer
>>> distante de
>>> données issues d'un fichier Excel.
>>>
>>> Pour 2053 données ça prend 7 minutes.
>>> Pour 7660 données ça prend 20 minutes.
>>> Et pour 65000 données ça prend près de 2 heures.
>>>
>>> Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.
>>>
>>> 1. D'après-vous est-normal ????? Je cherche comment optimiser
>>> l'insertion
>>> pour que ça mette moins de temps.
>>> 2. Si plusieurs personnes importent en même temps ça ralenti
>>> terriblement
>>> l'importation (et pourtant les ressources du serveur sont correctes,
>>> maxi 5%
>>> des procs).
>>>
>>> Jérôme
>>>
>>>
>>>
>
>





Avatar
Jerome
En fait il y a qu'une partie des données qui utilise une transaction. La
partie en question importe une branche dans un arbre intervallaire, le reste
des données est importé dans une feuille de la première partie. Il faut donc
que l'arbre intervallaire sous validé pour que l'importation des autres
données soit possible.

Jerome
Avatar
Jerome
Tout dépend cependant du poids des données, du nombre d'utilisateur qui
importe et de la connexion entre les deux serveurs. Bon dans notre cas au
maxi (sans la grammaire de la requête) ça fait maxi 300 octets par ligne, ce
qui reste peu et le tout envoyé avec une ligne de 512Kpbs partagé par 3
utilisateurs qui importe sans cesse.

Si vous pouvez me faire partager un peu votre expérience, comment avez-vous
géré l'import des données sous .net ? Avec des objets command et une
procédure stockée ?

N'y a t'il pas une autre façon d'importer ces données (je me demande si
envoyé le fichier à un service local sur le serveur n'irait pas plus vite)
??

Merci

Jerome
Avatar
Romelard Fabrice [MVP]
Bonsoir,
Dans ce cas, il faudrait peut-être voir du coté d'un DTS avec un testeur de
présence de fichier.
En gros si vous êtes en .NET 1.1, vous pouvez développer un FileWatcher qui
va scanner un répertoire donné sur votre serveur, ainsi dans le cas de
l'apparition de votre fichier, celui-ci va lancer un DTS d'importation que
vous aurez créé.

Dans le cas où êtes sous SQL Server 2005, un composant existe ici :
- http://www.sqlis.com/default.aspx?23

A vous de voir la meilleure solution. Mais il est vrai que vous gagnerez
forcément du temps à faire exécuter cette tache par votre serveur SQL.

--
Cordialement.

Romelard Fabrice [MVP]

"Jerome" a écrit dans le message de news:
%
Tout dépend cependant du poids des données, du nombre d'utilisateur qui
importe et de la connexion entre les deux serveurs. Bon dans notre cas au
maxi (sans la grammaire de la requête) ça fait maxi 300 octets par ligne,
ce qui reste peu et le tout envoyé avec une ligne de 512Kpbs partagé par 3
utilisateurs qui importe sans cesse.

Si vous pouvez me faire partager un peu votre expérience, comment
avez-vous géré l'import des données sous .net ? Avec des objets command et
une procédure stockée ?

N'y a t'il pas une autre façon d'importer ces données (je me demande si
envoyé le fichier à un service local sur le serveur n'irait pas plus vite)
??

Merci

Jerome




Avatar
SQLpro [MVP]
Bonjour,

Pour diviser par 2 à 10 les temps de réponse en insertion massive,
procédez comme suit :

1) utilisez le BULK INSERT

2) évitez de gérer une transaction. Celle-ci n'a pas de réel intérêt du
fait que vous avez la sources des données. Donc en cas de problème vous
pouvez rejouer l'insertion.

3) divisez votre insertion en lot dont le volume représente un "extent"
soit 64 Ko dans la table cible

4) supprimez préalablement à l'insertion, les index (sauf clef primaire)
et régénérez les en fin d'insertion

Ce que vous avez fait en générant un ordre SQL INSERT par ligne le tout
dans une transaction est la pire des manières.

A +

Jerome a écrit :
Salut à tous,

J'ai une application qui fait des INSERT dans une base SQLServer distante de
données issues d'un fichier Excel.

Pour 2053 données ça prend 7 minutes.
Pour 7660 données ça prend 20 minutes.
Et pour 65000 données ça prend près de 2 heures.

Les fichiers excel font respectivement 378Ko, 3,3Mo et 14,5Mo.

1. D'après-vous est-normal ????? Je cherche comment optimiser l'insertion
pour que ça mette moins de temps.
2. Si plusieurs personnes importent en même temps ça ralenti terriblement
l'importation (et pourtant les ressources du serveur sont correctes, maxi 5%
des procs).

Jérôme






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Jerome
Merci pour les infos...

1) utilisez le BULK INSERT



donc un SqlBulkCopy ?!

2) évitez de gérer une transaction. Celle-ci n'a pas de réel intérêt du
fait que vous avez la sources des données. Donc en cas de problème vous
pouvez rejouer l'insertion.



Oui c'est ce que j'ai d'ailleurs fait

3) divisez votre insertion en lot dont le volume représente un "extent"
soit 64 Ko dans la table cible



Euh comment ça ?

4) supprimez préalablement à l'insertion, les index (sauf clef primaire)
et régénérez les en fin d'insertion



Comment on fait ça ? Vu qu'il y a plusieurs utilisateurs qui importent ça
risque pas de provoquer des problèmes ??
Sachant que la base ne sert qu'à l'écriture, je peux peut-être supprimé tous
les index ?!

Ce que vous avez fait en générant un ordre SQL INSERT par ligne le tout
dans une transaction est la pire des manières.



M'étonne pas... c'est justement pour ça que je pose la question :)

Jerome
1 2