AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi viele Generatoren auf einmal "holen"
Thema durchsuchen
Ansicht
Themen-Optionen

viele Generatoren auf einmal "holen"

Ein Thema von hoika · begonnen am 14. Feb 2007 · letzter Beitrag vom 15. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

viele Generatoren auf einmal "holen"

  Alt 14. Feb 2007, 19:59
Datenbank: FB • Version: 1.5 • Zugriff über: egal
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
Heiko
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: viele Generatoren auf einmal "holen"

  Alt 14. Feb 2007, 20:32
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. Aber wer weiß.
Gruß
Hansa
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

Re: viele Generatoren auf einmal "holen"

  Alt 14. Feb 2007, 20:39
Zitat von hoika:
Hallo #,


Habe ich hier einen Denkfehler oder klappt das ???


Danke
Heiko
Das sollte klappen. Ich mache es schon ewig und 3 Tage genauso.

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: viele Generatoren auf einmal "holen"

  Alt 14. Feb 2007, 20:41
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.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: viele Generatoren auf einmal "holen"

  Alt 14. Feb 2007, 23:11
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
Heiko
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: viele Generatoren auf einmal "holen"

  Alt 15. Feb 2007, 07:01
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
Heiko
  Mit Zitat antworten Zitat
merlin17

Registriert seit: 15. Dez 2002
Ort: Mittelfranken
980 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: viele Generatoren auf einmal "holen"

  Alt 15. Feb 2007, 07:26
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:
begin
   if (NEW.ID is null) then
         NEW.ID = GEN_ID(G_RUECKFRAGE, 1);
end
thomas
- TeamNevrona cannot respond to questions received via email -
http://rave-notes.blogspot.com
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: viele Generatoren auf einmal "holen"

  Alt 15. Feb 2007, 07:37
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
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: viele Generatoren auf einmal "holen"

  Alt 15. Feb 2007, 07:39
Welche Zugriffsbibliothek verwendest du?
Markus Kinzler
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#10

Re: viele Generatoren auf einmal "holen"

  Alt 15. Feb 2007, 09:26
Hallo Heiko,


Zitat von hoika:
der Punkt ist, das die betreffende Methode ziemlich lahm ist
(15 sec übers Netz)
In meiner Umgebung brauche ich tatsächlich 26 sek für 20.000 IDs!

Zitat von hoika:
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).
Zuerst dachte ich es wäre besser über eine SP die ID einzeln hochzuzählen,
in der Art
SQL-Code:
 while (i <= ANZAHL) DO
 begin
   id = GEN_ID(GEN_TEST, 1);
   suspend;
 end
aber nach einigem Nachdenken, bin ich aber zu dem Schluss gekommen, dass es auch
mit EINER Erhöhung um die gesamte Anzahl gehen muss.
Man kann dann die IDs beginnend mit Generatorwert-Anzahl bis Generatorwert verwenden.

alex
Alexander
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz