| Autor |
Beitrag |
alexschultze
      
Beiträge: 317
|
Verfasst: Sa 14.12.02 00:40
hi
ich überlege mir gerade meine Datenbank bisschen leistungsmäßig aufzupeppeln.
Mir kommen da folgende Ideen:
Würde eine Table wesentlich schneller werden wenn ich die daran hängende Datasource ausschalte? Und was sind evtl. Möglicheiten zum optimieren?
Alex
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 14.12.02 03:07
Hi,
in so einem Fall lohnt es sich immer, einen Index auf die Table zu legen.
Gruß
Hansa
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 14.12.02 10:44
moment moment. Das heißt zum mitschreiben?
Also, ich hab in meiner Tabelle alle Felder die häufig sortiert werden indexiert. Ist das richtig so?
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Sa 14.12.02 11:29
Hi
was verwendest du denn für ne Datenbank? Generell ist es richtig, dass ein Index einen Sortier- oder Suchvorgang beschleunigt. Auf der anderen Seite steigt mit jedem Index der Verwaltungsaufwand und die Zeit für das Einfügen oder Aktualisieren der Datensätze. Wenn der Index aus relative wenig unterschiedlichen Werten besteht, erreichst du eher noch das Gegenteil.
Wenn du direkt Tabellenoperationen ausführst, ist es immer besser die DataSource, oder zumindest die Aktualisierung der Steuerelemente abzuschalten.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 14.12.02 14:09
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 14.12.02 22:44
mal nen kleiner Themenwechsel, da ich nicht einen extra Thread aufmachen möchte.
Ich habe vor, mithilfe von Table.locate() nach einem Datensatz mit mehreren Eigenschaften zu suchen. D.h. nach einem Datensatz bei dem ich nach nur einer Eigenschaft suche geht es bisher, aber weiter bin ich nicht. In der Hilfe steht:
| Delphi-Hilfe hat folgendes geschrieben: | Quelltext 1:
| function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual; |
Beschreibung
Diese Methode führt folgende Aktionen durch:
Sie überprüft, ob es sich um eine unidirektionale Datenmenge handelt. Ist dies der Fall, wird eine EDatabaseError-Exception ausgelöst. Sie gibt False zurück, wenn kein übereinstimmender Datensatz gefunden und der aktive Datensatz nicht gewechselt wurde.
Abgeleitete Klassen (mit Ausnahme unidirektionaler Datenmengen) überschreiben Locate, um nach dem Datensatz zu suchen, in dem die in KeyFields übergebenen durch Semikolon getrennten Felder die durch KeyValues angegebenen Werte haben (KeyValues ist eine Variante bzw. ein variantes Array). Mit Options können Suchoptionen festgelegt werden (Groß-/Kleinschreibung und Teilübereinstimmung). Locate gibt True zurück, wenn der gesuchte Datensatz gefunden und aktiviert wurde.
|
Durch Semikolon getrennt, also
Quelltext 1:
| locate('feld1';'feld2', 'content1'; 'content2') |
oder eher
Quelltext 1:
| locate ('feld1;feld2', 'Content1; content2) |
Bin zu müde um da durchzublicken und die Datenbank ist so verstrickt das ich das kaum noch extra testen kann.
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Sa 14.12.02 22:48
table1.Locate('Email';'Nickname', 'dr_greengrinch@yahoo.de';'Greengrinch2', [loCaseInsensitive]);
liefert mir:
> Nicht genügend Parameter
das andere ('1';'2', ...
liefert mir: Variant ist kein Array
Wie geht es sonst?
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Sa 14.12.02 23:23
Hallo,
Quelltext 1:
| if table1.Locate('Email;Nickname', VarArrayOf(['dr_greengrinch@yahoo.de';'Greengrinch2']), [loCaseInsensitive]) then |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: So 15.12.02 12:25
Das geht weder mit Strings noch mit Integern...
>> ] erwartet aber ; gefunden
FEHLER GEFUNDEN! Hab gerade noch mal schnell in meinem Delphibuch geguckt:
locate('ababa;bababa', varArrayof(['baba','bee']), ....
so 
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Mi 18.12.02 15:26
sag mal, zurück zum Topic. Wie ist es, bei ausgeschaltenem Datasource, mit dem Filtering?
Verbraucht das viele Ressourcen, bzw. dauert das? Bei mir zählen Millisekunden!
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 18.12.02 18:36
Hi
das Filtern ist bei Paradox Tabellen leider eine recht zeitaufwendige Aktion. Auch wenn du nach einem Wert in einer Indexspalte filterst dauerts ziemlich lang. Wenn du nach einem Indexwert filtern willst, wäre es wesentlich schneller dort mit SetRange einen Bereich festzulegen. Wenn die Datenbank lokal auf der Platte liegt ist das alles kein Problem, aber im Netzwerk schon.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Mi 18.12.02 19:27
Hallo alexschultze,
eine Datasource benötigt man zum Filtern von Daten nicht. Eine Datasource wird nur dann benötigt, wenn Du Tabellen/Querys u.a. in einem DBGrid anzeigen willst.
Wenn Du Performance-Probleme hast - [zitat] Bei mir zählen Millisekunden[/zitat] - dann stellt sich für mich die Frage, ob dann Paradox die richtige Datenbank ist?
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Mi 18.12.02 20:23
während der Bearbeitung ist das doch egal, oder? Da ist doch nur die BDE am werkeln.
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 19.12.02 09:11
Hi
| alexschultze hat folgendes geschrieben: | | während der Bearbeitung ist das doch egal, oder? Da ist doch nur die BDE am werkeln. |
Was willst du uns damit nun sagen oder fragen?
Amkopfkratzgruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Do 19.12.02 15:32
das war eine Vermutung bzw. Theorie, die ihr widerlegen bzw. bestätigen solltet  ))
Also, meine Frage mit Filter ist nicht beantwortet. Braucht das verhältnismäßig viel Zeit?
Es geht darum, wie ich meine Tabelle aufbaue.
Es gibt also Gruppen (jeweils mit ID'S), in denen unterschiedliche ANzahlen an Einträgen sind.
Nun muss jeder Eintrag zugreifbar sein. D.h. es gibt zwei Möglichkeiten:
Ich filtere die Tabelle nach der Gruppen-ID und arbeite einfach mit first; und next;, oder ich gebe jedem Eintrag ne extra Nummer (1 bis x), auf die er einzeln zugreifen kann. Würde eine extra-Tabelle mit der Anzahl der Einträge in der spezifischen Gruppe erfordern.
Welche von beiden ist rechenzeitlich bei einer Paradox effektiver?
(jetzt ist die Frage komplett ausformuliert*g*)
alex
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 19.12.02 15:50
Hi
| alexschultze hat folgendes geschrieben: | Also, meine Frage mit Filter ist nicht beantwortet. Braucht das verhältnismäßig viel Zeit?
|
Eigentlich schon:
| LCS hat folgendes geschrieben: |
das Filtern ist bei Paradox Tabellen leider eine recht zeitaufwendige Aktion.
|
| alexschultze hat folgendes geschrieben: |
Es geht darum, wie ich meine Tabelle aufbaue.
Es gibt also Gruppen (jeweils mit ID'S), in denen unterschiedliche ANzahlen an Einträgen sind.
|
Hängt davon ab wieviele unterschiedliche Gruppen du hast und wieviele Einträge pro Gruppe vorhanden sind.
Wenn du relativ viele Gruppen hast, die jeweils nur wenige Einträge haben, dann kannst du einen Index auf die Gruppen-ID aufbauen, mit SetRange die Datenmenge auf die Gruppe einschränken und mit First, Next usw. zugreifen.
Wenn du wenige Gruppen, aber viele Einträge pro Gruppe hast, ist der direkte Zugriff über eine extra ID schneller. Dafür brauchst du auch keine zweite Tabelle, denn das könntest du direkt mit SQL abfragen.
| alexschultze hat folgendes geschrieben: |
Nun muss jeder Eintrag zugreifbar sein.
|
Diese Anforderung schliesst die erste Methode eigentlich aus.
| alexschultze hat folgendes geschrieben: |
Welche von beiden ist rechenzeitlich bei einer Paradox effektiver?
|
Wenn die Datenbank lokal ist: Relativ egal, aber direkter Zugriff ist am schnellsten.
Wenn die Datenbank im Netzwerk ist: Direkter Zugriff oder mit SetRange auf einen Schlüsselwert einschränken. Nach Möglichkeit Finger weg von Filter und komplexen SQL-Abfragen.
| alexschultze hat folgendes geschrieben: |
jetzt ist die Frage komplett ausformuliert*g*
|
Ja perfekt. Ich hoffe die Antwort ist ebenso ausreichend
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
alexschultze 
      
Beiträge: 317
|
Verfasst: Do 19.12.02 16:21
ja
also, es sind nach aktuellem Planung 32 (bis zu), und ne beliebige Anzahl Gruppen. Kann ich nett so genau sagen, vermutlich 10-500
|
|