Importando dados eficientemente no SQLite

Alguém que já tentou carregar um dump de um banco de dados grande no SQLite deve ter percebido como é demorado para a carga ser efetuada.

Para detalhes em como o SQLite trabalha com locking, leia: http://www.sqlite.org/lockingv3.html

Veja abaixo a diferença de tempo para efetuar a importação dos dados de duas maneiras:

$ mknod pipe p
$ (let i=1; while [ $i -le 10000 ]; do echo "INSERT INTO test (a, b, c, d) VALUES (1, 2, 3, 4);"; ((i++)); done) > pipe &[6] 7602
$ time sqlite3 foo.db < pipe
[6]-  Done                    ( let i=1; while [ $i -le 10000 ]; do
    echo "INSERT INTO test (a, b, c, d) VALUES (1, 2, 3, 4);"; ((i++));
done ) > pipe
 
real	0m21.595s
user	0m2.012s
sys	0m2.884s

Acima é o procedimento não utilizando um RESERVED lock. (veja detalhes no link citado acima)

$ mknod pipe p
$ (let i=1; echo "BEGIN;"; while [ $i -le 10000 ]; do echo "INSERT INTO test (a, b, c, d) VALUES (1, 2, 3, 4);"; ((i++)); done; echo "END;") > pipe &
[6] 7593
$ time sqlite3 foo.db < pipe
[6]-  Done                    ( let i=1; echo "BEGIN;"; while [ $i -le 10000 ]; do
    echo "INSERT INTO test (a, b, c, d) VALUES (1, 2, 3, 4);"; ((i++));
done; echo "END;" ) > pipe
real	0m1.386s
user	0m1.356s
sys	0m0.124s

Dessa forma é usando um RESERVED lock. Pelo uso de BEGIN no início do arquivo com os dados a serem importados, e terminando com END (ou COMMIT).

Veja mais informação relacionada ao assunto em: http://www.sqlite.org/wal.html

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options