Cosa è meglio creare una tabella temporanea separata o inserirla direttamente nella grande tabella?

1

Ho una grande tabella con 1.400.000 righe e ho bisogno di inserire 3000 righe al giorno al suo interno.

Quando inserisco 3000 righe al giorno dovrebbe

  • Prima di tutto inserisco una tabella temporanea che esegui il dump della tabella temporanea nella tabella principale.
  • inserisci direttamente nella grande tabella.

Quale approccio è veloce e perché?

    
posta WebDev 28.03.2011 - 11:29
fonte

5 risposte

7
  1. Le 3000 righe sono inserite in modo uniforme per tutto il giorno? Se è così, questa è una riga inserita ogni 29 secondi, quindi l'inserimento dei dati non è quasi nulla di cui preoccuparsi.

  2. Beneficerai solo di creare una tabella temporanea se quella tabella è in MEMORIA e poi alla fine della giornata scarichi quella nella tabella principale.

Modifica: in riferimento al commento "le righe di dati 3000 vengono inserite contemporaneamente, quindi cosa fare?"

In tal caso basta inserire direttamente nella tabella principale. L'aggiunta a un'altra tabella quindi il dumping di quella tabella è solo un overhead e completamente inutile. Cerca in LOAD DATA se il tuo host la supporta, o fai solo una grande INSERT con LOW_PRIORITY (non raccomandabile in una server ad alto impatto ambientale) o DELAYED (consigliato). Vedi: link

    
risposta data 28.03.2011 - 12:19
fonte
2

la prima opzione è il batching degli inserti è più veloce se gli indici del database supportano gli inserimenti in batch, ma se non lo fanno o se non ci sono indici non fornisce alcun vantaggio

e se hai bisogno che la tabella sia sempre aggiornata e le righe siano inserite nel tempo questa sarebbe una pessima idea, ma se inserisci 3000 righe tutte in una volta in questo modo non sarebbe

    
risposta data 28.03.2011 - 11:50
fonte
2

Quando inserisco grandi quantità di dati, di solito li mando prima su una tabella di staging se hanno bisogno di pulizia o di convalida dei dati. Non riesco a pensare a nessun file che abbia mai ricevuto prima di entrare nel mio database. Se non si prevede di modificare i dati in ogni caso, è possibile eseguire il dump direttamente sul tavolo a meno che non si tratti di così tanti record che è necessario elaborarli in batch per evitare il blocco.

    
risposta data 28.03.2011 - 15:17
fonte
1

In generale, sembra più logico fare l'inserto regolare piuttosto che creare una tabella temporanea e poi a un certo punto del tempo eseguire il dump sulla tabella principale.

Se parliamo della tabella temporanea effettiva creata da MySQL con l'istruzione CREATE TEMPORARY TABLE, è possibile che si verifichino diversi problemi quando si esegue il dump dei dati per l'archiviazione permanente, poiché le tabelle temporanee sono basate sulla sessione (per utente connesso ), quindi potresti riscontrare problemi in caso di disconnessione durante la sessione in modo da perdere dati, quindi l'integrità verrà compromessa.

Inoltre non hai menzionato il motore di archiviazione che stai utilizzando e perché stai considerando di creare un lavoro batch per scaricare i dati nella tabella principale. Senza ulteriori informazioni su quale sia il vero problema, l'inserimento dei dati direttamente nella tabella "principale" sembra una scelta migliore.

    
risposta data 28.03.2011 - 12:30
fonte
0

Ti suggerisco di utilizzare il metodo di inserimento batch per la memorizzazione dei dati in SQL. Suppongo che tu stia avendo un'applicazione frontale che sta interagendo con l'utente e inviando i dati al database per l'archiviazione.

Nella risposta precedente si suggeriva di andare per la modalità batch di inserimento dati e l'altra suggeriva di utilizzare la tabella secondaria per la pulizia o la strutturazione dei dati. Ti suggerisco di strutturare i dati e poi inviarli al database per la memorizzazione. cioè eseguire la parte relativa alla pulizia e alla strutturazione dei dati nella lingua del lato server e utilizzare il database solo per l'inserimento e il recupero dei dati. Più oltre considerando di avere 3000 righe da inserire avrei definito un ciclo for per eseguire il loop dei dati. quindi avrei prima elaborato 500 righe, strutturato e pulito e poi inserito in un inserimento batch.

Nella stessa iterazione avrei elaborato le prossime 500 righe e creato un altro batch per l'inserimento. Quindi, in pratica, mentre le mie 500 righe precedenti vengono inserite nel database, avrei lavorato per inserire le prossime 500 righe. Naturalmente si tratta di una breve panoramica e richiede un adeguato lavoro su di esso per essere implementato.

Vedo che questi thread sono piuttosto vecchi quindi sono in ritardo per la festa. mai meno volevo solo condividere la mia opinione. Rispondi con come hai risolto il problema. Ci sarà utile in futuro.

Saluti

    
risposta data 08.06.2013 - 16:50
fonte

Leggi altre domande sui tag