Langsames Select bei grosser Datenmenge

04/12/2008 - 15:07 von Daniel Boss | Report spam
Hallo zusammen

Zur Zeit bin ich am Umbauen eines Services von Vfp auf C#. Der Zugriff in
C# auf die Foxpro-Tabellen erfolgt durch OleDB.

Das Problem ist dass ich z.B. eine Tabelle mit 300'000 Eintràgen habe und
wenn ich nun via OleDB EINEN bestimmten Eintrag suche, dauert dies bis 10
Sekunden :-( Und das kann ich nicht gebrauchen...(ms-sql hat bein gleichen
statement und Datenmenge 0-15ms)

Mein Statement sieht in etwa so aus :
Select * from MyTable where mytable_person = 500 and mytable_mandant = 1 and
mytable_datum = {^2008-12-03}

Die Tabelle MyTable hat ein paar Indexe, unter anderem auch der mit
(person+mandand+datum). Sie hat keinen PrimaryKey (da eine dbf-tabelle und
keine dbc)

Ich habe das Statement auch im Vfp ausgelöst und es dauerte genau gleich
lange, sprich es liegt nicht am OleDB dass es so lange geht.

Wenn ich direkt im Vfp programmiere kann ich mit seek(person+mandant+datum)
die entsprechende Zeile sehr schnell finden, aber ich denke nicht dass ich
derartiges via OleDB machen kann, bzw. abfragen kann.

Gibt es eine alternative wie man die Daten abfragen kann wenn es sich um
viele Eintràge darin handelt?
Oder gibt es sogar die möglichkeit irgendwie mit seek usw zu arbeiten? hat
da jemand schon erfahrungen gemacht?

Wàre sehr froh um paar Tips, denn sonst kann ich das Projekt fallen lassen
und nur noch die Anbindung an MS-SQL anbieten :-(

liebe Grüsse
Dani
 

Lesen sie die antworten

#1 Stefan Wuebbe
04/12/2008 - 15:32 | Warnen spam
Mein Statement sieht in etwa so aus :
Select * from MyTable where mytable_person = 500 and mytable_mandant = 1 and
mytable_datum = {^2008-12-03}

Die Tabelle MyTable hat ein paar Indexe, unter anderem auch der mit
(person+mandand+datum).



Der Letztere nützt zur Optimierung des o.g. Select SQL nichts - du
bràuchtest dafür drei separate, "Index On mytable_person Tag xy",
"Index On mytable_mandant ..." usw.

Sie hat keinen PrimaryKey (da eine dbf-tabelle und keine dbc)



Einen Primàrschlüssel kann / sollte man immer brauchen, unabhàngig
davon, ob DBC oder nicht - sonst funktionieren viele SQL Konstruktionen
nicht oder nur schwer.


Ich habe das Statement auch im Vfp ausgelöst und es dauerte genau gleich lange, sprich
es liegt nicht am OleDB dass es so lange geht.



Siehe oben, und auch Sys(3054) in der Hilfe.


Wenn ich direkt im Vfp programmiere kann ich mit seek(person+mandant+datum) die
entsprechende Zeile sehr schnell finden, aber ich denke nicht dass ich derartiges via
OleDB machen kann, bzw. abfragen kann.



Genau, dein Seek() Ausdruck entspricht genau dem existierenden Index.
Du könntest Seek() in einer Stored Procedure deiner nicht vorhandenen
Datenbank beutzen :-)
In FoxPro ist Seek() noch erheblich schneller als "Rushmore", weil es
den Index Tag direkt genannt bekommt. In C# gibt es nichts vergleichbares.

Rushmore-Optiimierung dagegen muss erst "schauen", ob es in der CDX
passendes zu den jeweiligen einzelnen Where oder For Ausdrücken gibt.
Daher der o.g. unterschiedlich Index-Tag Bedarf.


hth
-Stefan



"Daniel Boss" schrieb im Newsbeitrag
news:
Hallo zusammen

Zur Zeit bin ich am Umbauen eines Services von Vfp auf C#. Der Zugriff in C# auf die
Foxpro-Tabellen erfolgt durch OleDB.

Das Problem ist dass ich z.B. eine Tabelle mit 300'000 Eintràgen habe und wenn ich nun
via OleDB EINEN bestimmten Eintrag suche, dauert dies bis 10 Sekunden :-( Und das kann
ich nicht gebrauchen...(ms-sql hat bein gleichen statement und Datenmenge 0-15ms)

Mein Statement sieht in etwa so aus :
Select * from MyTable where mytable_person = 500 and mytable_mandant = 1 and
mytable_datum = {^2008-12-03}

Die Tabelle MyTable hat ein paar Indexe, unter anderem auch der mit
(person+mandand+datum). Sie hat keinen PrimaryKey (da eine dbf-tabelle und keine dbc)

Ich habe das Statement auch im Vfp ausgelöst und es dauerte genau gleich lange, sprich
es liegt nicht am OleDB dass es so lange geht.

Wenn ich direkt im Vfp programmiere kann ich mit seek(person+mandant+datum) die
entsprechende Zeile sehr schnell finden, aber ich denke nicht dass ich derartiges via
OleDB machen kann, bzw. abfragen kann.

Gibt es eine alternative wie man die Daten abfragen kann wenn es sich um viele Eintràge
darin handelt?
Oder gibt es sogar die möglichkeit irgendwie mit seek usw zu arbeiten? hat da jemand
schon erfahrungen gemacht?

Wàre sehr froh um paar Tips, denn sonst kann ich das Projekt fallen lassen und nur noch
die Anbindung an MS-SQL anbieten :-(

liebe Grüsse
Dani






|\_/| ProLib - programmers liberty --
(.. ) Our MVPs and MCPs make the Fox run
- / See us at www.prolib.de or www.AFPages.de

Ähnliche fragen