Esta noticia fue analizado por expertos así se garantiza la exactitud de nuestro contenido.
Solución:
- envuelva todos los INSERT en una transacción, incluso si hay un solo usuario, es mucho más rápido.
- utilizar declaraciones preparadas.
Quieres usar el .import
mando. Por ejemplo:
$ cat demotab.txt
44 92
35 94
43 94
195 49
66 28
135 93
135 91
67 84
135 94
$ echo "create table mytable (col1 int, col2 int);" | sqlite3 foo.sqlite
$ echo ".import demotab.txt mytable" | sqlite3 foo.sqlite
$ sqlite3 foo.sqlite
-- Loading resources from /Users/ramanujan/.sqliterc
SQLite version 3.6.6.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from mytable;
col1 col2
44 92
35 94
43 94
195 49
66 28
135 93
135 91
67 84
135 94
Tenga en cuenta que este comando de carga masiva no es SQL sino una característica personalizada de SQLite. Como tal, tiene una sintaxis extraña porque lo estamos pasando a través de echo
al intérprete de línea de comando interactivo, sqlite3
.
En PostgreSQL el equivalente es COPY FROM
: http://www.postgresql.org/docs/8.1/static/sql-copy.html
En MySQL es LOAD DATA LOCAL INFILE
: http://dev.mysql.com/doc/refman/5.1/en/load-data.html
Una última cosa: recuerda tener cuidado con el valor de .separator
. Ese es un problema muy común cuando se realizan inserciones masivas.
sqlite> .show .separator
echo: off
explain: off
headers: on
mode: list
nullvalue: ""
output: stdout
separator: "t"
width:
Debe configurar explícitamente el separador para que sea un espacio, una tabulación o una coma antes de hacer .import
.
También puede intentar ajustar algunos parámetros para obtener una velocidad adicional. Específicamente, probablemente quieras PRAGMA synchronous = OFF;
.
Si tienes alguna cuestión o capacidad de enriquecer nuestro división te sugerimos ejecutar una acotación y con placer lo estudiaremos.