Index in Datenbanken verwenden
-
Hallo,
ich habe eine Datenbankanwendung (MS Access) in Visual Basic .NET geschrieben. Mit dem SQL Befehl Select suche ich Daten aus den Tabellen. Leider ist diese Methode sehr langsam.Die einzelnen Tabellen in der Datebank haben aber auch Indizes.
Wie kann ich auf die Indizes zugreifen oder wo finde ich Infos wie ich das machen muss?
Danke
Evi48
-
hm sollte es nicht glaube bei SQL so Statments wie:
GoTo
GoTop
GoDown
MoveTo
geben, ich weiss das es sowas gibt.
Diese Aneisungen können auch nen bissl anders heissen, von und wegen verschiedener
SQL - Versionen der Hersteller oderso. Aber dort kann man dann direkt ne Indexnummer (Datensatznummer) angeben
gooogle doch mal "SQL GoDown"Also habe länger schon nicht mehr direkt mit SQL gearbeitest, sondern mehr mit
DataSet und OleDbAdaptern
Dort is das nen bisschen überflüssig weil Du mit Kopien der Daten der Datenbank arbeitest die inner DataSet - Instanz liegen!Dort kann man dann schön mit for each oder ner for - Schleife
durchiteriern! Ausserdem ist nen DataSet besser weil es den Datenverkehr im Netz und somit aufm Rechner minimiert.mfg sclearscreen
-
Hier nen schöner Gooogle - Link
http://www.google.de/search?hl=de&as_qdr=all&q=SQL&btnG=Suche&meta=lr%3Dlang_de
-
naja was es in dBASE IV gibt muss es jedenfalls bei anderen Herstellern
nicht unbedingt im SQL - Befehlsstz geben.Dshalb kann es sein das das z.B. ACCESS nicht hat diese Befehle die ich meine.
wie gesagt nen DataSet finde ich da schöner an der Stelle.
In anderen Datenbank un deren Befehlsrefernz stelle ich jedenfalls nach kurzer Recherche im Netzt fest das es da das gibt dort aber nicht!
Im Kern sind die sich nur gleich bei Standarddingen wie Select Delete Update
blablamfg sclearscreen
-
Auf Indizes kannst du nicht zugreifen. Sie dienen der Datenbank, um schneller auf die Daten zugreifen zu können, indem bestimmte Spalten intern in einer unsichtbaren zweiten Tabelle vorsortiert vorliegen. Die Zeilen der vorsortierten Tabelle enthalten keine Daten sondern nur Verweise auf die Zeilen der ursprünglichen Tabelle, daher der Name Index.
Um einen Index zu erstellen, gibst du an, über welche Spalten die unsichtbare Tabelle sortiert werden soll. Jeder neue Index bedeutet eine neue unsichtbare Tabelle (=Kosten für Speicherplatz), außerdem müssen vorhandene Indextabellen bei Datenänderungen stets mitgepflegt und Daten sortiert werden (=Kosten für Ausführungszeit). Daher sollte man mit Indizes sorgfältig umgehen.
In SQL schreibst du z. B. "CREATE [UNIQUE] INDEX {IndexName} ON {TabellenName} (Spalte [,Spalte ...])"
Du kannst das aber auch beim Bearbeiten der Tabelle innerhalb von Access machen. Da gibt's bei den Spalteneigenschaften die Eigenschaft "Indiziert".
HTH,
Axel
-
Hallo und guten Morgen ihr beiden,
danke für eure Tips.Ich habe in Access eine Datenbank angelegt und die Spalten über die ich suchen möchte bereits in Access mit einem Index belegt. Die Tabelle in der ich suche besteht aus sehr vielen Datensätzen. Aus dieser Tabelle suche ich max. 64 mit einem SQL-Befehl "SELECT * FROM " die dann in einer Tabelle im DataSet im Speicher gehalten werden. Die Suche muß ich leider bis zu 100mal in kurzer Zeit durchführen und komme im Moment für 100mal suchen auf eine Zeit von 14 Sekunden. Das ist leider zu lange.
Ich habe mir vorgestellt mit Hilfe des Index die suche zu beschleunigen. Was mir fehlt ist der Zugriff auf die Tabelle über den in Access bereits erstellten Index.
Die Seite in google werde ich mir heute zur Aufgabe machen.
Danke
Evi48
-
Bei Access gibt es einen Menuepunkt Datenbank optimieren. Vielleicht solltest du das mal tuen. An sonsten könntest du die Datenbank wechseln.
-
evi48 schrieb:
Ich habe mir vorgestellt mit Hilfe des Index die suche zu beschleunigen. Was mir fehlt ist der Zugriff auf die Tabelle über den in Access bereits erstellten Index.
Normalerweise, wenn du eine SQL-Abfrage über den WHERE-Teil filterst, geht Access (wie jede andere DB) durch sämtliche Datensätze der Tabelle durch, um geeignete Datensätze zu finden ("Table Scan"). Das dauert natürlich bei vielen Datensätzen unglaublich lange. Wenn jedoch für sämtliche Spalten, die du im WHERE-Teil aufgeführt hast, mindestens ein Index vorliegt (am besten ein einziger Index über alle dort aufgeführten Spalten), kann Access sich diese Mühe sparen, da die Daten ja bereits vorsortiert vorliegen. Dann muss Access nur noch über eine z. B. binäre Suche einen in Frage kommenden Datensatz finden und kann dann in der Tabelle so lange nach "oben/unten" gehen, bis der erste unpassende Datensatz kommt ("Index Seek").
Du musst nichts anderes tun, als einen geeigneten Index anzulegen, der Access beim Suchen der passenden Datensätze hilft. Den Rest macht Access selber. (Wäre ja blöd, wenn Access nicht automatisch die Indexe nutzen würde, die du angegeben hast.)
Du musst definiv einen Geschwindigkeitszuwachs verspüren, sobald du einen passenden Index angelegt hast, sonst hast du 'was falsch gemacht. Wenn dir das Ganze mit Index immer noch zu langsam ist, dann würde ich vorsortieren, d. h. eine temporäre Tabelle anlegen, in der nur die Datensätze für *sämtliche* 100 Abfragen vorkommen. Dass macht es den 100 Abfragen dann erheblich leichter. Ist natürlich ein ziemlicher Aufwand (beim Öffnen des Formulars temporäre Tabelle anlegen oder leeren, INSERT INTO ..., nach Schließen des Formulars alles wieder löschen), hilft aber.