[PHP] import dati

emanuelesalati

Nuovo Utente
23 Ott 2018
8
0
1
Buonasera,
devo importare, con un job, circa 300.000 righe da un database oracle ad sql server, ogni giorno, con codeigniter php.
Potete consigliarmi un metodo per farlo in modo sicuro e veloce.
Attendo vs grazie e buon lavoro a tutti
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Come da specifiche potresti utilizzare l'insert batch nativo di CI:
PHP:
//conviene creare pacchetti da 100 / 200 dati
$this->db->insert_batch('tabella',$dati)

Naturalmente l'array "$dati" deve essere consistente e dovrà essere passato come array di array ossia:
PHP:
$dati=[
['nome'=>'nome'....],
['nome'=>'ciao'],
['cognome'=>'sempre']
];
Questo per farti vedere con non tutti i dati passati devono essere uguali.....

Proverei a creare un metodo ricorsivo per l'elaborazione, 300000 dati non sono tanti, diciamo che avendo due macchine in rete locale si fa abbastanza velocemente il travaso....
In alternativa salvi il tuo SQL in formato idoneo e lo dai in pasto al DB sempre tramite cron!
 

emanuelesalati

Nuovo Utente
23 Ott 2018
8
0
1
Come da specifiche potresti utilizzare l'insert batch nativo di CI:
PHP:
//conviene creare pacchetti da 100 / 200 dati
$this->db->insert_batch('tabella',$dati)

Naturalmente l'array "$dati" deve essere consistente e dovrà essere passato come array di array ossia:
PHP:
$dati=[
['nome'=>'nome'....],
['nome'=>'ciao'],
['cognome'=>'sempre']
];
Questo per farti vedere con non tutti i dati passati devono essere uguali.....

Proverei a creare un metodo ricorsivo per l'elaborazione, 300000 dati non sono tanti, diciamo che avendo due macchine in rete locale si fa abbastanza velocemente il travaso....
In alternativa salvi il tuo SQL in formato idoneo e lo dai in pasto al DB sempre tramite cron!
intanto grazie x la risposta cerco di spiegare meglio:
ho un db in locale dal quale posso prelevare questi record che andranno insertati in piu tabelle swl server su un database in cloud.
Conviene secondo te allora fare la insert secca su una tabella di appoggio di tutte le righe e poi scorrerla e popolare la tabella esatta a seconda del record che trovo; vorrei prevedere anche di andare in update se trovo già il dato!!
attendo tue e grazie ancora
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Non ho capito cosa intendi fare
DB 1 -> dati da 1 tabella
DB 2-> dati dal DB 1 separati in più tabelle?
Se questo fosse il caso sarebbe meglio creare un modello per la gestione dei dati... Il controllo naturalmente deve essere effettuato row2row!

Segnati magari i record sul quale è stata effettuata una modifica così carichi solo le diff.!
 

emanuelesalati

Nuovo Utente
23 Ott 2018
8
0
1
Ciao,
db1 è un cursore che da più tabelle mi crea un set di record con un campo tipo record iniziale di 3 caratteri che mi indica cos’è quella riga e dove andrá. Nel db2 di destinazione è dove, a seconds della riga e sel tipo record, devo fare insert o update. è continuo questo scambio dati tutto il giorno, lo dovro mettere sotto iob e tenerlo sotto controllo.
che ne pensi? è prezioso il vs aiuto!
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
hai verificato la possibilità di collegare il db oracle come linked server nel sql server
e poi usare funzionalità di mirroring proprie di sql server ?
se riesci ad organizzare così, ti affidi a soluzioni native del db
 

emanuelesalati

Nuovo Utente
23 Ott 2018
8
0
1
hai verificato la possibilità di collegare il db oracle come linked server nel sql server
e poi usare funzionalità di mirroring proprie di sql server ?
se riesci ad organizzare così, ti affidi a soluzioni native del db
Buongiorno,
si l'ho valutato ma vorrei farlo senza esporre il db di Oracle quindi una macchina locale che accede al db Oracle e di conseguenza spara i dati su SQL serve che tanto è su server cloud quindi è pubblico.
Avevo pensato di creare n view su Oracle che mi interrogo come servizio da PHP ogni 10 minuti ad esempio ed aggiornare cosi il db su Sql Server, segnandomi cio che ho importato naturalmente.
E' la prima volta che devo fare una cosa del genere quindi sono aperto a tutto.
Grazie
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.

Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi

Come puoi vedere effettuando queste prove l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.

Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.

Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.

Prevedi 2 variabili nel modello di gestione dati:
PHP:
public $data_insert=[];
public $data_update=[];
Effettua tutta la porzione di codice che serve alla fine dividi l'array in pacchetti da 200/250 e inserisci/aggiorni in batch.

Credo sia abbastanza chiaro il concetto.!

Qui il codice (CI) per la verifica dei tempi, crea una tabella con id,text1,text2,text3,text4 e aggiungi nell'autoload l'helper string.
PHP:
private $num_rows=25000;
private $model=['text1','text2','text3','text4'];
private $data=[];
public function __construct() {
   parent::__construct();
   $this->crea_dati_inserimento();
}
public function crea_dati_inserimento(){
   for($i=0;$i<$this->num_rows;$i++){
      foreach ($this->model as $items){
         $this->data[$i][$items]=random_string('alnum',rand(5,20));
      }
   }
}

public function carica_dati_one_row(){
   set_time_limit(0);
   $this->benchmark->mark('code_start');


   foreach ($this->data as $k=>$v){
      $this->db->insert('table1',$v);
   }
   
   /**
    * Inserimento batch
    */
   /*
   $a=array_chunk($this->data,250);
   foreach ($a as $items){
      $this->db->insert_batch('table1',$items);
   }*/

   
   
   $this->benchmark->mark('code_end');

   echo $this->benchmark->elapsed_time('code_start', 'code_end');
}
 

emanuelesalati

Nuovo Utente
23 Ott 2018
8
0
1
Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.

Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi

Come puoi vedere effettuando queste prove l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.

Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.

Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.

Prevedi 2 variabili nel modello di gestione dati:
PHP:
public $data_insert=[];
public $data_update=[];

[QUOTE="macus_adi, post: 205054, member: 35357"]Più che fare una sincronizzazione 1 volta al giorno, opterei per una schedulazione oraria così da evitare qualsiasi blocco.
Ipotizzando una linearità sulla quantità dei dati: 300000 / 12 (ore 07-19) = 25000 record da processare ogni ora.

Provando ad effettuare un piccolo test questi i risultati:
25000 record
1- Inserimento row2row ~ 793.5376 secondi.
2- Inserimento Batch ~ 14.4125 secondi

Come puoi vedere effettuando queste prove  l'inserimento/aggiornamento sul db conviene farlo solo attraverso batch.

Cerco di spiegare il concetto della soluzione più veloce:
1- Hai 3 tabelle che vengono popolate a seconda della tipologia di record.
2- Recuperi tutto il contenuto dal DB1 e inizi a processare i dati
 A questo punto aggiungerei un bit:
1- Memorizzo il dato già presente sul DB2 nel DB1 (vedi sotto)
2- Aggiungo un marcatore per la tipologia di dato nel DB1 "create/update/no_action" (nulla vieta 0,1,2)
3- Effettuo la query nel DB1 solo sui record non processati "create"
4- Effettuo la query nel DB1 solo sui record da aggiornare "update"
5- Una volta effettuate le operazioni necessarie sul DB2 aggiorno tutti (inteso come quelli passati) i dati del DB1 in "no_action" così da evitare di recuperarli al prossimo cron.

Fatto questo sia l'aggiornamento che l'inserimento risulteranno abbastanza veloci.

Prevedi 2 variabili nel modello di gestione dati:
[PHP]
public $data_insert=[];
public $data_update=[];
Effettua tutta la porzione di codice che serve alla fine dividi l'array in pacchetti da 200/250 e inserisci/aggiorni in batch.

Credo sia abbastanza chiaro il concetto.!

Qui il codice (CI) per la verifica dei tempi, crea una tabella con id,text1,text2,text3,text4 e aggiungi nell'autoload l'helper string.
PHP:
private $num_rows=25000;
private $model=['text1','text2','text3','text4'];
private $data=[];
public function __construct() {
   parent::__construct();
   $this->crea_dati_inserimento();
}
public function crea_dati_inserimento(){
   for($i=0;$i<$this->num_rows;$i++){
      foreach ($this->model as $items){
         $this->data[$i][$items]=random_string('alnum',rand(5,20));
      }
   }
}

public function carica_dati_one_row(){
   set_time_limit(0);
   $this->benchmark->mark('code_start');


   foreach ($this->data as $k=>$v){
      $this->db->insert('table1',$v);
   }
  
   /**
    * Inserimento batch
    */
   /*
   $a=array_chunk($this->data,250);
   foreach ($a as $items){
      $this->db->insert_batch('table1',$items);
   }*/

  
  
   $this->benchmark->mark('code_end');

   echo $this->benchmark->elapsed_time('code_start', 'code_end');
}

[/PHP]
Effettua tutta la porzione di codice che serve alla fine dividi l'array in pacchetti da 200/250 e inserisci/aggiorni in batch.

Credo sia abbastanza chiaro il concetto.!

Qui il codice (CI) per la verifica dei tempi, crea una tabella con id,text1,text2,text3,text4 e aggiungi nell'autoload l'helper string.
PHP:
private $num_rows=25000;
private $model=['text1','text2','text3','text4'];
private $data=[];
public function __construct() {
   parent::__construct();
   $this->crea_dati_inserimento();
}
public function crea_dati_inserimento(){
   for($i=0;$i<$this->num_rows;$i++){
      foreach ($this->model as $items){
         $this->data[$i][$items]=random_string('alnum',rand(5,20));
      }
   }
}

public function carica_dati_one_row(){
   set_time_limit(0);
   $this->benchmark->mark('code_start');


   foreach ($this->data as $k=>$v){
      $this->db->insert('table1',$v);
   }
  
   /**
    * Inserimento batch
    */
   /*
   $a=array_chunk($this->data,250);
   foreach ($a as $items){
      $this->db->insert_batch('table1',$items);
   }*/

  
  
   $this->benchmark->mark('code_end');

   echo $this->benchmark->elapsed_time('code_start', 'code_end');
}
[/QUOTE]
Semplicemente perfetto !!
 
Discussioni simili
Autore Titolo Forum Risposte Data
maxnegri cerco programmatore php per un lavoro di integrazione import csv nel mio sito PHP 1
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3

Discussioni simili