AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Daten am Client sortieren ?
Thema durchsuchen
Ansicht
Themen-Optionen

Daten am Client sortieren ?

Ein Thema von erich.wanker · begonnen am 25. Apr 2013 · letzter Beitrag vom 26. Apr 2013
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#1

Daten am Client sortieren ?

  Alt 25. Apr 2013, 16:37
Datenbank: Firebird • Version: 2.1 • Zugriff über: ZEOS
Hallo Leute..

hab mal eine Grundlegende Frage:

Alle SQL Abfragen, die ein Query sendet gehen (vereinfacht gesehen) meines Verständnisses nach:
Query <-> lokalen fbguard.exe <-> tcp IP port 3050 <-> server fbserver.exe <-> Database.fdb
werden dort bearbeitet und wieder retour geschickt ...

Wenn ich nun beim Client "Sortieren nach" anklicke, hab ich bis dato immer das SQL-Statement verändert und hab vom Server die Daten in der gewünschten reihenfolge bekommen...

Ist es möglich, da man ja die Datenmänge schon lokal am client hat, diese zu sortieren ohne eine erneute SQL Abfrage zu senden .. oder gibts da probleme mit dem Datenbankzeiger ?

Vielen Dank
Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
grl

Registriert seit: 5. Feb 2007
174 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 16:42
Alle SQL Abfragen, die ein Query sendet gehen (vereinfacht gesehen) meines Verständnisses nach:
Query <-> lokalen fbguard.exe <-> tcp IP port 3050 <-> server fbserver.exe <-> Database.fdb
werden dort bearbeitet und wieder retour geschickt ...
Nein.

Query <-> fbclient.dll <-> tcp IP port 3050 <-> server fbserver.exe <-> Database.fdb

Die fbguard.exe bewacht nur den fbserver-Prozess (um ihn z.B. neu zu starten) hat aber mit deinen Daten nix zu tun.

Wenn ich nun beim Client "Sortieren nach" anklicke, hab ich bis dato immer das SQL-Statement verändert und hab vom Server die Daten in der gewünschten reihenfolge bekommen...

Ist es möglich, da man ja die Datenmänge schon lokal am client hat, diese zu sortieren ohne eine erneute SQL Abfrage zu senden .. oder gibts da probleme mit dem Datenbankzeiger ?

Nicht mit "Bordmitteln" der Datenbank. Es gibt z.B. Grid-Komponenten die das können - auch wenn ich sowas noch nie verwendet habe. Ich denke, solche Sortieraufgaben sollten immer direkt via SQL gelöst werden. Gute Komponenten nehmen dir das ab, aber sie tun auch nix anderes als die SQL-Query die beim Server ankommt anzupassen.

Gruß
Luggi
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 17:10
Hallo,
eine Möglichkeit wäre, das Ergebnis der Abfrage in ein TClientDataSet zu packen, dann könntest Du dort filtern und imho auch sortieren.

Grüße
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 17:11
Ist es möglich, da man ja die Datenmänge schon lokal am client hat, diese zu sortieren ohne eine erneute SQL Abfrage zu senden .. oder gibts da probleme mit dem Datenbankzeiger ?
Das Ergebnis einer Query hat mit der liefernden Datenbank nichts mehr zu tun.

Wenn Du auf Grund der erhaltenen Information Modifikationen in der Datenbank vornehmen willst solltest Du dies nach Möglichkeit über die hoffentlich vorhandenen (primary)Keys machen.
etwa so:

Delphi-Quellcode:
select Name,strasse,ort,adrid from name,adresse where ....;

update adresse set strasse='Hinten am wald' where adrid=012345;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
460 Beiträge
 
Delphi XE4 Professional
 
#5

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 18:22
Danke für die Antworten.

Eindeutige ID´s hab ich betreffend update ..

Betreffend "TClientDataSet":

Ein TZQuery (ZEOS Lib) besitzt Eigenschaften:
  • SortedField
  • SortTypes
  • Filter
  • Filtred

Wenn ich nun ein TZQuery.sql erzeuge: (xxxx und yyy werden per code definiert..)
SELECT name, strasse FROM adressen WHERE name = "xxxx" ORDER BY yyy

und die Daten in einem Grid darstelle und nun die Sortierreihenfolge ändern will oder nur eine Teilmenge der (bereits selektierten)Daten darstellen möchte - könnte ich
A. Ein angepasstes SQL Statement abschicken ..
B. Die Funktionen vom TZQuery verwenden ..SortedField, SortTypes, Filter, Filtred ....
Kann man sagen: Solange "nur" Daten betrachtet werden (nicht neu,editieren,löschen..) sollte man die Filter und Sortierreihenfolgen vom TZQuery verwenden .. und wenn neu,editiert oder gelöscht wird sollte man mit SQL Statemnets arbeiten ... ?

Vielen Dank
Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 18:37
Ich arbeite immer mit einer angepassten Query.
(nachdem ich mal Daten so durch die Mühle gedreht hatte, daß kein Bezug mehr zu den Originaldaten herstellbar war)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: Daten am Client sortieren ?

  Alt 25. Apr 2013, 20:33
Ich denke, solche Sortieraufgaben sollten immer direkt via SQL gelöst werden.
Gerade eben nicht. Das RDBMS ist nicht zum Sortieren da, das kostet nämlich CPU. Da die sortierte Darstellung eine Sache des Front-Ends ist, ist eben deses auch dafür zuständig. Wenn das blöde DB-Grid das nicht kann, dann muss vielleicht doch eine andere Komponente her.

Zitat:
Gute Komponenten nehmen dir das ab, aber sie tun auch nix anderes als die SQL-Query die beim Server ankommt anzupassen.
Gute Komponenten verfolgen das von mir skizzierte Ziel und sortieren in-Memory. Das geht eh schneller.

Aber die 'Billig-Variante', also Anpassen der 'ORDER BY' Klausel ist bei Datenbanken, die eh nix zu tun haben, zu verschmerzen.
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#8

AW: Daten am Client sortieren ?

  Alt 26. Apr 2013, 06:47
Hallo Erich,

client-seitiges In-Memory Sorting macht definitiv Sinn. Kommt halt darauf an, wie smart die verwendeten Komponenten (TDataset-Derivat bzw. auch Grid) sind und wie akkurat das Ergebnis sein muss. Reicht es z.b. aus, dass das Sortieren nur für bereits gefetchte Datensätze erfolgen kann, dann braucht man nicht nochmal zum Server gehen. Reicht das nicht aus, dann muss man entweder ein SELECT mit einem geänderten ORDER BY absetzen oder die Komponenten müssen zuerst alle Datensätze zum Client bringen. Gepuffert kann dann auch an unterschiedlichen Stellen werden, so z.b. beim TDataset-Derivat und/oder das Grid selbst kann auch nochmal puffern. Kommt halt darauf an, welche Komponenten zum Einsatz kommen.

Wenn du dir nicht sicher bist, wann/was zum Server geht, dann würde ich dir raten ein Monitoring dazwischen zu schalten. Vielleicht hat ja ZEOS eine Monitoring Komponente, die dir da weiterhelft. Mit Firebird 2.5 kann man das auch mit der Trace API und optional dazu mit http://www.upscene.com/products.fbtm.index.php entkoppelter vom Client und den verwendeten Zugriffskomponenten machen.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#9

AW: Daten am Client sortieren ?

  Alt 26. Apr 2013, 07:56
Wenn man Sortierung auch für sehr große Tabellen anbietet, muss man serverseitig sortieren und(!) sich darauf gefasst machen, das das trotzdem verdammt lange dauern kann. Bei MSSQL ist es mW nach so, das nur die Sortierung nach einer Spalte, auf die ein 'clustered Index' liegt, ohne Zeitverlust funktioniert, bei allen anderen dauert es länger. Und tötlich ist es ohne Index.

Man muss ausprobieren, ob diese Funktionalität dann wirklich Sinn macht.

Aber bei so bis max. 5000 Datensätzen (Pi x Daumen) sollte man die Daten in den Client ziehen und dort sortieren.
  Mit Zitat antworten Zitat
tsteinmaurer

Registriert seit: 8. Sep 2008
Ort: Linz, Österreich
530 Beiträge
 
#10

AW: Daten am Client sortieren ?

  Alt 26. Apr 2013, 08:09
Zitat:
Und tötlich ist es ohne Index
Das würde ich zumindest für Firebird nicht unterschreiben.

Man hat vielleicht mal schnell das sortierte Ergebnis für die ersten Datensätze da, wenn ein Index für die Sortierung verwendet wird, aber so kann das schon mal langsamer als eine Kombination aus Non-Indexed Read + Firebird In-Memory Sort werden, wenn man alle Datensätze abholt.

Der Ausführungsplan gibt darüber Auskunft, ob In-Memory Sort order Indexbasiert und dann sieht man sich am Besten die Ausführungszeit in Kombination mit einem Fetch-All an, oder halt auch gewrappt in etwa:

Code:
SELECT COUNT (*) FROM (
  <eigentliches SELECT mit ORDER BY hier>
)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz