Geschwindigkeitsvorteile von Gespeicherten Prozeduren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Geschwindigkeitsvorteile von Gespeicherten Prozeduren

Beitragvon gerold » Mittwoch 9. Mai 2007, 15:35

Hallo!

Es geht um den MS-SQL Server 2000. Es geht um einen gravierenden Geschwindigkeitsunterschied. Es geht um das Filtern von 4 Mio. Datensätzen.

Für einen Bericht muss ich eine temporäre Tabelle (#filtered_sales) mit Bonnummern füllen. Dafür habe ich mir eine kleine Abfrage gebastelt. Die Filterbedingungen stehen in mehreren anderen Tabellen verteilt. Diese Tabellen habe ich mit JOINs eingebunden. Alles kein Problem. -- Aber das Ausführen bei nur 4 Mio. Datensätzen brauchte ca. 30 Sekunden.

Jetzt dachte ich mir: Ich könnte doch mal wieder eine "Gespeicherte Prozedur" aus dieser Abfrage machen und schauen wie viel schneller so eine Gesp. Proz. ist.

Gedacht, getan. Beim ersten Ausführen der Prozedur war diese in etwa gleich schnell. Beim zweiten Auführen brauchte die Prozedur nur mehr 10 Sekunden. (statt 30 Sekunden)

Um das Caching im Speicher auszuschließen, habe ich den SQL-Server neu gestartet. --> immer noch 10 Sekunden.

Ich wusste ja, dass Prozeduren schneller sind als normale SQL-Anweisungen, aber dass es so viel schneller ist, das hätte ich mir nie gedacht. Die Ablaufplanung des MS-SQL Servers bringts voll. Umfangreiche Arbeiten gehören in eine "Gespeicherte Prozedur" oder in eine View.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Beitragvon BlackJack » Mittwoch 9. Mai 2007, 15:42

Da werden wahrscheinlich zu der Prozedur Statistiken gespeichert und/oder neue Indexe angelegt. Sonst wüsste ich nicht, wie man den Unterschied zwischen dem ersten und den folgenden Läufen der Prozedur erklären sollte!?
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 9. Mai 2007, 15:51

Bei http://de.wikipedia.org/wiki/Stored_Procedure steht eigentlich nur, das es schneller geht, weil die Datenbank mehrere Schritte, die normalerweise der Client einzeln ausführt, zusammenfast. Schneller ist es, weil weniger Kommunikation zwischen Client <-> Server abläuft.

Das erklärt aber IMHO nicht, warum es in dem Fall schneller ist, oder?
Ob MS-SQL vielleicht die Ergebnisse oder Teilergebnisse in einen Cache schmeißt?

Mich würde auch interessieren, wie es bei MySQL aussehen würde ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 9. Mai 2007, 16:06

jens hat geschrieben:Das erklärt aber IMHO nicht, warum es in dem Fall schneller ist, oder?

Hallo Jens!

Nein, das hat in diesem Fall nichts damit zu tun, denn ich übertrage keine Daten vom Server zum Client. Ich fülle nur eine temporäre Tabelle mit Daten.

Warum es schneller ist, ist im SQL-Server Kompendium recht gut erklärt. Ist schon lange her, dass ich diesen Schmöker gelesen habe. Was ich noch weiß ist, dass der SQL-Server Statistiken und Ablaufpläne speichert. Wenn die gleiche (oder eine ähnliche!!!) Abfrage noch einmal ausgeführt wird, dann kann der SQL-Server auf diese Statistiken zurück greifen und den Ablauf besser planen. Das ist der wichtigste Vorteil von "Gespeicherten Prozeduren" und "Views" -- zumindest beim MS-SQL Server. Die paar Tausend Zeichen einer SQL-Abfrage, die man sich durch Gesp. Proz. spart, ist in heutigen Netzen nicht wirklich ausschlaggebend. Außer die Abfrage wiederholt sich hunderte/tausende mal.

Beim PostgreSQL-Server sieht es kaum anders aus. Da lese ich in den Releasenotes immer wieder von Geschwindigkeitssteigerungen durch neu durchdachte Ablaufplanungen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 9. Mai 2007, 16:14

jens hat geschrieben:Mich würde auch interessieren, wie es bei MySQL aussehen würde ;)

Hallo Jens!

Stored procedures are fast! Well, we can't prove that for MySQL yet, and everyone's experience will vary. What we can say is that the MySQL server takes some advantage of caching, just as prepared statements do. There is no compilation, so an SQL stored procedure won't work as quickly as a procedure written with an external language such as C. The main speed gain comes from reduction of network traffic. If you have a repetitive task that requires checking, looping, multiple statements, and no user interaction, do it with a single call to a procedure that's stored on the server. Then there won't be messages going back and forth between server and client, for every step of the task.

http://dev.mysql.com/tech-resources/art ... dures.html

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder