Wann ist die Größe des Datenbankanrufs teurer als die Häufigkeit von Anrufen?

7

Kann mir jemand eine relative Vorstellung davon geben, wann es sinnvoller ist, die Datenbank mehrmals für kleine Abfrageergebnisse zu verwenden, anstatt eine große Anzahl von Zeilen zwischenzuspeichern und diese abzufragen?

Zum Beispiel, wenn ich eine Abfrage habe, die 2000 Ergebnisse liefert. Und dann habe ich zusätzliche Abfragen zu diesen Ergebnissen, die vielleicht 10-20 Elemente benötigen, wäre es besser, die 2000 Ergebnisse zu cachen oder die Datenbank jedes Mal für jeden Satz von 10 oder 20 Ergebnissen zu treffen?

    
zsharp 16.10.2009, 20:13
quelle

7 Antworten

9

Andere Antworten hier sind richtig - das RDBMS und Ihre Daten sind Schlüsselfaktoren. Ein weiterer Schlüsselfaktor ist jedoch, wie viel Zeit benötigt wird, um Ihre Daten im Speicher und in der Datenbank zu sortieren und / oder zu indizieren. Wir haben eine Anwendung, bei der wir aus Performance-Gründen Code hinzufügen, um etwa 10.000 Datensätze in eine speicherinterne DataSet aufzunehmen und dann Unterabfragen durchzuführen. Wie sich herausstellt, ist es tatsächlich langsamer, diese Daten aktuell zu halten und Teilmengen auszuwählen, als nur alle Daten in der Datenbank zu belassen.

Mein Rat lautet also: Mach es zuerst auf die einfachste Art und Weise, dann profiliere es und schau, ob du für die Leistung optimieren musst.

    
Daniel Pryden 16.10.2009, 20:27
quelle
5

Es hängt von einer Vielzahl von Dingen ab. Ich werde einige Punkte auflisten, die mir einfallen:

  • Wenn Sie eine .Net-Webanwendung verwenden, die Daten im Client zwischenspeichert, möchten Sie keine 2k-Zeilen ziehen.

  • Wenn Sie einen Webdienst haben, sind sie fast immer besser Chunky als Chatty wegen des zusätzlichen Aufwands von XML auf dem Transport.

  • In einer ziemlich anständig normalisierten und optimierten Datenbank sollte es wirklich sehr wenige Male sein, dass Sie 2k Reihen gleichzeitig ziehen müssen, außer Sie machen Berichte.

  • Wenn sich die zugrunde liegenden Daten in einem schnellen Tempo ändern, sollten Sie wirklich darauf achten, es auf der mittleren Ebene oder der Darstellungsschicht zwischenzuspeichern, da das, was Sie präsentieren, veraltet sein wird.

  • Berichte (beliebige DSS) ziehen und durchsuchen viel größere Datensätze, aber da sie nicht interaktiv sind, demormalisieren wir sie und lassen sie ihren Spaß haben.

  • In Fällen von kaskadierenden Drop-Downs und so werden sich AJAX-Techniken als effizienter und effektiver erweisen.

Ich schätze, ich gebe dir wirklich keine Antwort auf deine Frage. "Es kommt darauf an" ist das Beste, was ich tun kann.

    
Raj More 16.10.2009 20:28
quelle
5

Wenn es kein großes Leistungsproblem gibt (z. B. eine hochgradig latente db-Verbindung), bleibe ich dabei, die Daten in der Datenbank zu belassen und db die Dinge für Sie erledigen zu lassen. Viele Dinge werden effizient auf Datenbankebene erledigt, zum Beispiel

  • Isolationsstufen (was passiert, wenn andere Transaktionen die zwischengespeicherten Daten aktualisieren)
  • schneller Zugriff mit Hilfe von Indizes (die Datenbank kann schneller auf einige Zeilen zugreifen als beim Durchsuchen der zwischengespeicherten Elemente, besonders wenn diese Daten bereits im db-Cache sind, wie in Ihrem Szenario)
  • aktualisiert in Ihrer Transaktion die zwischengespeicherten Daten (wollen Sie auch mit der Aktualisierung Ihrer zwischengespeicherten Daten umgehen oder "refresh" alles von der db)

Es gibt eine Menge potenzieller Probleme, auf die Sie stoßen könnten, wenn Sie Ihr eigenes Caching durchführen. Sie müssen einen sehr guten Leistungsgrund haben, bevor Sie beginnen, sich um all diese Komplexität zu kümmern.

Also, die kurze Antwort: Es kommt darauf an, aber wenn Sie nicht einige gute Gründe haben, riecht das nach voreiliger Optimierung für mich.

    
Thorsten 16.10.2009 21:13
quelle
5

Im Allgemeinen ist die Roundtrip-Latenz im Netzwerk um mehrere Größenordnungen höher als die Kapazität einer Datenbank zum Generieren und Einspeisen von Daten in das Netzwerk und die Kapazität einer Clientbox, diese über eine Netzwerkverbindung zu nutzen.

Aber schauen Sie sich die Breite Ihres Netzwerkbusses an (Bits / sec) und vergleichen Sie diese mit der durchschnittlichen Umlaufzeit für einen Datenbankaufruf ...

Auf 100baseT Ethernet zum Beispiel sind Sie etwa 12 MBytes / sec Datenübertragungsrate. Wenn Ihre durchschnittliche Umlaufzeit etwa 200 ms beträgt, kann Ihr Netzwerkbus in jedem 200-ms-Round-Trip-Aufruf 3 MByte liefern.

Wenn Sie auf Gigabit-Ethernet sind, springt diese Zahl auf 30 MB pro Umlauf ...

Wenn Sie also eine Anfrage für Daten in zwei Rundreisen aufteilen, dann sind das 400 ms, und jede Abfrage müsste über 3 MB (oder 30 MB für Gigabit) sein, bevor das schneller wäre ...

    
Charles Bretana 16.10.2009 20:35
quelle
4

Dies variiert wahrscheinlich von RDBMS zu RDBMS, aber meiner Erfahrung nach ist das Ziehen in großen Mengen fast immer besser. Immerhin müssen Sie die 2000 Datensätze trotzdem ziehen, also können Sie alles auf einmal machen. Und 2000 Datensätze sind nicht wirklich eine große Menge, aber das hängt weitgehend davon ab, was Sie tun.

Mein Rat lautet: Profilieren und sehen, was am besten funktioniert. RDBMSes können in Bezug auf die Leistung trickreiche Biester sein und das Caching kann genauso schwierig sein.

    
Jason Baker 16.10.2009 20:20
quelle
3

"Ich schätze, ich gebe dir nicht wirklich eine Antwort auf deine Frage." Es kommt darauf an "ist das Beste, was ich tun kann."

ja, "es kommt darauf an". Dies hängt von der Volatilität der Daten ab, die Sie zwischenspeichern möchten, und hängt von der Genauigkeit und Zuverlässigkeit ab, die Sie für die Antworten benötigen, die Sie aus den Daten generieren, die Sie zwischenspeichern möchten.

Wenn die Volatilität Ihrer "Basis" -Daten gering ist, hat jede Zwischenspeicherung, die Sie für diese Daten durchführen, eine höhere Wahrscheinlichkeit, länger gültig zu bleiben und zu korrigieren.

Wenn "Caching-Fehlertoleranz" für die Ergebnisse, die Sie an Ihre Benutzer zurückgeben, null Prozent beträgt, haben Sie keine Option.

    
Erwin Smout 16.10.2009 20:41
quelle
2

Die Art der Daten, die Sie mitbringen, beeinflusst auch die Entscheidung. Sie möchten keine flüchtigen Daten oder Daten für potentielle Updates, die möglicherweise veralten, zwischenspeichern.

    
Gratzy 16.10.2009 20:22
quelle

Tags und Links