![]() |
Datenbank: FB • Version: 1.5 • Zugriff über: egal
viele Generatoren auf einmal "holen"
Hallo #,
ich speichere Daten immer wie folgt ab, 1. Hole per SP einen neuen Id (Generator) 2. Mache ein Insert mit diesem neuen ID-Wert Bei vielen Datensätzen (~2000) brauchst das aber so seine Zeit, weil 2000mal die SP ausgeführt wird. Jetzt könnte ich mir ja per (vielleicht anderer) SP gleich 10 Werte am Stück belegen, per gen_id(gen_XXX, 10). die 10 nur so als Beispiel. Der Generator wird um 10 erhöht, ich erhalte den neuen Wert und benutze aber auch die 9 Werte davor. Das gen_id ist ja atomar, d.h., intern wird das serialisiert, falls zwei Clients zufällig quasi gleichzeitig die sp aufrufen. Habe ich hier einen Denkfehler oder klappt das ??? Danke Heiko |
Re: viele Generatoren auf einmal "holen"
mehrere Fragen :
1. was heißt lange ? 2000 Datensätze ist nicht ungewöhnlich viel. 2. was genau wird von der SP eingetragen ? Nur die ID oder noch was anderes ? 3. Wie sollen die "9 Werte davor" denn benutzt werden. Du weißt ja hoffentlich, dass die Generatoren als einziges in IB/FB NICHT der Transaktionsseuerung unterliegen. Also nichts mehr mit Rollback + Co. Ehrlich gesagt, zumindest ich habe etwas, das auch nur entfernt in die Richtung der Frage geht, noch nie gesehen. :shock: Aber wer weiß. |
Re: viele Generatoren auf einmal "holen"
Zitat:
GEN_ID(GEN_Autolink,100); stellt einen Nummernraum zur Verfügung. Eine einzelne Function in einer SP sollte nicht durch andere Client unterbrechbar sein. Gruß Peter |
Re: viele Generatoren auf einmal "holen"
Ich würde auch versuchen, den Umfang der SP zu minimieren, bzw. den Flaschenhals zu eliminieren. Die Inkrementierung des Generators durch die Semaphorenfunktion dürfte nicht der Grund sein.
|
Re: viele Generatoren auf einmal "holen"
Hallo,
hanspeter: guutt, dann werd ich das mal probieren zu den anderen ;) Transaktion ist mir egal, es geht um AutoInc-Erzeugung ob da Lücken enstehen, is Brust Das Problem ist, dass es halt 2000 Queries (naja Execute Procedure) übers Netz sind, die ja nicht notwendig sind. Die SP gibt übrigens exakt ein Integer zurück, mit dem dann das "Insert into Table_bla" gemacht wird. Heiko |
Re: viele Generatoren auf einmal "holen"
Hansa,
der Punkt ist, das die betreffende Methode ziemlich lahm ist (15 sec übers Netz) Es werden so etwas 20000 Datensätze in einem Rutsch geschrieben (insert) und ich will die SQL-Zugriffe minimieren. Das Insert bekomme ich nicht weg ;), aber die 20000 GetNewId-SPs dann schon. Ich weiss, wieviele Datensätze geschrieben werden, also erhöhe ich den Generatorwert gleich um 20000 und benutze die jetzt freien Werte 1-20000 (+alter Generatorwert). Heiko |
Re: viele Generatoren auf einmal "holen"
Heiko,
warum holst Du Dir überhaupt den Gen-Wert... erstelle doch einfach einen Trigger (BI) und füge dort die PK-Spalte mit dem GenID; in Deinem Insert entfällt dann die ID-Spalte als Valuewert und IB/FB erledigt dass mehr oder weniger performance irrevelant im Background ...
Delphi-Quellcode:
:-) thomas
begin
if (NEW.ID is null) then NEW.ID = GEN_ID(G_RUECKFRAGE, 1); end |
Re: viele Generatoren auf einmal "holen"
Hallo,
weil ich die neue Id (PK) meist gleich benutzen muss (Master-Detail). Und sage jetzt bitte nicht "select Max(id)" liefert dir doch die neue Id ;) Heiko |
Re: viele Generatoren auf einmal "holen"
Welche Zugriffsbibliothek verwendest du?
|
Re: viele Generatoren auf einmal "holen"
Hallo Heiko,
Zitat:
Zitat:
in der Art
SQL-Code:
aber nach einigem Nachdenken, bin ich aber zu dem Schluss gekommen, dass es auch
while (i <= ANZAHL) DO
begin id = GEN_ID(GEN_TEST, 1); suspend; end mit EINER Erhöhung um die gesamte Anzahl gehen muss. Man kann dann die IDs beginnend mit Generatorwert-Anzahl bis Generatorwert verwenden. alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz