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
Geschwindigkeitsvorteile von Gespeicherten Prozeduren
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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!?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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
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
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jens!jens hat geschrieben:Das erklärt aber IMHO nicht, warum es in dem Fall schneller ist, oder?
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Jens!jens hat geschrieben:Mich würde auch interessieren, wie es bei MySQL aussehen würde
http://dev.mysql.com/tech-resources/art ... dures.htmlStored 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.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.