DBAtlas · Atlas d'exploitation des bases de données

Chargement massif de données (CSV / depuis un fichier)

Oracle

-- SQL*Loader (from the shell)
sqlldr app_user/password control=customer.ctl log=load.log

-- Contents of customer.ctl:
-- LOAD DATA INFILE 'customer.csv'
-- INTO TABLE customer FIELDS TERMINATED BY ','
-- (id, name, email)

-- Alternative: with an external table
CREATE TABLE ext_customer (id NUMBER, name VARCHAR2(100))
ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY dir_csv
  ACCESS PARAMETERS (FIELDS TERMINATED BY ',') LOCATION ('customer.csv'));

L'outil le plus courant est SQL*Loader (avec un fichier de contrôle). Pour lire le fichier comme une requête, utilisez une table externe. Pour de gros volumes, le chargement direct path (DIRECT=TRUE) est rapide.

PostgreSQL

-- Server side (file on the server; requires superuser/pg_read_server_files)
COPY customer (id, name, email) FROM '/data/customer.csv' WITH (FORMAT csv, HEADER true);

-- Client side (psql, file on the client)
\copy customer (id, name, email) FROM 'customer.csv' WITH (FORMAT csv, HEADER true)

COPY lit un fichier sur le serveur et nécessite des privilèges ; psql \copy lit un fichier client et ne requiert aucun privilège supplémentaire. C'est le moyen le plus rapide de charger du CSV.

MySQL

-- Server side
LOAD DATA INFILE '/data/customer.csv' INTO TABLE customer
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;

-- From a client file
LOAD DATA LOCAL INFILE 'customer.csv' INTO TABLE customer
FIELDS TERMINATED BY ',' IGNORE 1 LINES;

LOAD DATA INFILE est le moyen le plus rapide de charger en masse. LOCAL lit un fichier client et doit être activé à la fois sur le serveur (local_infile=ON) et sur le client. secure_file_priv restreint le chemin côté serveur.

SQL Server

-- T-SQL BULK INSERT
BULK INSERT customer FROM 'C:\data\customer.csv'
WITH (FORMAT='CSV', FIRSTROW=2, FIELDTERMINATOR=',', ROWTERMINATOR='0x0a');

-- bcp from the shell
bcp mydb.dbo.customer in customer.csv -c -t, -S server -T

BULK INSERT lit le fichier depuis un chemin accessible au compte de service SQL Server. bcp est un outil en ligne de commande ; -c est le mode caractère, -t le séparateur de champs. Pour une vitesse maximale, visez une journalisation minimale avec TABLOCK.

MongoDB

# Import CSV / JSON (from the shell)
mongoimport --db=shop --collection=customer --type=csv --headerline --file=customer.csv

# For a JSON array
mongoimport --db=shop --collection=customer --file=customer.json --jsonArray

mongoimport charge du CSV/TSV/JSON ; --headerline traite la première ligne comme noms de champs. Pour mettre à jour les documents existants, utilisez --mode=upsert --upsertFields. Pour de gros volumes, --numInsertionWorkers accélère le chargement.

Redis

# Fastest: feed commands in protocol format and pipe them
cat commands.txt | redis-cli --pipe

# Example lines in commands.txt:
# SET customer:1 "Alice"
# SET customer:2 "Bob"

Pour le chargement massif, utilisez redis-cli --pipe (mass insert) ; il est très rapide car il envoie les commandes au format du protocole RESP sur une seule connexion. Sinon, les commandes sont regroupées par pipelining.

Elasticsearch

# _bulk API (NDJSON: an action line + a source line per document)
curl -s -H 'Content-Type: application/x-ndjson' -XPOST 'localhost:9200/customer/_bulk' --data-binary @data.ndjson

# Contents of data.ndjson:
# { "index": {} }
# { "id": 1, "name": "Alice" }
# { "index": {} }
# { "id": 2, "name": "Bob" }

L'API _bulk accepte du NDJSON (une ligne d'action + une ligne de données par document ; le fichier doit se terminer par \n). Pour le CSV, utilisez Logstash, Filebeat ou elasticdump. Désactiver refresh_interval pendant le chargement l'accélère.

Ouvrir dans DBAtlas →