2009-09-17 10 views
0

Dans ce scénario, il existe deux serveurs de base de données: l'un se trouve sur notre réseau local (serveur A) et l'autre sur notre emplacement distant (serveur B).Augmentez les performances de DELETE/INSERT sur le serveur distant

Nous voulons transférer les données de nos projets du serveur A au serveur B. Pour ce faire, nous supprimons d'abord les données existantes sur le serveur B pour un certain ProjectID et ensuite insérons simplement les données du serveur A au serveur B. Toutes les données sont préparées sur le serveur A.

La quantité réelle de données transférées est d'environ 2,5 Mo. Avec notre connexion 20MBit cela devrait être fait en un éclair. Cependant avec SQL cela prend 30-40 secondes. En fait, si vous voulez prendre la même quantité de données et le transférer avec FTP, cela prend 4 sec. :)

J'ai activé la fonction NON COMPTANT. J'ai lu que cela pourrait accélérer les requêtes à distance.
Qu'est-ce qui pourrait causer ce transfert lent?

EDIT:
Le SQL devrait vraiment être la cause. Il se décompose comme suit:
- Sélectionnez les données de tous les types de bases de données et l'insérer dans un DB sur le serveur A
- Supprimer du serveur B DB Où ProjectID = x
- Insérer dans le serveur B DB - Sélectionnez * à partir du serveur Une base de données où ProjectID = x

Les deux dernières étapes prennent environ 40 secondes. Et comme vous pouvez le voir, tout ce que je fais est de supprimer les anciens enregistrements et d'insérer les nouveaux. Aucune jointure ou syntaxe t-sql difficile.

+0

Je pense que vous devez nous donner plus d'informations. Si vous pensez que le SQL est la cause, peut-être nous montrer un pseudo-code. – dave

+0

Je suis d'accord avec dave, mais je vais poster une réponse générique –

Répondre

1

Je vérifierais soigneusement la conception et la structure de la base de données B où se produisent les suppressions. Vérifiez que les index sont bien conçus et optimisés, vérifiez les relations de clés étrangères et les suppressions en cascade vers d'autres tables référençant la table où se produisent les suppressions, vérifiez également les déclencheurs de suppression et voyez ce qu'ils font.

Je vérifie également le serveur distant lui-même et m'assure qu'il n'y a aucun problème avec le matériel, tel qu'un disque dur défaillant ou un contrôleur de disque. J'avais une base de données qui souffrait d'une lenteur massive. Il leur a fallu un mois pour finalement identifier le coupable comme une carte RAID défaillante. Si ce n'est pas le cas, essayez d'effectuer quelques tests de débit sur le réseau entre deux serveurs pour voir si vous obtenez vraiment la bande passante que vous êtes censé obtenir. Regardez et voyez quelles autres données partagent cette connexion 20MBit. Il y a peut-être un routeur ou un commutateur surchargé/défaillant à un moment donné ou l'un des routeurs/commutateurs a des informations DNS incorrectes et ne parvient pas à envoyer les données le long du chemin correct.

0

Avez-vous sélectionnez A, insérez à B, supprimez de A?

Vous pouvez simplement sélectionner A, insérer à B et lorsque vous avez terminé, vous pouvez supprimer

vous pouvez également utiliser le fonctionnement en vrac (sélectionner plusieurs années ProjectID) et les insérer dans l'autre serveur.

Assurez-vous que ProjectID est une clé primaire ou un index cluster ... sinon vous devez trouver une solution qui n'a pas besoin d'être recherchée par ProjectID en premier.

vous pouvez également désactiver si vous ne avez pas besoin toute

enfin, un processus multiple ou multi-thread peut vous donner un certain avantage (sélectionner le serveur A tout l'enregistrement, la sauvegarde, le suivi des modifications et des statistiques sur les deux serveurs lors de l'insertion dans le serveur B).

-3

Vous pouvez également utiliser mysqldump:

mysqldump --complete-insérer --create-options --add-locks --disable-clés --extended-insertion --quick --quote noms de -u $ user --password = $ mot de passe $ base de données | gzip --fast -c> {$ backupPath}/$ base de données $ dateStr.sql.gz

Ensuite, transférez le vidage gzippé sur le réseau et chargez-le dans une nouvelle base de données.

+0

c'est serveur SQL;) – Zyphrax

+0

OMG :) Mais MySQL est également un serveur SQL en général :) Quoi qu'il en soit, le vidage SQL est applicable: http: //sqldump.sourceforge. net/ –

+0

Liste de [bugs_in_sqldump] (http://sourceforge.net/tracker/?group_id=45686&atid=443719 "bugs dans sqldump")! Ajouter plus de briques à une tour qui tombe n'aide généralement pas. [exemple] (http://example.com "title") – Jaywalker

0

Avez-vous vérifié la table sur le serveur b pour voir si vous avez des déclencheurs? Perhpas ils provoquent le ralentissement.

+0

Juste une base de données simple, pas de déclencheurs – Zyphrax

Questions connexes