alexander2
Goto Top

SQL MAX statt Autowert

Hallo zusammen,

ich habe eine alte Access MDB mit Autowert als Primärschlüssel.
Die will ich nun auf einen SQL Server umziehen und da dann aber nicht mehr mit Autowert (bzw. Autoincrement) arbeiten
sondern selber den PK hochzählen, weil ich den Wert noch für andere Sachen gebrauche.
Jetzt geht aber die performance wahnsinnig in die Knie.
Also eine Tabelle hat sagen wir 2.000.000 Zeilen, früher mit mdb war eine neue Zeile in 1sec. angefügt.
Wenn ich das jetzt mit dem SQL Server mache, hole ich mir ja vorher via "select max(feldid) as maxfeldid from tabelle"
den letzten Wert, addiere 1 drauf und lege dann mit AddNew einen neuen Datensatz an.

Da sind dann schon mal 20-30 sec. drin.

Jetzt meine Frage:

Gibt es etwas performanteres als "select max()" ?

Sollte ich wieder auf Autoincrement gehen ?

Sollte ich über eine Archivlösung nachdenken ? (also von den 2.000.000 Datensätzen werden eigentlich immer nur die letzen 50.000 stark frequentiert, die älteren eher sehr selten)

Schon mal danke für Tipps.

Content-Key: 491082

Url: https://administrator.de/contentid/491082

Printed on: April 23, 2024 at 17:04 o'clock

Member: godlie
godlie Sep 03, 2019 at 11:11:41 (UTC)
Goto Top
Hallo,

lass den Autoincrement seine arbeit als PrimaryKey tun und kümmere dich mal um Indexe in deiner Tabelle.
Dann werden eine Abfragen auch nicht mehr so lange brauchen.

Solltest du schon einen anderen "AutoIncrementWert" brauchen mach eine eigene Spalte.
Member: SeaStorm
SeaStorm Sep 03, 2019 at 11:26:08 (UTC)
Goto Top
Hi

und warum verwendest du jetzt nicht den autoincrement?


Da sind dann schon mal 20-30 sec. drin.
Dann ist entweder dein Code megaschlecht oder du hast keine/schlechte Indexe gesetzt. oder beides

Sollte ich über eine Archivlösung nachdenken ?
Grundsätzlich nie eine schlechte Idee das von Anfang an zu beherzigen. Aber 2Mio Datensätze sind keine Hausnummer für SQL. Das ist ...quasi nichts. Und ein Archiv sauber umzusetzen erfordert idR einiges an Aufwand.

Sollte ich wieder auf Autoincrement gehen ?
Für eine IDENTITY Spalte definitiv.
ggf eine GUID Spalte in betracht ziehen, aber da muss dann schon der Anwendungszweck passen.

Ich tippe hier mangels Informationen aber erst mal darauf, das hier weder entsprechende Indexe gesetzt sind, noch die queries dazu passen.
Member: Alexander2
Alexander2 Sep 03, 2019 at 12:01:57 (UTC)
Goto Top
ok, alles klar, danke für Antwort.
So mach ich das: AutoInc wieder rein und die Indizies schecken.

Aber wie kann ein Code megaschlecht sein, wenn ich nichts anders als mache

"select max(...) as maxid from tab"

da kann ich doch nicht mehr sehr viel optimieren oder ?
Member: SlainteMhath
Solution SlainteMhath Sep 03, 2019 at 13:20:29 (UTC)
Goto Top
Moin,

wenn du schon solche Konstrukte brauchst, dann bau die nicht mit Access, sondern als Stored Procedure auf dem SQL Server. Ein "Select MAX" plus "INSERT INTO" sollte mit guten Indizies (und einer umschliessenden Transaction!) kein Problem sein

lg,
Slainte
Member: Alexander2
Alexander2 Sep 03, 2019 at 14:16:03 (UTC)
Goto Top
ok, das ist doch mal ein Tipp, dann kümmere ich mich mal um "stored procedures". Danke.
Member: SeaStorm
SeaStorm Sep 03, 2019 at 14:16:40 (UTC)
Goto Top
ne wenn es NUR das ist, dann natürlich nicht. aber dann sind deine Indexe ###e bis nicht vorhanden.

Paste hier doch mal das Table Layout