2013-10-11 8 views
7

Ho un creato una tabella temporanea utilizzando il motore di memoria come segue:MySQL utente creato tabella temporanea è piena

CREATE TEMPORARY TABLE IF NOT EXISTS some_text (
    id INT DEFAULT 0, 
    string varchar(400) DEFAULT '' 
) engine = memory; 

Quando inserisco righe in esso mi imbatto in un errore di # 1114 perché il tavolo è pieno. Spiega nei documenti mysql che la modifica di tmp_table_size e max_heap_table_size non fa nulla per aumentare la dimensione delle tabelle temporali create dall'utente, che è ciò che penso di avere qui. Come faccio a rendere questo tavolo più grande?

Mi piacerebbe essere in grado di farlo dinamicamente con una chiamata a SET, ma ho provato a impostare tmp_table_size e max_heap_table_size e sono entrambi ben oltre la quantità di dati che mi aspetto in questa tabella. Quindi qualcuno sa come risolvere questo errore su questo tavolo? Grazie a tutti coloro che aiutano.

risposta

9

max_heap_table_size è un limite delle dimensioni di qualsiasi tabella (temporanea o meno) che utilizza il motore di memorizzazione MEMORY. Dovrai aumentare questa opzione di configurazione per memorizzare più dati nella tabella.

+0

Grazie Bill, Lei ha sempre chiaro consulenza MySQL. Come nota. Creo questa tabella come parte di una stored procedure. Non so se posso ancora aumentare responsabilmente 'max_heap_table_size' su tutto il mio DB. È ragionevole usare 'set max_heap_table_size = 33554432' per impostare il limite solo per la mia stored procedure, e quindi potenzialmente ripristinarlo una volta che finisce di funzionare? Grazie ancora. – usumoio

+1

Sì, 'max_heap_table_size' può essere impostato con l'ambito della sessione (consultare http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_max_heap_table_size), in modo che tu possa apportare la modifica con impatto limitato. –

+1

Ricevo il messaggio "pieno" anche dopo aver aumentato 'max_heap_table_size' e' tmp_table_size' in 4G! –

3

In MySQL, per default, le tabelle temporanee create con il motore di memoria possono crescere rapidamente oltre il limite 16 MB di max-heap-tavolo-size e TMP-tavolo-size perché più memoria viene allocata per riga di solito è richiesto. Nell'esempio fornito, VARCHAR (400) allocherà la memoria in base alla dimensione massima della stringa, non alla dimensione effettiva dei dati. Ogni personaggio può richiedere più di 1 byte per la memorizzazione. Supponiamo che ogni riga richieda 2kb, quindi ci vogliono solo 8k righe per raggiungere il limite.

Per molte applicazioni, questo problema può essere risolto utilizzando ROW_FORMAT = DYNAMIC come spiegato qui:

http://www.percona.com/doc/percona-server/5.5/flexibility/improved_memory_engine.html