Trick 59: Superschnelles Einspeisen   (großer Mengen neuer Daten)

Aufgabe: Schnellstmöglich 20.000 oder mehr Datensätze einbringen.
           
Warum: Es kommt vor, daß man ohne spürbare Beeinträchtigung des
       laufenden Betriebs ganz schnell eine größere Menge neuer Daten
       verfügbar machen will.

Lösung:
Falls es genügt, die neuen Daten zunächst über einen oder zwei ganz
wichtige Schlüssel finden zu können, dann läßt sich etwas machen.
Eine Index-Erneuerung irgendwann später muß dann aber den Index
vervollständigen.
Vorliegen müssen die Daten zuerst einmal als Grunddatei (Typ .ALG)
oder Externdatei (Typ .ADT).
Dann kommen zwei Tricks zur Anwendung:

1. Es wird eine abgemagerte Indexparameterdatei automatisch erstellt,
   die nur die ersten zwei ak-Befehle enthält. Diese wird dann statt
   der normalen geladen, so daß dann neu zu speichernde Daten viel
   schneller indexiert werden können - die Anzahl der Schlüssel ist
   nämlich der Haupt-Zeitfaktor beim Abspeichern.

2. Das Einlesen geschieht zunächst ohne Speichern mit dem z-Wert 0
   beim update-Befehl, dann gelangen die Sätze nur in den Offline-
   speicher. Danach wird mit "save off" gespeichert. Das geht schneller
   als update mit z-Wert 1, denn dabei wartet das Programm jeweils
   0.5 Sekunden zwischen zwei Sätzen.

Als Vorbereitung kann man in den Indexparametern die ersten zwei
ak-Befehle so präparieren, daß damit die entscheidenden Schlüssel
erzeugt werden. In cat.api könnte man etwa direkt unter die Zeile
ak=zz+@
diese neue Zeile einsetzen:
ak=20+G
dann würde der Titelanfang als zweiter der beiden Schlüssel produziert,
der erste wäre der Primärschlüssel (IdNummer in #00).
An drei Stellen, mit *** markiert, muß man eingreifen, bevor man den
FLEX einsetzt:
***1 Sollen es drei oder mehr Schlüssel sein? Bei  z>2  Zahl einsetzen!
         Vielleicht sogar nur 1, vielleicht auch 5.
***2 Den korrekten Dateinamen statt <xyz> einsetzen.
***3 Die Nummer der Datei einsetzen, in welche die neuen Daten sollen

So sieht der FLEX aus, der beide Tricks realisiert:

  ----------------------------------------------------------------
  Vorbereitung: Prüfen, ob neue oder bearb. Saetze im Offline-Speicher
find new
if g0 mes Es gibt noch ungespeicherte neue Saetze, zuerst speichern!;end
find edit
if g0 mes Es gibt noch ungespeicherte bearbeitete Daten, zuerst speichern!;end
  Wenn nicht, dann Offline-Speicher leeren
erase off

  1. Indexparameter abspecken: nur die ersten 2 ak-Zeilen
     alles andere bleibt drin.
var D B "." K1 "pi"
open
if no mes Kann die Indexparameter nicht finden!;end
  Abgespeckte Datei soll mager.api heissen und auf DbDir liegen
var D "mager." K1 "pi"
open x

z=0
:loop
get
if cancel jump lend
  Kommentare und leere Zeilen weglassen
if " " jump loop
if "" jump loop
  ak-Zeile gefunden: zaehlen, bei 3 abbrechen  ***1
if "ak=" z+1;if z>2 jump loop
write
write n
jump loop

:lend
close
close x
  Magere Index-Param.datei ist fertig
  Diese jetzt laden
var "mager"
index p

  2. Update
     Einstellung: alle Saetze nehmen, aber nicht sofort speichern
set u010
  Dateinummer für die neuen Daten (Nummer von 1 bis 255)  ***3
input 129
  Datei <xyz> einspeisen. Statt <xyz> den echten Namen einsetzen! ***2
update <xyz>
  Daten jetzt im Offline-Speicher
  Fragen ob Speichern gewuenscht
yesno Speichern?
if yes save offline
if no var "Speicherung dann auf Wunsch mit 'x save off'" n "Oder Abbruch mit 'x erase off'";mes
sho off
  Jetzt sind die Sätze gespeichert und "mager" indexiert
  Die normalen, fetten Indexparameter wieder laden
var B
index p
  Dateinummer zurücksetzen  ***3
input 1