AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken MSSQL/ADO ... speed is everything !!!
Thema durchsuchen
Ansicht
Themen-Optionen

MSSQL/ADO ... speed is everything !!!

Ein Thema von bernhard_LA · begonnen am 17. Jun 2014 · letzter Beitrag vom 18. Jun 2014
Antwort Antwort
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 06:44
Zudem wäre zu Überlegen, ob man PROC als SP oder UDF auf den Server verlagern kann.
Oder als .NET-DLL, was der Performance zuträglich wäre. Allerdings ist das nur in Verbindung mit einem ETL-Prozess sinnvoll, d.h. eine kontinuierliche Verarbeitung.

Die Datenmenge ist zwar noch nicht sonderlich hoch, aber vermutlich wäre das auch etwas für BigData, zumindest, um sich damit mal zu beschäftigen.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.876 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 06:54
Zitat:
Oder als .NET-DLL, was der Performance zuträglich wäre.
Was ja nur eine Implementationsform einer SP wäre
Markus Kinzler
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 07:45
Zitat:
Oder als .NET-DLL, was der Performance zuträglich wäre.
Was ja nur eine Implementationsform einer SP wäre
Eine Stored Procedure ist in SQL geschrieben (und hat limitierte Möglichkeiten zur Auswertung). Eine .NET-DLL nicht. Also ist es nicht 'nur eine Implementationsform einer SP', sondern viel viel mehr.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 08:19
Mein Pseudocode geht wie folgt :

Delphi-Quellcode:
    procedure complete_Process(...);

           mytimer := 0; /// hier beginnt die Zeitmessung

           someInit ();

           MakeSQLStr();

           query.sql.add();
           query.open;

           myTimer.result(1) // hier messe ich die Zeit bis zum laden der Daten in die Query

           query.first;
           for i := 0 to maxrecords do
                begin
                proc (query, ......);
                query.next;
                end;
           ....
            myTimer.result(2); // hier ist die Zeitmessung wie im Graphen ganz oben gezeigt

           finalize



          
           end;


die Zeit an Messpunkt1 ist gegenüber Messpunkt 2 zu vernachlässigen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 08:29
@bernhard_LA

Und der Ansatz ist eben von der Performance her schlecht.
Code:
Daten lesen ---> Queue -+-> Verarbeitungs-Thread 1 -+-> Queue ---> Daten schreiben
                        +-> Verarbeitungs-Thread 2 -+
                        :                           :
                        +-> Verarbeitungs-Thread n -+
Bei der Implementierung ist natürlich darauf zu achten, dass man den Queues eine Maximal-Größe mitgibt, die nicht überschritten werden darf.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (18. Jun 2014 um 08:36 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 08:46
Hier ist der Aufwand (LadeZeit + VerarbeitungsZeit/AnzahlDerThreads). Überlappe LadeZeit und Verarbeitungszeit, dann bist Du bei der optimalen Lösung. Siehe auch Post #2 ( die jetzt nicht unbedingt optimal ist).

Ich würde hierfür einen Workerthreadpool einsetzen und die parallelen Ladejobs von der Serverkonfiguration (output-pipes) abhängig machen.


Jeder der L Lade-Thread lädt N Datensätze und überführt sie in Queue.
Jeder der V Verarbeitungs-Thread nimmt sich 1-M Datensätze und verarbeitet sie.

Der Ladethread wartet, wenn die Queue 'zu voll' ist, d.h. mehr als Q Einträge hat und fängt an, wenn die Queue weniger als P Einträge hat (P<Q).

Nun hat man 6 Stellschrauben (L,V, N,M,P und Q) mit denen sich trefflich optimieren lässt.
Vermutlich ist V die Anzahl der Cores und L die Anzahl der Outputpipes des SQL-Servers (4 waren das, glaube ich).

Je nachdem, wie der Server bzw. die Datenbank konfiguriert ist (Stichwort: Partioning) sind parallele Ladethreads auch überflüssig, weil der Server das eh parallelisiert. Bei 100 Mio DS kann man schon über Tablepartitioning nachdenken.

Geändert von Dejan Vu (18. Jun 2014 um 08:48 Uhr)
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.261 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 08:53
Mal ein Tipp:

nicht alle Datensätze laden!!!!!

Wenn Du was sehen willst, dann suche genau diese Datensätze raus -> WHERE ist hier eine tolle Sache, wenn ein Where da ist dann schränke die Sache mal mit TOP Anweisung ein.

Ich habe in den letzten Jahren die Erfahrung gemacht, das ich mit TOP 100 am besten leben kann, d.h. der Enduser sieht schon mal was und legt mir aber nicht den Server lahm. Wenn die User zahl steigt 10,50 > 100 legen solche SQL Anweisung den Server lahm ....

Die Zeiten von BDE sind halt vorbei!
  Mit Zitat antworten Zitat
Jumpy
Online

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: MSSQL/ADO ... speed is everything !!!

  Alt 18. Jun 2014, 09:44
Was wird denn inhaltlich in

proc (query, ......);

gemacht?

Vielleicht ist ja da schon Optimierungspotential, indem man das (teilweise) die Datenbank machen läßt?
Ralph
  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 12:50 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