Visualizzazione risultati 1 fino 6 di 6

Discussione: lost connection error mentre aggiungo una colonna ad una tabella grande

  1. #1
    Guest

    Predefinito lost connection error mentre aggiungo una colonna ad una tabella grande

    Salve,

    Come da oggetto sto provando ad aggiungere una colonna su una tabella abbastanza grande (oltre 4 milioni di record) ed nel farlo ottengo un errore di connection lost. Le tabelle usano InnoDB come engine. Vorrei evitare di scaricare tutto il database, aggiornarlo localmente e ricaricarlo. In alternativa avevo pensato di creare una copia della tabella e per ogni record inserirlo nella nuova tabella ed eliminare il record da quella vecchia. A meno che ci sia un modo per aumentare il tempo di timeout ma su altervista non si ha accesso a molti parametri da quel che vedo.

    Grazie,

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    La connessione viene persa perché aggiungere una colonna ad una tabella esistente implica un gran numero di riscritture, quindi tempi più lunghi di quanto concessi dall'host. In questa risposta su StackOverflow viene proposta una soluzione piuttosto compatta per creare una nuova tabella, aggiungervi la riga, copiare tutti i dati e cancellare quella vecchia.

    Un po' brutale come sistema, ma efficace.

    I suggerimenti che do più spesso:


  3. #3
    Guest

    Predefinito

    Grazie della risposta.

    Purtroppo riscontro lo stesso identico problema. Forse potrei provare a copiare 500k record per volta ed eliminare quei 500k dalla prima tabella. Cosa ne pensi?

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Sì, l'unica è lavorare una porzione alla volta. Quanto piccola dipende prevalentemente da quante chiavi/unique/indici hai nella tabella. Prova con 500k, se non funziona vai a ritroso .

    I suggerimenti che do più spesso:


  5. #5
    Guest

    Predefinito

    Non penso sia la strada per il paradiso, il server mi da timeout anche quando provo semplicemente a fare un order by sulla prima tabella per essere sicuro di copiare e cancellare i record giusti nello stesso ordine.

    Codice:
    SELECT * FROM RECEIPT ORDER BY RECEIPT_NUMBER ASC LIMIT 0, 500000

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Questo è un problema, immagino sia causato dai tempi necessari per ordinare i 4 milioni di record su RECEIPT_NUMBER.
    Quella colonna è una chiave/indice di tipo intero? Se non lo è, ne hai una? Molte operazioni sono più veloci su indici interi.

    Per risparmiare ulteriore tempo potresti usare una clausola WHERE per selezionare solo alcune righe (diciamo sempre ~500k, col criterio di andare a ritroso se è troppo) basandoti su un indice o chiave primaria, e poi ordinarle. Questo ha senso se hai una colonna su cui bene o male riesci a partizionare in maniera semplice, per esempio il classico id numerico chiave primaria auto incrementante:
    Codice:
    SELECT * FROM receipt WHERE id BETWEEN 0 AND 500000 ORDER BY id;
    Se gli id non sono contigui avrai chunk di lunghezza variabile limitata superiormente da 500000, ma questo probabilmente è l'ultimo dei tuoi problemi .

    Edit: pensandoci bene se partizioni in quel modo non hai nemmeno bisogno dell'ordinamento.
    Ultima modifica di mzanella : 20-04-2019 alle ore 09.39.21

    I suggerimenti che do più spesso:


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •