Zum Inhalt springen

Performance verbessern?


Audi

Empfohlene Beiträge

Hallo,

hoffe Ihr könnt mir helfen.

Ich habe eine Access DB mit 4Tabellen mit insgesammt ca. 10000 Datensätzen.

Ich greife mit C# auf die Access DB zu und suche überall in den Tabellen nach einem bestimmten Begriff/Teilbegriff z.B USB, dann werden alle Artikel mit USB in meinem Programm angezeigt.

Mein Problem ist dass es so lange dauert, so ca. 7-10sec. also laaaam wie sau :D

Suche nach Verbesserungsvorschlägen die die Such Performance erhöhen.

Hier meine SQL-Abfrage in C#:


string kLagerListSelectStr = "SELECT DISTINCT ARTMENGE.ArtMengeNr, SARTIKEL.ArtName1, SARTIKEL.ArtName2, SARTIKEL.ArtZusInfo1, BESTDOK.BestDocName1,"

+ " ARTLIEF.ArtLiefBestellNr, ARTLIEF.ArtLiefEKPreis, SARTIKEL.ArtZusInfo2, SARTIKEL.ArtZusInfo4, SARTIKEL.ArtMatchcode"

+ " FROM ((ARTMENGE LEFT JOIN ARTLIEF ON ARTMENGE.ArtMengeNr = ARTLIEF.ArtLiefArtNr)"

+ "LEFT JOIN BESTDOK ON ARTLIEF.ArtLiefLiefNr = BESTDOK.BestDocLiefNr) LEFT JOIN SARTIKEL ON ARTMENGE.ArtMengeNr = SARTIKEL.ArtNr"

+ " WHERE ARTMENGE.ArtMengeNr LIKE '%" + suchStr  

+ "%' OR SARTIKEL.ArtName1 LIKE '%" + suchStr

+ "%' OR SARTIKEL.ArtName2 LIKE '%" + suchStr  

+ "%' OR SARTIKEL.ArtZusInfo1 LIKE '%" + suchStr 

+ "%' OR BESTDOK.BestDocName1 LIKE '%" + suchStr 

+ "%' OR ARTLIEF.ArtLiefBestellNr LIKE '%" + suchStr 

+ "%' OR ARTLIEF.ArtLiefEKPreis LIKE '%" + suchStr 

+ "%' OR SARTIKEL.ArtZusInfo2 LIKE '%" + suchStr 

+ "%' OR SARTIKEL.ArtZusInfo4 LIKE '%" + suchStr 

+ "%' OR SARTIKEL.ArtMatchcode LIKE '%" + suchStr 

+ "%'";


Link zu diesem Kommentar
Auf anderen Seiten teilen

Mein Problem ist dass es so lange dauert, so ca. 7-10sec. also laaaam wie sau
Das verwundert nicht. LIKE-Abfragen sind immer potentielle Kandiaten für länger dauernde Datenbankabfragen. Wenn dann (wie bei dir) noch mehrere zusammenkommen wirds noch schöner.

Bevor wir allerdings in die Details gehen: Existiert ein Index auf den Spalten, die in den JOINs und in der WHERE-Klausel angegeben sind?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das verwundert nicht. LIKE-Abfragen sind immer potentielle Kandiaten für länger dauernde Datenbankabfragen. Wenn dann (wie bei dir) noch mehrere zusammenkommen wirds noch schöner.

Bevor wir allerdings in die Details gehen: Existiert ein Index auf den Spalten, die in den JOINs und in der WHERE-Klausel angegeben sind?

...wobei ein index bei einer LIKE '%xxxx' Abfrage auch nichts nützen wird....

Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

...wobei ein index bei einer LIKE '%xxxx' Abfrage auch nichts nützen wird....
Ich bin kein Datenbankimplementierungsspezialist aber spontan würde ich mal sagen, dass wenn zufällig LIKE direkt mit dem Inhalt matcht erfasst sowas ein Index auch. Aber gut, qualifizierte Kaffeesatzleserei ;-)

was bedeutet ein Index bei einer DB?
Wieso entwickelst du Datenbankanwendungen, wenn du dich nicht einmal mit den Grundlagen auskennst, wie eine Datenbank überhaupt aufgebaut ist?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin kein Datenbankimplementierungsspezialist aber spontan würde ich mal sagen, dass wenn zufällig LIKE direkt mit dem Inhalt matcht erfasst sowas ein Index auch. Aber gut, qualifizierte Kaffeesatzleserei ;-)

Bei einem LIKE 'xyz%' kann ein Index verwendet werden bei einem LIKE '%xyz' nicht (theoretisch kann er schon verwendet werden, nur müsste die DB den ganzen Index durchsuchen und in diesem fall ist ein Full Tablescan deutlich schneller.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin kein Datenbankimplementierungsspezialist aber spontan würde ich mal sagen, dass wenn zufällig LIKE direkt mit dem Inhalt matcht erfasst sowas ein Index auch. Aber gut, qualifizierte Kaffeesatzleserei ;-)

- nein, tut er nicht, wenn % am Anfang des Attributes steht. Wie soll er auch ?

(Beispiel abgeändert...)



Select mit [=]


SELECT a.identity_id

  FROM app_identity a

  WHERE NAME = 'Somename'


Plan :


SELECT STATEMENT  CHOOSE

   Cost: 6  Bytes: 45  Cardinality: 

3  Partition #: 0  		

2 TABLE ACCESS BY INDEX ROWID APP_IDENTITY 

    Cost: 6  Bytes: 45  Cardinality: 

3  Partition #: 0  	

1 INDEX RANGE SCAN IDENTITY_NAME_IDX 

    Cost: 3  Bytes: 0  Cardinality: 3  Partition #: 0 


Select mit LIKE:


SELECT a.identity_id

  FROM app_identity a

  WHERE NAME LIKE '%Somename'


Plan

SELECT STATEMENT  CHOOSE

  Cost: 521  Bytes: 240'870  Cardinality: 16'058  Partition #: 0  	

1 TABLE ACCESS FULL APP_IDENTITY 

  Cost: 521  Bytes: 240'870  Cardinality: 16'058  Partition #: 0  



Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie kann ich z.B das %LIKE umgehen?
Na einfach nicht verwenden.

Eine Möglichkeit wäre ein externer Suchindex, der die Komplexität der Suche aus der Datenbank heraushält. Anbieter dafür gibt's genügend auf dem Markt, allerdings geht einem dann natürlich die Flexibilität verloren sofort auf Änderungen innerhalb der Datenbank zu reagieren.

But nothing comes for free! ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Na einfach nicht verwenden.

Eine Möglichkeit wäre ein externer Suchindex, der die Komplexität der Suche aus der Datenbank heraushält. Anbieter dafür gibt's genügend auf dem Markt, allerdings geht einem dann natürlich die Flexibilität verloren sofort auf Änderungen innerhalb der Datenbank zu reagieren.

But nothing comes for free! ;-)

ja ok, wenn ich die %LIKE Befehle nicht verwende, wie soll ich dann die Artikel mit einem Stichwort suchen?

z.B

Suche: usb

Ergebnis der Suche: USB Kabel, USB HUB, USB irgendwas usw.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Für solche Anforderungen gibt es Volltextindizes. Damit findest Du bei einer Suche nach Meier z.B. auch einen Mayer oder Maier. Ich weiß nicht ob Access das bietet aber das ist eben dann eine der vielen Einschränkungen die man hinnehmen muss, wenn man damit arbeitet.

Wenn es sich nicht nur um eine Übungsaufgabe sondern um ein echtes Projekt handelt, würde ich sowieso empfehlen von Access abstand zu nehmen und direkt auf eine richtige DB umzuschwenken. Beispiele wären hier z.B. PostgreSql oder die kostenlose Oracle XE Edition.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn es sich nicht nur um eine Übungsaufgabe sondern um ein echtes Projekt handelt, würde ich sowieso empfehlen von Access abstand zu nehmen und direkt auf eine richtige DB umzuschwenken. Beispiele wären hier z.B. PostgreSql oder die kostenlose Oracle XE Edition.

Dim

Es ist ein echtes Firmeninternes Projekt, leider haben wir vor Jahren auf Access aufgebaut, können jetzt nicht einfach so mal wecheln...

Die suche soll also in Access über eine C# Oberfläche erfolgen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist ein echtes Firmeninternes Projekt, leider haben wir vor Jahren auf Access aufgebaut, können jetzt nicht einfach so mal wecheln...
Dann muss man sich überlegen was man nun wirklich möchte. Mit viel Brimborium und einer Menge Aufwand bekommt man sicherlich sowas auch in Excel verwurschtelt. Die Frage ist, ob die Anforderung nicht dertig bestimmend ist, dass man mann feststellt "Access ist nicht das richtige Werkzeug hierfür" und es vernünftig neu implementiert.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann muss man sich überlegen was man nun wirklich möchte. Mit viel Brimborium und einer Menge Aufwand bekommt man sicherlich sowas auch in Excel verwurschtelt. Die Frage ist, ob die Anforderung nicht dertig bestimmend ist, dass man mann feststellt "Access ist nicht das richtige Werkzeug hierfür" und es vernünftig neu implementiert.

Habe schon vor einiger Zeit mit meinem Chef darüber gesprochen, er meinte wir wechseln nicht.

Ich bin ja noch Lehrling und da spielt das Thema Geld nicht die entscheidende Rolle, mein Chef sieht die Sache so, wenn es irgendwie möglich ist, die Suche in der Access DB schneller zu machen soll ich es machen, auch wenn es 1Monat dauert, ist egal! wenn es keine möglichkeit gibt, soll ich am Projekt weitermachen und den Suchalgorithmus so belassen wie er ist.

Die Datenbank selbst ist auch nur read only (fürs Programm), spielt das eine Rolle, denke nicht, oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin ja noch Lehrling und da spielt das Thema Geld nicht die entscheidende Rolle, mein Chef sieht die Sache so, wenn es irgendwie möglich ist, die Suche in der Access DB schneller zu machen soll ich es machen, auch wenn es 1Monat dauert, ist egal! wenn es keine möglichkeit gibt, soll ich am Projekt weitermachen und den Suchalgorithmus so belassen wie er ist.
Na dann stell ihm doch die Alternativen vor. Erkläre ihm, was du bereits herausgefunden hast und was für alternative Möglichkeiten es noch gibt. Endlos wird er dich wohl auch nicht daran arbeiten lassen wollen, von daher: Wer begründet, der überzeugt. Leg hm die Tatsachen so auf den Tisch wie sie sind und lass ihn entscheiden, welchen Weg er weitergehen möchte.

Die Datenbank selbst ist auch nur read only (fürs Programm), spielt das eine Rolle, denke nicht, oder?
Nein. Warum sollte es?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...