2017-09-27 4 views
0

Je dois synchroniser la base de données MSSQL avec la base de données MYSQL. (> 500 tables et total> 10000000 lignes).
J'ai une solution de travail, mais la performance n'est pas acceptable.
Le goulot d'étranglement peut être ici:Sortie Groovy SQL au format eachRow

Je lis de la base de données MSSQL avec

mssqlDaten = mssql.eachRow (....) { row_data -> ... 

à cause des noms de domaine en évolution dans les différents tableaux que je utilise une boucle pour créer l'instruction d'insertion

str = "insert into current_table values (" 
    for (over all fields from the current table) { 
    str += "'" + row_data[i] + "', " 
    } 
    str += ")" 
    mssql.execute (str) 

Cela peut être le problème pour chaque ligne que je dois passer à travers la boucle.

A quelqu'un une idée pour obtenir les données de ligne directement dans le format (ValueField1, ValueField2, ....). Lorsque j'imprime les données de ligne maintenant, j'obtiens (NameField1: ValueField1, NameField2.ValueField2, ...).

+0

pourrait vous fournir des schémas pour les tables de source et de destination? –

+0

les schémas sont identiques, parce que je crée les tables incluent tous les champs et datatyps avec le code avant que je commence à écrire les données. – Helge

+0

Ne pouvez-vous pas faire quelque chose comme 'insert into mytable select * from mytable', pas sûr comment vous liez vos schémas dans mysql mais dans Oracle vous auriez un lien de base de données de sorte que la mise à jour ressemblerait plus à' insert into mytable select * De dblinked.mytable', vous pouvez interroger toutes les tables à partir de INFORMATION_SCHEMA.TABLES peut-être (https://dev.mysql.com/doc/refman/5.7/en/tables-table.html) puis parcourir chaque et exécuter insert –

Répondre

0

essayer de faire insertion avec lot comme celui-ci:

def table = "MYTABLE" 
//the list of column names could be selected from source database 
def columns = ["A","B","C","D"] 

def sQuery = "select ${columns.join(',')} from $table".toString() 

//build insert query with column list and ? as value placeholders 
//as result we have query like : insert into MYTABLE (A,B,C,D) values (?,?,?,?) 
def iQuery = "insert into $table (${columns.join(',')}) values (${ columns.collect{'?'}.join(',') })".toString() 

def updateCounts = mysql.withBatch(100, iQuery) { ps -> 
    mssql.eachRow (sQuery) { row_data -> 
     def row_array = columns.collect{ colname-> rowdata[colname] } 
     ps.addBatch(row_array) 
    } 
} 
+0

encore le problème avec la complexité des différentes tables. Première table 130 champs, deuxième 20 champs, troisième 400 champs, ... la partie d'insertion je peux remplir avec les noms de tables. Mais je ne sais pas comment je peux mettre les noms de champs à ps.addBatch ([ici je dois placer la chaîne avec les noms de champs ???]). – Helge

+0

@Helge, j'ai ajouté de la dynamique pour la génération de requêtes à l'exemple – daggett