Code: Alles auswählen
UPDATE fsicher SET __rowversion=__rowversion+1,__keyversion=__rowversion,__order_fskartei_fskartei='23871TEXT @0000554952' WHERE __record=554952;
Frage : geht das nicht "kürzer" ?
Moderator: Moderatoren
Code: Alles auswählen
UPDATE fsicher SET __rowversion=__rowversion+1,__keyversion=__rowversion,__order_fskartei_fskartei='23871TEXT @0000554952' WHERE __record=554952;
Code: Alles auswählen
select * from fsicher where "fkdnr" = '11105' ORDER BY __order_fskartei_fskartei
Code: Alles auswählen
select * from fsicher where "fkdnr" = '11105' ORDER BY fkdnr,fartnr
ok das werde ich mal ausprobieren, danke.bgl hat geschrieben:Noch ein tip: wenn ein Befehl extrem langsam ist, häng mal "EXPLAIN ANALYZE" davor, dann kriegst du statt dem Resultset die Beschreibung, wie es zustande kommt, und wo es hängt.
es geht im Prinzip um den Xbase++ SEEK() Befehl.bgl hat geschrieben:Wobei deine Statements ja eigentlich relativ simpel sind, also weiss ich nicht, wieviel damit zu gewinnen ist.
Code: Alles auswählen
__order_fskartei_fskartei
manchmal ist es schwierig, wie bei prozedural nach OOP, das "denken" wie gewöhnt zu betreiben.georg hat geschrieben:leider komme ich noch einmal mit dem Schlagwort "Paradigmenwechsel".
Code: Alles auswählen
pseudo Code
::pgSetIndex(xTab,{Field1,Field3,Field7},{...} )
::pgOrdSetFocus(xTab, nIndex)
AUGE_OHR hat geschrieben:hi,
was sollte schneller seinoderCode: Alles auswählen
select * from fsicher where "fkdnr" = '11105' ORDER BY __order_fskartei_fskartei
im ersten Fall wäre der "Index" __order_fskartei_fskartei = fkdnr+fartnr, also lägen "hintereinander"Code: Alles auswählen
select * from fsicher where "fkdnr" = '11105' ORDER BY fkdnr,fartnr
im zweiten Fall erfolgt die "Sortierung" erst bei Auswahl.
Nope, es sollen wirklich "alle" Artikel von "einen" Kunden im Result auftauchen.georg hat geschrieben:Deine Abfrage sieht danach aus, als erwartest Du nur einen Satz im Ergebnis.
hehe ... und genau "da" ergab sich ja das "Problem" mit dem "Index".georg hat geschrieben:Aber genau diese "Spielereien" sind es, die für mich - neben anderen Gründen - den Umstieg auf SQL so attraktiv machen: ein Klick auf den Spaltenkopf, und schon wird die Anzeige "anders herum" sortiert und angezeigt.
Code: Alles auswählen
oHeader:lbClick := {|aPos,uNil,oSelf| ::SortOrder(aPos,oSelf) } )
Code: Alles auswählen
METHOD JimBrowse:SortOrder(aPos, oSelf)
LOCAL aRowCol := oSelf:cellFromPos(aPos)
LOCAL i := 1
LOCAL iMax := LEN( ::_aBroFields )
LOCAL cOrder := ""
LOCAL cWhere := ""
FOR i := 1 TO iMax
IF i = aRowCol[2]
::oHeader:hiliteCell( 1 , i, .F., .F. )
cOrder := ::_aBroFields[ i ] [ DBS_NAME ]
// cWhere := ::oResult:DataBlock( i )
ELSE
::oHeader:hiliteCell( 1 , i, .T., .F. )
ENDIF
NEXT
// relative Position von __record
::nRememberRecord := ::DbPosition()
::hide()
::ReadNextData(,,, cOrder,,)
::Show()
Code: Alles auswählen
CASE nEvent == xbeE_IndexReady
IF oSQLdialog:oBrowse:nRememberRecord > 0
nOffset := oSQLdialog:oBrowse:DbPosition(oSQLdialog:oBrowse:nRememberRecord
oSQLdialog:oBrowse:nRememberRecord := 0
IF nOffset > 0
cOffSet := LTRIM(STR( nOffset-1 ))
oSQLdialog:oBrowse:hide()
oSQLdialog:oBrowse:ReadNextData(,,,,,cOffSet)
oSQLdialog:oBrowse:Show()
ENDIF
ENDIF
YUP ... deshalb komme ich darauf das ein "re-positionieren" von uns "manuell" durchgeführt werden müsste.georg hat geschrieben:bei Xbase bleibst Du im gleichen "result set", wenn Du einen ordSetFocus() durchführst, bei SQL erzeugst Du ein neues "result set", mit dem Ergebnis, dass die alte Position nicht mehr relevant ist.
und bei nOutRec stimmt hier was nicht ...Send Query :
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'
9 Tables:
customer
parts
artikel
fsicher
umsatz
abzu
select Table : umsatz AS a
Send Query :
SELECT * FROM umsatz AS a LIMIT 1
Answer Result :
urechnr C 9
ukdname C 25
umsatzges N 9
urechdat C 8
ok C 1
tz N 1
ma N 1
ukdnr C 5
uplz C 5
uort C 25
uvierzehn N 9
umvierzehn N 8
usieben N 9
umsieben N 8
umgesamt N 9
uskonto N 6
usgesamt N 8
ubezahlt N 10
ugutschrif N 10
ustand N 10
ubezadat D 10
isdatev C 1
27 Fields :
used Fields for Column :
a.urechnr
a.ukdname
a.umsatzges
a.urechdat
a.ok
a.tz
a.ma
a.ukdnr
a.uplz
a.uort
a.uvierzehn
a.umvierzehn
a.usieben
a.umsieben
a.umgesamt
a.uskonto
a.usgesamt
a.ubezahlt
a.ugutschrif
a.ustand
a.ubezadat
a.isdatev
a.__deleted
a.__record
a.__rowversion
a.__keyversion
a.__lock_owner
now browse
SELECT a.urechnr,a.ukdname,a.umsatzges,a.urechdat,a.ok,a.tz,a.ma,a.ukdnr,a.uplz,a.uort,a.uvierzehn,a.umvierzehn,a.usieben,a.umsieben,a.umgesamt,a.uskonto,a.usgesamt,a.ubezahlt,a.ugutschrif,a.ustand,a.ubezadat,a.isdatev,a.__deleted,a.__record,a.__rowversion,a.__keyversion,a.__lock_owner FROM umsatz AS a
Start request :07:49:34
finsh request after 0.02 Sec.
create Browse :07:49:34
read Data ...
Browse Pop-Up after 0.08 Sec.
SELECT a.urechnr,a.ukdname,a.umsatzges,a.urechdat,a.ok,a.tz,a.ma,a.ukdnr,a.uplz,a.uort,a.uvierzehn,a.umvierzehn,a.usieben,a.umsieben,a.umgesamt,a.uskonto,a.usgesamt,a.ubezahlt,a.ugutschrif,a.ustand,a.ubezadat,a.isdatev,a.__deleted,a.__record,a.__rowversion,a.__keyversion,a.__lock_owner FROM umsatz AS a ORDER BY __record LIMIT 25 OFFSET 0
find Last Record in SERIAL Field __record
Query : SELECT * FROM umsatz___record_seq
Table have 9 Property 0.01 Sec.
sequence_name : umsatz___record_seq
last_value : 44718
increment_by : 1
max_value : 9223372036854775807
min_value : 1
cache_value : 1
log_cnt : 31
is_cycled : f
is_called : t
Table have 44718 entry 0.00 Sec.
Index : SELECT __record FROM umsatz AS a ORDER BY __record
create Index 44718 Records 2.48 Sec.
nIsRec 13 field 00-01010 nOutRec 13
sort ORDER BY urechnr WHERE 00-01010 Recno 13
find Last Record in SERIAL Field __record
Query : SELECT * FROM umsatz___record_seq
SELECT a.urechnr,a.ukdname,a.umsatzges,a.urechdat,a.ok,a.tz,a.ma,a.ukdnr,a.uplz,a.uort,a.uvierzehn,a.umvierzehn,a.usieben,a.umsieben,a.umgesamt,a.uskonto,a.usgesamt,a.ubezahlt,a.ugutschrif,a.ustand,a.ubezadat,a.isdatev,a.__deleted,a.__record,a.__rowversion,a.__keyversion,a.__lock_owner FROM umsatz AS a ORDER BY urechnr LIMIT 25 OFFSET 0
Table have 9 Property 0.00 Sec.
sequence_name : umsatz___record_seq
last_value : 44718
increment_by : 1
max_value : 9223372036854775807
min_value : 1
cache_value : 1
log_cnt : 31
is_cycled : f
is_called : t
Table have 44718 entry 0.00 Sec.
Index : SELECT __record FROM umsatz AS a ORDER BY urechnr
create Index 44718 Records 2.50 Sec.
nInRec 13 nPosRec 3335 nOutRec 13
nIsRec 13 field 00-01010 nOutRec 13
sort ORDER BY ukdname WHERE Harms Food Trading Recno 13
find Last Record in SERIAL Field __record
Query : SELECT * FROM umsatz___record_seq
SELECT a.urechnr,a.ukdname,a.umsatzges,a.urechdat,a.ok,a.tz,a.ma,a.ukdnr,a.uplz,a.uort,a.uvierzehn,a.umvierzehn,a.usieben,a.umsieben,a.umgesamt,a.uskonto,a.usgesamt,a.ubezahlt,a.ugutschrif,a.ustand,a.ubezadat,a.isdatev,a.__deleted,a.__record,a.__rowversion,a.__keyversion,a.__lock_owner FROM umsatz AS a ORDER BY ukdname LIMIT 25 OFFSET 12
Table have 9 Property 0.00 Sec.
sequence_name : umsatz___record_seq
last_value : 44718
increment_by : 1
max_value : 9223372036854775807
min_value : 1
cache_value : 1
log_cnt : 31
is_cycled : f
is_called : t
Table have 44718 entry 0.00 Sec.
Index : SELECT __record FROM umsatz AS a ORDER BY ukdname
create Index 44718 Records 3.64 Sec.
nInRec 13 nPosRec 3335 nOutRec 17514
nIsRec 13 field 00-01010 nOutRec 13
sort ORDER BY umsatzges WHERE 1991.38 Recno 13
find Last Record in SERIAL Field __record
Query : SELECT * FROM umsatz___record_seq
Table have 9 Property 0.00 Sec.
sequence_name : umsatz___record_seq
last_value : 44718
increment_by : 1
max_value : 9223372036854775807
min_value : 1
SELECT a.urechnr,a.ukdname,a.umsatzges,a.urechdat,a.ok,a.tz,a.ma,a.ukdnr,a.uplz,a.uort,a.uvierzehn,a.umvierzehn,a.usieben,a.umsieben,a.umgesamt,a.uskonto,a.usgesamt,a.ubezahlt,a.ugutschrif,a.ustand,a.ubezadat,a.isdatev,a.__deleted,a.__record,a.__rowversion,a.__keyversion,a.__lock_owner FROM umsatz AS a ORDER BY umsatzges LIMIT 25 OFFSET 17513
cache_value : 1
log_cnt : 31
is_cycled : f
is_called : t
Table have 44718 entry 0.00 Sec.
Index : SELECT __record FROM umsatz AS a ORDER BY umsatzges
create Index 44718 Records 2.67 Sec.
nInRec 13 nPosRec 3335 nOutRec 40023
Code: Alles auswählen
::lisValidIndex := .T.
RETURN ::aIndex
Code: Alles auswählen
EXPLAIN SELECT * FROM Fsicher -> _pkey -> __record
ok das werde ich überprüfen.bgl hat geschrieben:Zunaechst: fuer realistische Ergebnisse in PostgreSQL empfehle ich nicht EXPLAIN, sondern EXPLAIN ANALYZE (wenigstens bei SELECT abfragen), da hier nicht nur geschaetzt wird, sondern der Befehl tatsaechlich ausgefuehrt wird, um das Ergebnis zu pruefen.
ok das war wieder von mir falsch ausgedrückt.bgl hat geschrieben:Dann: ein unsortierter SELECT *benutzt* den PRIMARY KEY fuer das ein- oder andere, er wird aber nicht nach dem PRIMARY KEY sortiert.
Und für den PRIMARY KEY wird immer ein entsprechender Index ganz automatisch angelegt.
Code: Alles auswählen
SELECT DataDic_Net_Use("meineTable")
So ganz kapiere ich gerade nicht, *was* du in die STORED FUNCTION stopfen willst, fuerchte aber, dass wenn du da einen Wrapper fuer die Standard-Variante deines SELECT bauen willst, du an ein paar boese Stolpersteine stossen wirst - und selbst wenn nicht muss ich dich leider warnen: schneller wirds dadurch nicht.AUGE_OHR hat geschrieben:am liebsten würde ich die FUNCTION in eine PostgreSQL "function" packen ...geht so was ?Code: Alles auswählen
SELECT DataDic_Net_Use("meineTable")
in Xbase++ kann ich FUNCTION für Xbase++ Code verwenden aber nicht innerhalb eines SQL Query.bgl hat geschrieben:So ganz kapiere ich gerade nicht, *was* du in die STORED FUNCTION stopfen willst, fuerchte aber, dass wenn du da einen Wrapper fuer die Standard-Variante deines SELECT bauen willst, du an ein paar boese Stolpersteine stossen wirst - und selbst wenn nicht muss ich dich leider warnen: schneller wirds dadurch nicht.
Code: Alles auswählen
_key := "FKDNR+FARTNR"
_key := "FKDNR+FFJAHR+FFMONAT+FFTAG"
_key := "FKDNR+IF(EMPTY(FNUMMER),'J','N')+FFJAHR+FFMONAT+FFTAG"
Code: Alles auswählen
SELECT * FROM MyTable WHERE FKDNR='11105'
Jimmy,AUGE_OHR hat geschrieben:Frage : was passiert wenn ich mehrere "ähnliche Index" habe ?wären INDEXKEY() Ausdrücke ... -> "Index"Code: Alles auswählen
_key := "FKDNR+FARTNR" _key := "FKDNR+FFJAHR+FFMONAT+FFTAG" _key := "FKDNR+IF(EMPTY(FNUMMER),'J','N')+FFJAHR+FFMONAT+FFTAG"
würde je nach "Index" unterschiedliche Ergebnisse produzieren wenn ich ihm nicht sagen kann "welchen" er verwenden soll ... oder ?Code: Alles auswählen
SELECT * FROM MyTable WHERE FKDNR='11105'
Was ist den dass für ein Index? Sollte eigentlich so aussehen:_key := "FKDNR+IF(EMPTY(FNUMMER),'J','N')+FFJAHR+FFMONAT+FFTAG"
Code: Alles auswählen
FKDNR, FNUMMER, FFJAHR, FFMONAT, FFTAG