Woerterbuch optimieren

Von: , Frage gestellt am Mo, 6. Sep 2004

Hallo,

ich habe ein kleines Wörterbuch in einer Access-Datenbank. Ganz simpel: in einer Spalte das englische Wort, in der anderen Spalte das deutsche Wort.

Laeuft auch, allerdings ziemlich langsam. Da der Inhalt jetzt erweitert werden soll muesste man schon auf eine schnellere Loesung kommen.

Ich habe mir einfaeltigerweise folgendes ueberlegt:

zwei Datenbanken mit je 27 Tabellen. Jede Tabelle enthaelt nur die Woerter mit gleichen Anfangsbuchstaben und eine eben Zahlen. Klar?
Da aber die deutschen Woerter dann falsch stehen, muesste die Datenbank nochmal abgelegt werden, jetzt aber nach den deutschen Woetern sortiert.

Dann koennte man bei der Abfrage eines Wortes schnell den ersten Buchstaben abspalten und in der Tabelle nachschauen. Allerdings wird bei der Pflege ein wenig mehr Sorgfalt und Arbeit benoetigt. Ausserdem verdoppelt sich der benoetigte Speicherplatz.

Gibt es noch andere Ideen, wie man so etwas handhaben kann?

Ciao und Danke! Bjoern

14 Antworten zu dieser Frage

  1. Antwort von nach 35 Minuten 0 hilfreich
    Re: Woerterbuch optimieren

    Hallo Bjoern,

    ich kann mir nicht vorstellen, dass Access zu langsam ist. Statt auf 27 Tabellen aufzuteilen, würde ich mir eher einmal Gedanken machen, warum es so langsam ist:

    - Ist die Tabelle richtig indiziert?
    - Ist die SQL-Abfrage suboptimal?
    - Erfolgt der Zugriff über ein Netzwerk oder eine lokale Platte?
    - Ist dein Datenbestand so groß, dass Access generell Probleme bekommt?
    - Wieviele Einträge haben deine Tabellen?
    - ...

    Wenn du mir deine DB postest, werfe ich gerne mal einen Blick darauf!

    Gruß Markus

    • Antwort von nach 5 Stunden 0 hilfreich
      Re^2: Woerterbuch optimieren

      stimme zu!
      die "lösung" mit 27 tabellen ist sicherlich keine praktikable [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

    • Antwort von nach 9 Stunden 0 hilfreich
      Re^2: Woerterbuch optimieren

      Hallo Bjoern,

      ich kann mir nicht vorstellen, dass Access zu langsam ist.
      Statt auf 27 Tabellen aufzuteilen, würde ich mir eher einmal
      Gedanken machen, warum es so langsam ist:

      - Ist die Tabelle richtig indiziert?
      Die Tabelle enthaelt 420.000 Zeilen und drei Spalten: Primaerschluessel, Englisches Wort, deutsche Uebersetzung - Ist die SQL-Abfrage suboptimal?
      Der Zugriff erfolgt ueber Visual Basic mittels ADO und dem SQL Statement "SELECT * FROM LANG WHERE LANG.ENG LIKE 'text%'"

      In der Abfragemaske soll man naemlich einen Buchstaben eingeben und das Programm zeigt automatisch alle Eintraege an, die mit diesem Buchstaben beginnen. Das selbe natuerlich auch, wenn man den zweiten Buchstaben eingibt etc... - Erfolgt der Zugriff über ein Netzwerk oder eine lokale
      Platte?
      Naja, ist noch nicht ganz klar. Das Ganze ist aus einem hausinternen Projekt gewachsen. Erst diente diese kleine Datenbank nur uns fuer unsere taegliche Arbeit und enthielt nur Fachbegriffe aus der Flugzeugtechnik die wir selber eingetragen haben. Jetzt haben wir uns aber drangesetzt und eine Sprachdatenbank eingebunden und moechten das Programm jetzt martreif machen. Wahrscheinlich erfolgt ein lokaler Zugriff - Ist dein Datenbestand so groß, dass Access generell Probleme
      bekommt?
      Nein, die Groesse der Datenbank liegt bei ca. 26MB, also noch weit weg von 2GB - Wieviele Einträge haben deine Tabellen?
      ca. 420.000
      Wenn du mir deine DB postest, werfe ich gerne mal einen Blick
      darauf!
      Wuerd ich gern, geht aber leider nicht =;)

      Kann dir nur die o.g. Angaben machen. Es kommt uebrigens kein Eintrag zweimal vor. Sortiert ist die Datenbank alphabetisch nach den englischen Begriffen.


      Ciao! Bjoern

      • Antwort von nach 17 Stunden 0 hilfreich
        Re^3: Woerterbuch optimieren

        Hallo Bjoern,

        ich kann mir nicht vorstellen, dass Access zu langsam ist.
        Statt auf 27 Tabellen aufzuteilen, würde ich mir eher einmal
        Gedanken machen, warum es so langsam ist:

        - Ist die Tabelle richtig indiziert?
        Die Tabelle enthaelt 420.000 Zeilen und drei Spalten:
        Primaerschluessel, Englisches Wort, deutsche Uebersetzung
        Liegt der Primärschlüssel auf der Spalte LANG.ENG und ist eindeutig?
        Wie sieht es mit LANG.GER (oder wie heisst die Spalte für deutsche Wörter?) aus?
        Der Index ist für den Zugriff enorm wichtig! - Ist die SQL-Abfrage suboptimal?
        Der Zugriff erfolgt ueber Visual Basic mittels ADO und dem SQL
        Statement "SELECT * FROM LANG WHERE LANG.ENG LIKE 'text%'"
        Nachdem zu den Index geprüft hast und sich keine Verbesserung einstellt, kannst du das SQL-Statement umformen: ... WHERE LANG.ENG >= 'text'
        So kannst du in jedem Fall den Index ausnutzen. - Erfolgt der Zugriff über ein Netzwerk oder eine lokale
        Platte?
        Naja, ist noch nicht ganz klar. Das Ganze ist aus einem
        hausinternen Projekt gewachsen. Erst diente diese kleine
        Datenbank nur uns fuer unsere taegliche Arbeit und enthielt
        nur Fachbegriffe aus der Flugzeugtechnik die wir selber
        eingetragen haben. Jetzt haben wir uns aber drangesetzt und
        eine Sprachdatenbank eingebunden und moechten das Programm
        jetzt martreif machen. Wahrscheinlich erfolgt ein lokaler
        Zugriff
        Du musst dir klar machen, das Access immer direkt auf der Datenbasis arbeitet. Alle für die Abfrage benötigten Daten werden temporär auf den Client-Rechner kopiert, ausgewertet und dann wieder verworfen. Wenn der Index ausgenutzt werden kann, dürfte das auch im Netz kein Problem sein. Deine LIKE Abfrage durchsucht aber große Teile des Datenbestands, im Netz dürfte das kritisch werden. Kann dir nur die o.g. Angaben machen. Es kommt uebrigens kein
        Eintrag zweimal vor. Sortiert ist die Datenbank alphabetisch
        nach den englischen Begriffen.
        Klarer Fall für einen unique key ...

        Zudem kannst du für das SQL-Statement eine Abfrage im Access anlegen und abschliessend unter Extras/Analyse/Leistung von Access weitere Optimierungsmaßnahmen identifizieren lassen.

        Gruß Markus

        • Antwort von nach einem Tag 0 hilfreich
          Re^4: Woerterbuch optimieren

          Hallo Markus, Liegt der Primärschlüssel auf der Spalte LANG.ENG und ist
          eindeutig?
          Wie sieht es mit LANG.GER (oder wie heisst die Spalte für
          deutsche Wörter?) aus?
          Der Index ist für den Zugriff enorm wichtig!
          Ich verstehe jetzt nicht, was du meinst.

          Der Primaerschluessel liegt in einer eigenen Spalte und ist somit an LANG.ENG und LANG.DE (so heisst die Spalte fuer deutsche Woerter) gebunden. Ja, er ist eindeutig.
          Der Index ist in Spalte 2, also LANG.ENG definiert. Kann ich einen Index auch auf zwei Spalten derselben Tabelle definieren? Wie funktioniert das dann genau? Nachdem zu den Index geprüft hast und sich keine Verbesserung
          einstellt, kannst du das SQL-Statement umformen: ... WHERE
          LANG.ENG >= 'text'
          So kannst du in jedem Fall den Index ausnutzen.
          Das geht bei der Suche nach englischen Woertern. Was aber bei der suche nach deutschen Woertern? Ich glaube, ich braeuchte mal ein umfangreiches Dokument ueber Indizierung =;) Du musst dir klar machen, das Access immer direkt auf der
          Datenbasis arbeitet. Alle für die Abfrage benötigten Daten
          werden temporär auf den Client-Rechner kopiert, ausgewertet
          und dann wieder verworfen. Wenn der Index ausgenutzt werden
          kann, dürfte das auch im Netz kein Problem sein. Deine LIKE
          Abfrage durchsucht aber große Teile des Datenbestands, im Netz
          dürfte das kritisch werden.
          Die LIKE-Abfrage war damals schnell gemacht. Bisher bestand die Datenbank ja auch aus ca. 1.000 Eimtraegen.


          Ciao! Bjoern

          • Antwort von nach einem Tag 0 hilfreich
            Re^5: Woerterbuch optimieren

            Hallo Markus, Liegt der Primärschlüssel auf der Spalte LANG.ENG und ist
            eindeutig?
            Wie sieht es mit LANG.GER (oder wie heisst die Spalte für
            deutsche Wörter?) aus?
            Der Index ist für den Zugriff enorm wichtig!
            Ich verstehe jetzt nicht, was du meinst.

            Der Primaerschluessel liegt in einer eigenen Spalte und ist
            somit an LANG.ENG und LANG.DE (so heisst die Spalte fuer
            deutsche Woerter) gebunden. Ja, er ist eindeutig.
            Der Index ist in Spalte 2, also LANG.ENG definiert. Kann ich
            einen Index auch auf zwei Spalten derselben Tabelle
            definieren? Wie funktioniert das dann genau?
            Der Primärschlüssel ist ein bestimmer Schlüssel der Tabelle, er sollte stets eindeutig sein. Meisst verwendet man ihn als ID-Wert einer AutoNumber-Spalte.
            Darüber hinaus kannst du in der Tabelle weitere Indizes erstellen, die aus ein oder mehr Feldern bestehen dürfen. Wenn du die Tabelle im Editiermodus öffnest, erscheint in der Toolbar neben dem Symbol für den Primary key ein weiteres Symbol, hier kannst du die Indezes bearbeiten. Nachdem zu den Index geprüft hast und sich keine Verbesserung
            einstellt, kannst du das SQL-Statement umformen: ... WHERE
            LANG.ENG >= 'text'
            So kannst du in jedem Fall den Index ausnutzen.
            Das geht bei der Suche nach englischen Woertern. Was aber bei
            der suche nach deutschen Woertern? Ich glaube, ich braeuchte
            mal ein umfangreiches Dokument ueber Indizierung =;)
            Bevor du das SQL umstellst, solltest du den Index prüfen. Wahrscheinlich ist dann alles viel schneller :o) Die LIKE-Abfrage war damals schnell gemacht. Bisher bestand
            die Datenbank ja auch aus ca. 1.000 Eimtraegen.
            Theoretisch sollte Access bei der LIKE Abfrage den Index (sofern vorhanden) nutzen können. Stände das Wildcard am Anfang, so würde jedes mal die komplette Datenbank durchsucht ...

            Gruß Markus

            • Antwort von nach 2 Tagen 0 hilfreich
              Re^6: Woerterbuch optimieren

              Hallo Markus, Theoretisch sollte Access bei der LIKE Abfrage den Index
              (sofern vorhanden) nutzen können. Stände das Wildcard am
              Anfang, so würde jedes mal die komplette Datenbank durchsucht
              Wie sieht eine solche Indizierung eigentlich aus? Wenn ich das Programm weitergebe ist ja nicht gesagt, dass auf den Zielrechnern auch Access installiert ist, funktioniert dann ueber den Zugriff per ADO auch noch die Indizierung?

              Und, um mal zu was neuem zu kommen: wie sieht es mit der MSDE aus? Wenn ich keine lokale Datenbank im Access-Format nehme, sondern per MSDE auf eine zugreife, wie sieht die Installationsweise aus? Kann ich mit meinem Programm automatisch die MSDE installieren und auch gleichzeitig meine fertgie Datenbank einbinden?

              Fragen ueber Fragen.... =;)


              Ciao! Bjoern

            • Antwort von nach 2 Tagen 0 hilfreich
              Re^7: Woerterbuch optimieren

              Wie sieht eine solche Indizierung eigentlich aus? Wenn ich das
              Programm weitergebe ist ja nicht gesagt, dass auf den
              Zielrechnern auch Access installiert ist, funktioniert dann
              ueber den Zugriff per ADO auch noch die Indizierung?
              Für den Zugriff auf eine mdb-Datei benötigst du in jedem Fall eine Runtime. In deinem Fall ist das die Runtime für ADO, welche dir den Zugriff auf die Tabellen und Views erlaubt.
              Schreibst du eine ganze Anwendung innerhalb von Access, also Formulare und Bericht, so benötigst du die Access-Runtime.

              Zur Indizierung: SQL Datenbanken (auch Access) verwenden einen Optimierer, der sämtliche Abfragen an die vorhandenen Zugriffspfade (=Index) anpasst. Ob der Index existiert oder nicht, merkst du nicht am SQL. Bei deinem Übersetzer hast du nicht darauf achten müssen, existiert kein passender Index so durchsucht Access die komplette Tabelle nach dem gesuchten Key. Ist ein Index vorhanden, so kann Access sofort erkennen, ob der gesuchte Eintrag existiert. Der Unterschied: im ersten Fall vergleicht Access jeden Eintrag der Tabelle (=full table scan) während im zweiten Fall ein sortierter Index in deutlich weniger Schritten direkt zum Ziel führt.

              Stell dir einen Karteikasten mit Adressen vor, die Karten liegen unsortiert vor. Bei der suche nach einer bestimmten Adresse fängst du beim ersten Blatt an und vergleichst die gesucht Adresse, bis du irgenwann das richtige Blatt findest. Im Mittel wirst du die Hälfte der Karten durchsuchen müsssen um einen Treffer zu erlangen.
              Jetzt stell dir vor die Karten sind mit einem Karteireiter alphabetisch sortiert, hier kommst du doch wesentlich schneller zum Ziel. Alles klar? Und, um mal zu was neuem zu kommen: wie sieht es mit der MSDE
              aus? Wenn ich keine lokale Datenbank im Access-Format nehme,
              sondern per MSDE auf eine zugreife, wie sieht die
              Installationsweise aus? Kann ich mit meinem Programm
              automatisch die MSDE installieren und auch gleichzeitig meine
              fertgie Datenbank einbinden?
              Zur MSDE kann ich dir nicht viel sagen. Du wirst sie zusammen mit deinem Programm installieren müssen.

              Gruß Markus

  2. Antwort von nach 46 Minuten 0 hilfreich
    Re: Woerterbuch optimieren

    Warum einfach wenn es auch kompliziert geht? Du hast mir mit Deiner Phantasie mächtig imponiert! Spass beiseite:
    Ich würde die zweispaltige Tabelle behalten, diese aber in eine Paradox-DB umwandeln und dann die Sache mit DELPHI verwursten. Ein Witz davon ist, dass Du dann INDEXieren kannst, also je einen Index auf deutsch und englisch anlegen. Du wirst staunen, wie rasch die Suche geht.
    Das Programm ist in 1-2 Stunden geschrieben. Wichtig ist, dass Du die Operationen "Hinzufügen/Löschen/Ändern" einbaust. Das geht auch sehr einfach, wenn Du die Sache nicht unnötig aufspaltest.
    Alles klar?
    Erich [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]



Keine passende Antwort gefunden? Jetzt eigene Frage stellen!