OVH Cloud OVH Cloud

mise à jour données

3 réponses
Avatar
E.Leruste
Bonjour,
J'ai besoin de mettre régulierement à jour une base de données SQL
Server 2k hébergé sur un bi Xeon 2,4 GHz - 1 Go de RAM
Cette mise à jour s'effectue via un programme (développé en c++ sous
Builder C++) à partir d'un fichier xls via un serveur ole/com.
Cette base de données occupe 1,1 Go (Data+journaux).
Les tables à mettre à jour comportent 300.000 lignes pour l'une et
4.700.000 lignes pour la seconde. (2ieme table: table de liaison (m,n)
entre table 1 et une 3ième table)

Adresse ---(NumAdr)--> AdrPrest <----(NumPrest)---- Prestataire
1 2 3
Le problème est la lenteur de ces mises à jour :
environ 300 lignes par heure....gloups...

le prog de mise à jour s'execute sur un poste client où l'activité proc
est faible. Par contre les proc sur le serveur sont à 95-100 %
continuellement. La mémoire physique est pleine mais pas saturée (pas de
swap)

L'algo général de cette mise à jour est le suivant :
( si l'adresse n'existe pas elle est créée puis la table 2 est mise à
jour, si l'adresse existe seule la table 2 est mise à jour)
Chaque ligne comporte une premiere serie d'infos sur une adresse
(rue,ville...) puis une 2ieme série avec des prestataires par categorie

Pour chaque ligne du fichier Excel :
1 - recherche de l'adresse en prenant en compte env. 10 champs (select
NumAdr where Rue=..., NumAppart=..., CodePostal=...,...soit 10 champs)
-> si elle n'existe pas: requete INSERT puis SELECT IDENT_CURRENT...
2 - mise à jour de la table 2:
- 2a : on efface les enregistrements de la table ayant le NumAdr
- 2b : on crée les enregistrements selon les infos du fichiers
excel ( environ une petite vingtaine de INSERT...)
Eventuellement, un prestataire inexistant est crée dans table 3.

J'ai ajouté 512 Mo de RAM dernièrement sans noter d'amélioration sensible.

Quelles pistes me proposez-vous?
J'ai perso pensé à:
- optimiser les requetes (mais comment : suis preneur de tout lien et
idée sur ce sujet)
- est-ce Ole/DCom qui n'est pas performant? Serait-il possible et
profitable d'utiliser un connecteur ODBC ou autre entre le prog et le
ficher excel ( La connexion SQL Server/programme est faite via ODBC)
- partir sur l'acquisition d'un second serveur et monter les 2 serveurs
en grappe ??? mais au vue de l'investissement, est'se que cela serait
vraiment profitable.

Sachant que je dois mettre en jour plus de 200000 adresses par mois, je
dois vraiment trouver la solution pour une énorme amélioration. Sinon,
je me retrouve avec 27 jours de mise à jour par mois.........

Rem : Une optimisation des index sont effectuées sur cette BDD chaque
semaine et il n'y a pas d'indexation de texte intégral.

Merci d'avance pour votre aide...

3 réponses

Avatar
synopsis
Avez-vous regardé du côté de l'ETL Microsoft : DTS ?


"E.Leruste" a écrit dans le message de news:
43e378ce$0$18313$
Bonjour,
J'ai besoin de mettre régulierement à jour une base de données SQL
Server 2k hébergé sur un bi Xeon 2,4 GHz - 1 Go de RAM
Cette mise à jour s'effectue via un programme (développé en c++ sous
Builder C++) à partir d'un fichier xls via un serveur ole/com.
Cette base de données occupe 1,1 Go (Data+journaux).
Les tables à mettre à jour comportent 300.000 lignes pour l'une et
4.700.000 lignes pour la seconde. (2ieme table: table de liaison (m,n)
entre table 1 et une 3ième table)

Adresse ---(NumAdr)--> AdrPrest <----(NumPrest)---- Prestataire
1 2 3
Le problème est la lenteur de ces mises à jour :
environ 300 lignes par heure....gloups...

le prog de mise à jour s'execute sur un poste client où l'activité proc
est faible. Par contre les proc sur le serveur sont à 95-100 %
continuellement. La mémoire physique est pleine mais pas saturée (pas de
swap)

L'algo général de cette mise à jour est le suivant :
( si l'adresse n'existe pas elle est créée puis la table 2 est mise à
jour, si l'adresse existe seule la table 2 est mise à jour)
Chaque ligne comporte une premiere serie d'infos sur une adresse
(rue,ville...) puis une 2ieme série avec des prestataires par categorie

Pour chaque ligne du fichier Excel :
1 - recherche de l'adresse en prenant en compte env. 10 champs (select
NumAdr where Rue=..., NumAppart=..., CodePostal=...,...soit 10 champs)
-> si elle n'existe pas: requete INSERT puis SELECT IDENT_CURRENT...
2 - mise à jour de la table 2:
- 2a : on efface les enregistrements de la table ayant le NumAdr
- 2b : on crée les enregistrements selon les infos du fichiers
excel ( environ une petite vingtaine de INSERT...)
Eventuellement, un prestataire inexistant est crée dans table 3.

J'ai ajouté 512 Mo de RAM dernièrement sans noter d'amélioration sensible.

Quelles pistes me proposez-vous?
J'ai perso pensé à:
- optimiser les requetes (mais comment : suis preneur de tout lien et
idée sur ce sujet)
- est-ce Ole/DCom qui n'est pas performant? Serait-il possible et
profitable d'utiliser un connecteur ODBC ou autre entre le prog et le
ficher excel ( La connexion SQL Server/programme est faite via ODBC)
- partir sur l'acquisition d'un second serveur et monter les 2 serveurs
en grappe ??? mais au vue de l'investissement, est'se que cela serait
vraiment profitable.

Sachant que je dois mettre en jour plus de 200000 adresses par mois, je
dois vraiment trouver la solution pour une énorme amélioration. Sinon,
je me retrouve avec 27 jours de mise à jour par mois.........

Rem : Une optimisation des index sont effectuées sur cette BDD chaque
semaine et il n'y a pas d'indexation de texte intégral.

Merci d'avance pour votre aide...






Avatar
Sylvain Lafontaine
Oubliez votre recherche du côté de COM/DCOM, OLEDB et ODBC; comme votre
serveur travaille à 95-100% de sa capacité, votre problème se situe à ce
niveau là et non pas au niveau du client ou du protocol de communication
intermédiaire.

Votre problème est probablement dû à une recherche inefficace: la recherche
de chaque adresse individuelle implique possiblement une « table scan » de
la table #1 à chaque fois. Regardez les plans d'exécution et modifier le
design de vos requêtes/table/indexes afin de faire disparaître ce « table
scan » ; fort possiblement que votre problème sera alors résolu.

Comme SQL-Server n'utilise qu'un index à la fois, il est important que cet
index couvre tous les champs requis pour la recherche et qu'il ait aussi un
faible pourcentage d'occupation (50% ou moins?) puisque vous faîtes
énormément de mise-à-jour de la table. À cause de ces mise-à-jours aussi,
ne le mettez pas en mode cluster.

Votre table de liaison intermédiaire m'a également l'air suspect. On
utilise généralement ce genre de table lorsqu'une seule addresse peut
correspondre à plusieurs prestataires et un même prestataire avoir plusieurs
addresses différentes en même temps. La description que vous donnez ne
semble pas correspondre à exactement cela; particulièrement lorsque vous
dites que vous effacer d'abord tous les enregistrements et que vous faites
ensuite une vingtaine d'insertions.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"E.Leruste" wrote in message
news:43e378ce$0$18313$
Bonjour,
J'ai besoin de mettre régulierement à jour une base de données SQL
Server 2k hébergé sur un bi Xeon 2,4 GHz - 1 Go de RAM
Cette mise à jour s'effectue via un programme (développé en c++ sous
Builder C++) à partir d'un fichier xls via un serveur ole/com.
Cette base de données occupe 1,1 Go (Data+journaux).
Les tables à mettre à jour comportent 300.000 lignes pour l'une et
4.700.000 lignes pour la seconde. (2ieme table: table de liaison (m,n)
entre table 1 et une 3ième table)

Adresse ---(NumAdr)--> AdrPrest <----(NumPrest)---- Prestataire
1 2 3
Le problème est la lenteur de ces mises à jour :
environ 300 lignes par heure....gloups...

le prog de mise à jour s'execute sur un poste client où l'activité proc
est faible. Par contre les proc sur le serveur sont à 95-100 %
continuellement. La mémoire physique est pleine mais pas saturée (pas de
swap)

L'algo général de cette mise à jour est le suivant :
( si l'adresse n'existe pas elle est créée puis la table 2 est mise à
jour, si l'adresse existe seule la table 2 est mise à jour)
Chaque ligne comporte une premiere serie d'infos sur une adresse
(rue,ville...) puis une 2ieme série avec des prestataires par categorie

Pour chaque ligne du fichier Excel :
1 - recherche de l'adresse en prenant en compte env. 10 champs (select
NumAdr where Rue=..., NumAppart=..., CodePostal=...,...soit 10 champs)
-> si elle n'existe pas: requete INSERT puis SELECT IDENT_CURRENT...
2 - mise à jour de la table 2:
- 2a : on efface les enregistrements de la table ayant le NumAdr
- 2b : on crée les enregistrements selon les infos du fichiers
excel ( environ une petite vingtaine de INSERT...)
Eventuellement, un prestataire inexistant est crée dans table 3.

J'ai ajouté 512 Mo de RAM dernièrement sans noter d'amélioration sensible.

Quelles pistes me proposez-vous?
J'ai perso pensé à:
- optimiser les requetes (mais comment : suis preneur de tout lien et
idée sur ce sujet)
- est-ce Ole/DCom qui n'est pas performant? Serait-il possible et
profitable d'utiliser un connecteur ODBC ou autre entre le prog et le
ficher excel ( La connexion SQL Server/programme est faite via ODBC)
- partir sur l'acquisition d'un second serveur et monter les 2 serveurs
en grappe ??? mais au vue de l'investissement, est'se que cela serait
vraiment profitable.

Sachant que je dois mettre en jour plus de 200000 adresses par mois, je
dois vraiment trouver la solution pour une énorme amélioration. Sinon,
je me retrouve avec 27 jours de mise à jour par mois.........

Rem : Une optimisation des index sont effectuées sur cette BDD chaque
semaine et il n'y a pas d'indexation de texte intégral.

Merci d'avance pour votre aide...






Avatar
Michel PRIORI
Bonjour,

Pour optimiser les requetes :
1- lancer le 'profiler' (analyseur de profil) et choisir le modèle tuning
pour faire une trace
2- dans entreprise manager, chercher les assistants, lancer 'index tuning
wizard' et pointer le ficheir de trace (faire l'analyse table par table sous
peine d'attendre 2 heures et voir le process planter - à faire sur le serveur
de prod)

Pour les mises à jour :
si c'est le client qui génère un ordre de mise à jour ligne après ligne,
l'étape de dessus ne sert à rien. Un seul ordre update et insert doit être
lancé.
Plutôt qu'une logique ligne à ligne il FAUT réfléchir à des actions
ensemblistes.
C'est le moteur d'optimisation SQL (celui que tu as acheté avec la licence)
qui fait le boulot (et plutôt bien d'ailleurs).

En clair y a du boulot.

Bon courage.

cordialement


"E.Leruste" wrote:

Bonjour,
J'ai besoin de mettre régulierement à jour une base de données SQL
Server 2k hébergé sur un bi Xeon 2,4 GHz - 1 Go de RAM
Cette mise à jour s'effectue via un programme (développé en c++ sous
Builder C++) à partir d'un fichier xls via un serveur ole/com.
Cette base de données occupe 1,1 Go (Data+journaux).
Les tables à mettre à jour comportent 300.000 lignes pour l'une et
4.700.000 lignes pour la seconde. (2ieme table: table de liaison (m,n)
entre table 1 et une 3ième table)

Adresse ---(NumAdr)--> AdrPrest <----(NumPrest)---- Prestataire
1 2 3
Le problème est la lenteur de ces mises à jour :
environ 300 lignes par heure....gloups...

le prog de mise à jour s'execute sur un poste client où l'activité proc
est faible. Par contre les proc sur le serveur sont à 95-100 %
continuellement. La mémoire physique est pleine mais pas saturée (pas de
swap)

L'algo général de cette mise à jour est le suivant :
( si l'adresse n'existe pas elle est créée puis la table 2 est mise à
jour, si l'adresse existe seule la table 2 est mise à jour)
Chaque ligne comporte une premiere serie d'infos sur une adresse
(rue,ville...) puis une 2ieme série avec des prestataires par categorie

Pour chaque ligne du fichier Excel :
1 - recherche de l'adresse en prenant en compte env. 10 champs (select
NumAdr where Rue=..., NumAppart=..., CodePostal=...,...soit 10 champs)
-> si elle n'existe pas: requete INSERT puis SELECT IDENT_CURRENT...
2 - mise à jour de la table 2:
- 2a : on efface les enregistrements de la table ayant le NumAdr
- 2b : on crée les enregistrements selon les infos du fichiers
excel ( environ une petite vingtaine de INSERT...)
Eventuellement, un prestataire inexistant est crée dans table 3.

J'ai ajouté 512 Mo de RAM dernièrement sans noter d'amélioration sensible.

Quelles pistes me proposez-vous?
J'ai perso pensé à:
- optimiser les requetes (mais comment : suis preneur de tout lien et
idée sur ce sujet)
- est-ce Ole/DCom qui n'est pas performant? Serait-il possible et
profitable d'utiliser un connecteur ODBC ou autre entre le prog et le
ficher excel ( La connexion SQL Server/programme est faite via ODBC)
- partir sur l'acquisition d'un second serveur et monter les 2 serveurs
en grappe ??? mais au vue de l'investissement, est'se que cela serait
vraiment profitable.

Sachant que je dois mettre en jour plus de 200000 adresses par mois, je
dois vraiment trouver la solution pour une énorme amélioration. Sinon,
je me retrouve avec 27 jours de mise à jour par mois.........

Rem : Une optimisation des index sont effectuées sur cette BDD chaque
semaine et il n'y a pas d'indexation de texte intégral.

Merci d'avance pour votre aide...