AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

bessere SQL Abfrage

Ein Thema von LoZe · begonnen am 10. Feb 2021 · letzter Beitrag vom 11. Feb 2021
Antwort Antwort
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#1

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 16:39
die Struktur ist leider vorgegeben und kann nicht geändert werden
aber jetzt läuft es mal um einiges schneller als mit meiner Variante.
Chris
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 19:14
wenn die Ausgangsdaten per Order By über Objekt, Attribut (was besseres scheint es ja nicht zu geben) in eine definierte Reihenfolge gebracht werden können und garantiert immer alle 3 Elemente drin sind, könnte man es mit Windows Functions und Lag/Lead versuchen.
Damit käme man ohne Joins aus und hätte wahrscheinlich nur einen (einzigen) Single Scan über die Table. Das würde sich bei größeren Datenmengen vielleicht lohnen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#3

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 19:18
In einigen DBMS gibt es Features oder nachrüstbare Funktionen für eine POVIT-Abfrage,
in welcher man quasi eine Tabelle drehen kann, also aus Zeilen werden Spalten oder andersrum.

https://modern-sql.com/de/anwendung/pivot
z.B. https://www.postgresql.org/docs/9.1/tablefunc.html

Aber ja, oftmals macht man das wohl über Joins bzw. Sub-Selects oder bissl gewöhnungbedürftiger mit GroupBy+Aggregate+Filter.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Feb 2021 um 19:41 Uhr)
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#4

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 05:41
Ich habe die Struktur ja nur Beispielhaft dargestellt.

es sind 1 Millionen Reihen an Datensätzen,
leider sind nicht immer alle Attribute gegeben,
und bei einigen Attributen (3 Stück) können auch mehrere Reihen da sein.

Ich habe im Moment jeden Tag ein Task laufen der mir die Daten in einer Anderen Tabelle in einem besseres Format Ablegt.
dort sind es dann nur noch ca 250 Reihen mit ca 20 Spalten.

diesen Taks will ich aber beschleunigen da dieser mittlerweile ca. 30 Minuten braucht
Chris
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 08:33
Die Idee von himitsu mit dem PIVOT finde ich auch nicht so schlecht.

Ist der Primärschlüssel auf [Objekt] und [Attribut] ggf. sogar Clustered ?
Evtl. kann man mit einer StoredProcedure/Tablefunction und einen Cursor da als "Tabellescan" schneller durchgehen und die Datensätze zusammenbauen.

Du kannst auch mal prüfen ob ein columnstore Index etwas für dich ist.

Ansonsten bau Trigger auf Tabelle, welche deine LIVE aktualisiert.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott

Geändert von generic (11. Feb 2021 um 08:37 Uhr)
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
40 Beiträge
 
Delphi 12 Athens
 
#6

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 09:45
Ja ich werde mir das mal anschauen, danke mal für die infos
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.361 Beiträge
 
Delphi 12 Athens
 
#7

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 10:22
Klar, wenn sich das SELECT so weit optimieren lässt, das die Daten schnell zusammengesucht sind, dann wäre es schöner. (vielleicht kann man dann sogar die Kopie/Cache lostwerden und direkt)

* Join statt SubSelect
* mit passenden Indize auf allen wichtigen Spalten
* eventuell vorhandene und optimiertere Fertiglösungen nutzen
* ...



Wir hatten sowas früher als Cache in einem DataSnap-Server.
Eine Querykomponente holt die Daten, wenn fertig wurde das schnell in eine MemoryTable kopiert (bzw. dieses Query mit dem Ausgabequery getauscht) und in der zwischenzeit konnten die Clients multithreaded auf die fertige Kopie zugreifen.

Und inzwischen wurde es auf Materialized-Views umgestellt (Postgres),
also auf vorberechnete Views, wo alle paar Minuten unser Server nur noch den Refresh anstößt.
Ist in etwa sowas wie eine virtuelle Tabelle, welche regelmäßig über einen View bzw. StoredProc gefüllt/aktualisiert wird.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 00:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz