| 

.NET C# Java Javascript Exception

4
Ich hab mal wieder ne komische Frage...
Ich schreib nen Prog, was mit MSSQL und MySQL arbeiten kann.
Nun ist mir dabei was aufgefallen...
Kann es sein, dass:
...MySQL sehr schnell ist, wenn man viele kleine Abfragen hat, dafür aber sehr langsam bei Großen abfragen ist.
...MSSQL Sehr schnell bei großen Abfragen ist und bei vielen kleinen sich fast garnicht bewegt...
???

Kann man da vlt ihrgendwas machn, damit das bei beiden recht gleichmäßig ist...?
News:
19.05.2011
DerPunk 793 6
4 Antworten
4
Ich denke man kann da in der Art und Weise wie Tabellen und Indizes in den Datenbanken angelegt werden durchaus etwas "schrauben" ohne den Programmcode anpassen zu müssen.
Da ich in den letzten Jahren immer weniger mit MySQL arbeite, kann ich hierzu leider aktuell keine Aussage treffen. Für MS SQL kann ich Dir folgenden Tipp geben.

Im Management Studio kann man die ausgeführten Abfragen analysieren und bekommt Verbesserungsvorschläge. Dazu mit RechtsKlick auf den Server den "Activity Monitor" öffnen. Im Activity Monitor gibt es den Bereich "Recent Expensive Queries". Dort wiederum sind einzelne Abfragen aufgelistet zu denen man sich mit RechtsKlick auf "Show Execution Plan" die Details der Ausführung anschauen kann. Sollte das Management Studio Optimierungspotential erkennen, so wird dies mit einer roten Meldung am oberen Bildschirmrand angezeigt.

Dies wäre zumindest ein erster Ansatz um das Laufzeitverhalten für MS SQL zu analysieren.
19.05.2011
SensenMannLE 1,2k 1 8
4
Für MSSQL kann ich dir den Artikel How To: Optimize SQL Queries als Einstieg ans Herz legen.
Besonders interessant ist der Abschnitt "Using SQL Query Analyzer". Der Artikel geht nur kurz auf die Grundlagen ein aber er erklärt gut wie der Query Analyzer funktioniert, was Ausführungspläne sind und wie man sie ließt.

Sobald du das verstanden hast, kannst du dir deine Ausführungspläne anschauen und schauen wo das Problem genau liegt.

Aus die IO und Time Statistics sind sehr Aufschlussreich und zeigen zum Beispiel an, wann das Datenbankfile defragmentiert werden muss (bringt dann häufig große Geschwindigkeitszuwachse) oder Index neu gebaut werden müssen.
19.05.2011
Floyd 11,0k 3 9
4
ich wage (fast) nicht zu fragen, weils selbstverständlichkeiten sind:

1) indizes hast du angelegt?
2) dir ist klar, das mysql mittels des tabellentypes 'myisam' auch transaktionlose (und damit ein kleines funzerl schnellere) tabellen anbietet?

ansonsten ist es für performancevergleiche oder performanceprobleme immer hilfreich, wenn du uns die tabellenbeschreibung, mengengerüst und verwendete sql´s mitteilst.
19.05.2011
nabuchodonossor 1,2k 4
Indizes hab ich selbstverstendlich drauf, sind auch auf beiden systemen gleich.
ich hab ca. 25k Datensätze in der Tabelle.
Da mach ich mit ner for schleife count abfragen drauf.
DerPunk 19.05.2011
"Da mach ich mit ner for schleife count abfragen drauf." Geht das nicht anders? Wir helfen dir auch gerne das Statement zu optimieren ;)
Floyd 19.05.2011
wie floyd schon sagte: nur her mit den sql´s
nabuchodonossor 19.05.2011
1
Ich eläutere das ganze nochmal ein bisschen besser...
Ich hohl mir ne Tabelle...
Dann geh ich die tabelle mit ner forschleife durch.
In der schleife frag ich mit ner count abfrage, wie oft jeder datensatz da drinn ist. wenn er nicht drinn ist, also "0" schreib ich ihn in eine neue Tabelle.

Ich hoffe mein proffesionelles Bild hilft ^^
19.05.2011
DerPunk 793 6
2
Verstehe ich das richtig, dass du das für jeden Datensatz in der Schleife machst?

Wenn ja, wäre evtl ein SQL Statement in der Art:

INSERT INTO NeueTabelle
SELECT Value FROM Tabelle1 WHERE Value NOT IN (SELECT Value FROM Tabelle2)

...hilfreich?
Axel 19.05.2011
3
noch performanter wirds mit "exists(select ..)" ;)
Floyd 19.05.2011
2
@Axel: http://decipherinfosys.wordpress.com/2007/01/21/32/
nabuchodonossor 19.05.2011
1
@Floyd: während tu getippt hast, hab ich noch gesucht. warst wieder schneller!
nabuchodonossor 19.05.2011
Danke für den Hinweis.
Axel 19.05.2011
jo, das sieht gut aus... aber ich darf die sql anweisung nich staffeln :-(
DerPunk 19.05.2011
Das ist keine Staffelung sondern ein einzelner SQL-Ausdruck der auch so in der T-SQL-Spezifikation steht.
Floyd 19.05.2011
joa... mein ausbilder sacht trotzdem: "Nö"
DerPunk 19.05.2011
nen komischen Ausbilder hast du da der was gegen Perfomance hat :D
Floyd 19.05.2011
2
Darfst Du JOIN verwenden? Dann könntest Du alle relevanten Datensätze aus Tabelle 1 wie folgt ermitteln:

SELECT a.*, b.sp1 AS xyz FROM tabelle1 a
LEFT JOIN tabelle2 b ON a.sp1 = b.sp1
WHERE xyz IS NULL

Damit solltest Du alle Datensätze haben die nicht in Tabelle 2 vorhanden sind.
SensenMannLE 19.05.2011
2
Stimmt, das sollte die Datenmenge deutlich eingrenzen.
Floyd 19.05.2011
Join klingt gut ^^ das werd ich gleich mal ausprobieren

Danke Leute :-)
DerPunk 20.05.2011

Stelle deine Mysql-Frage jetzt!