Autor Beitrag
alexschultze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Sa 14.12.02 14:09 
es ist eine Paradox 7
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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:
ausblenden 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
ausblenden Quelltext
1:
locate('feld1';'feld2', 'content1'; 'content2')					

oder eher
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: Sa 14.12.02 23:23 
Hallo,

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 992
Erhaltene Danke: 1

WIN 7
D7 Prof., C#, RAD XE Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Mi 18.12.02 20:23 
während der Bearbeitung ist das doch egal, oder? Da ist doch nur die BDE am werkeln.
LCS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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? :nixweiss: :nut:

Amkopfkratzgruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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 :mrgreen:

Gruss Lothar

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: 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