Abschliessend im Thread nur noch mal als Hinweis an alle, die viel
importieren und exportieren:
Der Weg über external files bringt bei Firebird erheblich mehr speed
als man denkt.
Die folgende Tabelle mit 20 Feldern, PK und 3 weiteren Indizes und
1.000.000 Datensätze braucht für die Übertragung von drinnen nach
draußen oder von draußen nach drinnen jeweils ca. 1 Minute (der server
hatte bei dem Test nur eine normale Festplatte eingebaut).
Ganz wichtig:
External files definieren geht immer, aber benutzen könnt Ihr die erst,
wenn Ihr in der Firebird.conf den Parameter ExternalFileAccess angepasst
habt und den Firebird Server noch mal neu startet.
Code:
ExternalFileAccess = Restrict C:\export
Bei diesem Beispiel könnt ihr dann im pfad c:\export dateien einlesen oder
auch von firebird erstellen lassen.
Das Feld crlf ist im external file nur definiert, damit man im Texteditor
auch zeilenvorschübe sehen würde, wenn man die denn dort öffnet. Bei allen
weiteren Typen am besten wegen Lesbarkeit auf char(m) umwandeln.
Die Datei sieht dann so aus (Die Boardsoftware schummelt da weitere crlf
rein, ist aber pro datensatz immer eine Zeile).
Code:
1 JENNIFER WOMMACK MARTIN LUTHER KING JR AVE - PITTSFIELD MO 14960 USA 3 JENNIFER.WOMMACK@yahoo.com 1(435)703-9855 4 1389 4408 4192 3925 6/2016 JENNIFER.WOMMACK1000001 567373 36 45000 F
2 MARIA DOHERTY NE NEFF ROAD - ROCKVILLE CT 67979 USA 5 MARIA.DOHERTY@yahoo.com 1(924)920-6861 1 7739 7739 5985 5952 12/2019 MARIA.DOHERTY1000002 726542 31 79000 F
3 RICKEY HUFFMASTER FIRST AVENUE EAST - BERKELEY HEIGHTS MN 12931 USA 11 RICKEY.HUFFMASTER@yahoo.com 1(659)169-7730 2 4666 5413 7709 9617 3/2016 RICKEY.HUFFMASTER1000003 709595 31 41000 M
....
Es rechnet zeitlich sich sehr oft, wenn man Daten für einen Import bekommt, die mit
einem kleinen Delphi oder Lazarus Hilfsprogramm in ein passendes Fixed format zu
konvertieren und danach den Import in die Datenbank auf diesem Weg zu machen.
Beim Export kann man auf einfach
csv Dateien erzeugen, in
dem man die Daten einfach als varchars trimt und mit trenner in
einen char(255) einträgt. Das füllt Firebird dann zwar bis zum Ende mit
Leerzeichen auf, ist aber für jedes
csv Import normalerweise unkritisch
(char(2) für crlf nixht vergessen)
Direkter
csv Import ohne externe Tools via external file ginge zwar auch,
ist aber relativ umständlich, in dem man das als Stored Procedure
auseinanderfrickelt.
Hier der Befehl, um Daten aus der internen Tabelle in die externe zu kopieren
[CODE]
insert into customer_ext_c (ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE,
CREDITCARDTYPE, CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER,crlf)
select ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE, CREDITCARDTYPE,
CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER,'
'
from CUSTOMER
[CODE]
Hier der Befehl, um Daten aus der externen Tabelle in die interne zu kopieren
Code:
insert into customer (ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE,
CREDITCARDTYPE, CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER)
select ID, FIRSTNAME, LASTNAME, ADDRESS1, ADDRESS2, CITY, STATE, ZIP, COUNTRY, REGION, EMAIL, PHONE, CREDITCARDTYPE,
CREDITCARD, CREDITCARDEXPIRATION, USERNAME, PASSWD, AGE, INCOME, GENDER
from customer_ext_c
Metadaten
Code:
/******************************************************************************/
/**** Generated by IBExpert 27.04.2014 20:58:34 ****/
/******************************************************************************/
/******************************************************************************/
/**** Tables ****/
/******************************************************************************/
CREATE TABLE CUSTOMER (
ID NUMERIC(18,0) NOT NULL,
FIRSTNAME VARCHAR(50) NOT NULL,
LASTNAME VARCHAR(50) NOT NULL,
ADDRESS1 VARCHAR(50) NOT NULL,
ADDRESS2 VARCHAR(50),
CITY VARCHAR(50) NOT NULL,
STATE VARCHAR(50),
ZIP INTEGER,
COUNTRY VARCHAR(50) NOT NULL,
REGION SMALLINT NOT NULL,
EMAIL VARCHAR(50),
PHONE VARCHAR(50),
CREDITCARDTYPE SMALLINT NOT NULL,
CREDITCARD VARCHAR(50) NOT NULL,
CREDITCARDEXPIRATION VARCHAR(50) NOT NULL,
USERNAME VARCHAR(50) NOT NULL,
PASSWD VARCHAR(50) NOT NULL,
AGE SMALLINT,
INCOME NUMERIC(18,0),
GENDER VARCHAR(1)
);
CREATE TABLE CUSTOMER_EXT_C EXTERNAL 'C:\EXPORT\CUSTOMER.DAT' (
ID CHAR(18),
FIRSTNAME CHAR(50),
LASTNAME CHAR(50),
ADDRESS1 CHAR(50),
ADDRESS2 CHAR(50),
CITY CHAR(50),
STATE CHAR(50),
ZIP CHAR(18),
COUNTRY CHAR(50),
REGION CHAR(18),
EMAIL CHAR(50),
PHONE CHAR(50),
CREDITCARDTYPE CHAR(18),
CREDITCARD CHAR(50),
CREDITCARDEXPIRATION CHAR(50),
USERNAME CHAR(50),
PASSWD CHAR(50),
AGE CHAR(18),
INCOME CHAR(18),
GENDER CHAR(1),
CRLF CHAR(2)
);
/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/
ALTER TABLE CUSTOMER ADD CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID);
/******************************************************************************/
/**** Indices ****/
/******************************************************************************/
CREATE INDEX CUSTOMER_IDX1 ON CUSTOMER (FIRSTNAME);
CREATE DESCENDING INDEX CUSTOMER_IDX3 ON CUSTOMER (ID);
CREATE UNIQUE INDEX IX_CUSTOMER_USERNAME ON CUSTOMER (USERNAME);