Moin Moin.
ich arbeite schon seit ein paar Jahren mit MSSQL Datenbank und hatte bisher keine Probleme.
Vor 2 Jahren habe ich ein paar Tabellen erstellt die von vielen Clients gefüllt werden, so ca. 15.000 Datensätze pro Tag. Am Anfang war es kein Problem, aber nun werden die Abfragen immer langsamer, da anscheinend das dbms eine lineare Suche durchführt. Leider muss nach Text-Spalten gefiltert werden.
Zu den Suchverfahren die intern im DBMS laufen, habe ich leider noch nicht wirklich was vernünftiges finden können. Bisher habe ich lineare Suche, binäre Suche, binärbäume, bei indezierte und nicht indezierten Daten gefunden. Aber was wird wann wo vom dbms eingesetzt? Kann man das beeinflussen? Bei einem indezierten aufsteigenden AutoWert wird es sicherlich die binäre Suche sein oder?
Ich würde da gerne mal durchblicken, nur leider finde ich nicht das richtig oder gebe nicht die richtigen Suchbegriffe ein. Habt ihr evtl. ein paar Webseiten, Bücher, Artikel oder sonst was die ihr empfehlen könnt?
Ich hoffe jemand einen ein Tipp für mich .
Hier hab ich mal noch ein konkretes Beispiel wo ich grade verzweifle:
ich habe 2 Tabellen A, und B. In A werden Belege gespeichert und in B die Belegpositionen. Nun gibt es für jeden Tag einen Beleg A von Typ L und von Typ S, und für jeden gibt es positionen. Dazu kommt, dass jeder Benutzer einen Beleg A von Typ L und S hat.
In A würde stehen:
Ich hab als Schlüssel einen Text genommen, der aus dem User, dem Datum als Zahl und dem Typ besteht. In der Beleg-Tabelle hält es sich das noch in grenzen, aber dann bei den Positionen wirds leider richtig fies .
Jede Position wird durchnummeriert, darum wird im Schlüssel die BelegID nur um die Positionsnummer erweitert, so ist jeder DS eindeutig pro Tag.
Das ganz schlimme sind nund ie Abfragen auf die Tabellen.
In dem Programm, in dem die Tabellen genutzt werden wird ein Datumbereich vom User definiert, z. b. "von 02.01.2012 bis 31.12.2012".
Daraus hab ich bei den Belegen gemacht:
Mittlerweile ist das schon langsam. Nur das Programm geht mit den daraus geholten Daten her und filter die Positionen nach der BelegID:
Das Programm liest die erste Zeile der Belege, dann Abfrage an die Positionen zu diesem Beleg, dann der nächste Beleg usw. Dabei wird wohl bei den Textfeldern eine lineare Suche angewendet, das wohl soviel bedeutet, dass alle Zeilen nach diesem Text durchsucht werden. Bei 100 Belegen würde der also 100mal die Positionen durchsuchen, das bei evtl. 200-250 zugreifenden Clients. Ergebnis: Ladezeit bis zu 30 Sekunden.
Ich suche nun nach etwas Hintergrundwissen für die internen Suchverfahren. Wie soll ich die Tabelle aufbauen, dass das Filtern schneller geht usw.
Momentan werden auch noch 10 Sekunden von der Hardware geschluckt, der Server ist relativ alt. Auf einem neuen Server hab ich das schon getestet und da dauert das suchen nur ca. 20 Sekunden.
Die Beleg-Tabelle habe ich schon angepasst, indem ich für das Datum die Zahl zusätzlich speichere und diese ist immer aufsteigend, so kann ich nach der Zahl suchen. Brachte im Test etwas, aber die Positionen sind die große Bremse .
Wäre super wenn ihr ein paar Tipps hättet
besten Dank!
ich arbeite schon seit ein paar Jahren mit MSSQL Datenbank und hatte bisher keine Probleme.
Vor 2 Jahren habe ich ein paar Tabellen erstellt die von vielen Clients gefüllt werden, so ca. 15.000 Datensätze pro Tag. Am Anfang war es kein Problem, aber nun werden die Abfragen immer langsamer, da anscheinend das dbms eine lineare Suche durchführt. Leider muss nach Text-Spalten gefiltert werden.
Zu den Suchverfahren die intern im DBMS laufen, habe ich leider noch nicht wirklich was vernünftiges finden können. Bisher habe ich lineare Suche, binäre Suche, binärbäume, bei indezierte und nicht indezierten Daten gefunden. Aber was wird wann wo vom dbms eingesetzt? Kann man das beeinflussen? Bei einem indezierten aufsteigenden AutoWert wird es sicherlich die binäre Suche sein oder?
Ich würde da gerne mal durchblicken, nur leider finde ich nicht das richtig oder gebe nicht die richtigen Suchbegriffe ein. Habt ihr evtl. ein paar Webseiten, Bücher, Artikel oder sonst was die ihr empfehlen könnt?
Ich hoffe jemand einen ein Tipp für mich .
Hier hab ich mal noch ein konkretes Beispiel wo ich grade verzweifle:
ich habe 2 Tabellen A, und B. In A werden Belege gespeichert und in B die Belegpositionen. Nun gibt es für jeden Tag einen Beleg A von Typ L und von Typ S, und für jeden gibt es positionen. Dazu kommt, dass jeder Benutzer einen Beleg A von Typ L und S hat.
In A würde stehen:
Code:
BelegID | User |Typ| Datum |
M8A-40910-L | M8A | L | 02.01.2012 |
M8A-40910-S | M8A | S | 02.01.2012 |
Z66-40910-L | Z66 | L | 02.01.2012 |
Z66-40910-S | Z66 | S | 02.01.2012 |
Code:
PosID |BelegID |Typ|PosNr|Datum |weitereDaten
M8A-40910-L-1| M8A-40910-L| L | 1 |02.01.2012|...
M8A-40910-S-1| M8A-40910-S| S | 1 |02.01.2012|...
Z66-40910-L-1| Z66-40910-L| L | 1 |02.01.2012|...
Z66-40910-S-1| Z66-40910-S| S | 1 |02.01.2012|...
Das ganz schlimme sind nund ie Abfragen auf die Tabellen.
In dem Programm, in dem die Tabellen genutzt werden wird ein Datumbereich vom User definiert, z. b. "von 02.01.2012 bis 31.12.2012".
Daraus hab ich bei den Belegen gemacht:
Code:
... WHERE Datum >= '02.01.2012' AND Datum <= '31.12.2012' ....
Code:
... WHERE BelegID = 'M8A-40910-L' ...
-- nächster DS
... WHERE BelegID = 'M8A-40910-S' ...
-- nächster DS
... usw.
Ich suche nun nach etwas Hintergrundwissen für die internen Suchverfahren. Wie soll ich die Tabelle aufbauen, dass das Filtern schneller geht usw.
Momentan werden auch noch 10 Sekunden von der Hardware geschluckt, der Server ist relativ alt. Auf einem neuen Server hab ich das schon getestet und da dauert das suchen nur ca. 20 Sekunden.
Die Beleg-Tabelle habe ich schon angepasst, indem ich für das Datum die Zahl zusätzlich speichere und diese ist immer aufsteigend, so kann ich nach der Zahl suchen. Brachte im Test etwas, aber die Positionen sind die große Bremse .
Wäre super wenn ihr ein paar Tipps hättet
besten Dank!