Performance und Indexe

Hallo,

hab gerade mal ein wenig mit Postgre rumgetestet, da ich mit MySQL nicht so gute erfahrungen gemacht habe, vorher habe ich ADS eingesetzt.

Eine frage zu den Indexen:
Kann man nicht 2 gleichnamige indexe anlegen, obwohl sie in 2 unterschiedlichen tabellen sind? Bei mir gibts da jedenfalls einen fehler, das der index schon existiert.

Und jetzt eine zur Performance:
Auf meinen system mit windows XP SP2 512 MB ram und nem Atlon 1,8 hab ich mal das füllen von tabellen getestet. Da bin ich auf 141 sekunden bei 50.000 datensätzen gekommen, in dieser tabelle befinden sich nur strings.
Auf einem serversyste mit windows 2003 server SP1 2 GB ram 2 x 3,4 GHz Xeon und einem SCSI 320 RAID system hat die gleiche prozedur 321 sekunden gedauert. Gleiche installation, noch keine einstellungen vorgenommen. Hab dann mit dem config file rumgespielt aber hab keine änderung feststellen können. Die CPUs sind auch nicht ausgelastet.

Im Vergleich die ADS datenbank ist auf dem server mit 64 sekunden dabei.

Vielleicht hat jemand eine idee :slight_smile:

mfg
OlliT

Also Indicies müssen unterschiedliche Namen haben. Das vorneweg.

Wie genau füllst du deine Tabellen, kannst du mal nen Schnipsel Programmcode zeigen bitte?

Hallo danke für die Antwort, hab das aber zwischenzeitlich auch schon rausgefunden.

Ich habe alles per SQL sprich mit der BED Query komponente gefüllt, nur damit ich vergleichszahlen habe.

Sprich alles über ODBC.

Bahnhof.

Du kannst nicht einfach zwei Datenbanken vergleichen, wenn die Applikation auf die eine Datenbank hin entwickelt wurde. Dabei verliert die andere immer.

Ne ne, das testprogramm wurde ja weder für die eine noch für die andere datenbank entwickelt, das hab ich ja nur zum testen geschrieben.

Mich würde eigentlich nur interessieren welche werte ich in der conf etwas anpassen muss, damit es etwas zügiger läuft, sonst bin ich sehr zufrieden.

hi,

in deinem fall reicht es wahrscheinlich schon aus die “shared_buffers” zu vergrössern :

guck mal hier :

http://www.powerpostgresql.com/PerfList/

ach ja, kennst du google :wink:

cu, stefan

Danke, das hatte ich noch nicht gefunden, aber viele andere sachen :slight_smile:

Hab nochmal ne andere frage, ich glaube die ist aber hier fehl am platz.

Und zwar wollte ich mit der Table komponente von delphi über odbc einen neuen datensatz mit insert einfügen. Habe aber eine tabelle mit autoinc bzw mit ner sequenz angelegt. Die fehlermeldung ist, das die spalte id einen wert brauch, aber eigentlich sollte das doch die sequenz bzw autoinc erledigen, oder? Mit der Query komponente gehts. Kann man sonst die sequenz irgendwie auslesen um den aktuellen wert selbst zu setzen und zu erhöhen wenns nicht anders geht, hab keine lust alle table komponenten durch querys zu ersetzen zumal es nicht überall möglich wäre.

LG
OlliT

Ist die Spalte id vom Typ SERIAL?


mfg

fristo

Moin,

klar ist die serial, hab auch noch zusätzlich was mit trigger probiert, so wie es auf einigen seiten steht, die dann mit der autoinc funktion arbeitet, aber es gibt halt immer den fehler, das der wert fehlt. Ich habe das gefühl, das es nur bei sql funktioniert und nicht bei normalen table inserts.

Gruß
OlliT

Hallo OlliT,

wenn Du Dir den Syntax vom INSERT anschaust, muss Du, wenn keine Spalten definiert sind, immer alle Werte der Spalten angeben. Ansonsten weiß die Datenbank nicht, in welche Spalten die Werte geschrieben werden sollen. Bei Angabe von Spalten werden die nicht definierten Spalten mit dem DEFAULT-Wert initialisiert.



mfg

fristo

Ah, und zum Thema Insert: mehrere (viele) Inserts in eine Transaktion packen beschleunigt die Angelegenheit ungemein.

Hallo ads,

wie darf man das “Ah” verstehen?



mfg

fristo

Das “Ah” darfst du so verstehen, das mir das gerade eingefallen ist. Hatte mich dran erinnert, das der Thread um das “Füllen” von Tabellen geht, wobei dann wohl viele Inserts nacheinander geschrieben werden.

Hallo,

mir ist klar das in die felder wo ich nichts reinschreibe default werde geschrieben werden, aber da sollte ja eigentlich id einen autowert von der datenbank bekommen.
Wie dem auch sei, ich habe mit einem netten herren telefoniert, der mir sagte, das es bei access das selbe problem gibt, da konnte man mit OID Options in den ODBC einstellungen eine einstellung “fake index” setzen, aber leider funktioniert das nicht bei delphi, denn dann will diese oid spalte leider einen wert bekommen.
Grund, delphi will in die tabelle schreiben, merkt dass das feld nicht leer bleiben darf, aber die datenbank selbst hat den datensatz noch gar nicht gesehen… sprich ich muss mir die sequenz auslesen, de nächsten wert nehmen, selbst bei id einfügen und dann in der sequenz den next wert um 1 erhöhen. Aufwendig, aber scheinbar nicht anders möglich.

Hallo,

mir ist klar das in die felder wo ich nichts reinschreibe default werte geschrieben werden, aber da sollte ja eigentlich id einen autowert von der datenbank bekommen.
Wie dem auch sei, ich habe mit einem netten herren telefoniert, der mir sagte, das es bei access das selbe problem gibt, da konnte man mit OID Options in den ODBC einstellungen eine einstellung “fake index” setzen, aber leider funktioniert das nicht bei delphi, denn dann will diese oid spalte leider einen wert bekommen.
Grund, delphi will in die tabelle schreiben, merkt dass das feld nicht leer bleiben darf, aber die datenbank selbst hat den datensatz noch gar nicht gesehen somit konnte die datenbank den wert nicht setzen … sprich ich muss mir die sequenz auslesen, de nächsten wert nehmen, selbst bei id einfügen und dann in der sequenz den next wert um 1 erhöhen. Aufwendig, aber scheinbar nicht anders möglich.