Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

wenn-dann-Berechnung in Abfrage bremst aus

Begonnen von nico331, Februar 03, 2017, 18:26:40

⏪ vorheriges - nächstes ⏩

nico331

Hallo! ich habe in meiner DB eine Abfrage in der ich auch das ein oder andere "wenn - dann " drin habe. Jetzt habe ich öfter gelesen/gehört, dass das die Abfrage stark ausbremsen kann. Deshalb würde ich das ganze jetzt gerne optimieren.

Und zwar geht es darum. Ich habe in meinem DS ein Datum stehen. Z.b. 01.10.2017. In einem weiteren Feld habe ich einen Geldbetrag stehen. In einem 3. Feld habe ich eine Zurechnungsart-ID stehen (1= nur aktuelles jahr; 2 = Jahr übergreifend). In einem 4. Feld berechne ich die Anzahl der restlichen Monate im jeweiligen Jahr (in dem fall 3 restliche Monate in 2017).

Jetzt möchte ich in einem berechneten Feld in der Abfrage berechnen, wie viel von dem Geldbetrag im jahr 2017 anfallen.
Fall a) wenn die Zurechnungart-ID = 1 ist, dann soll die Rechnung lauten: (Geldbetrag / 12 Monate) * restliche Monate (=3)
Fall b) Wenn die Zurechnungart-ID = 2 ist, dann soll die Rechnung lauten: Geldbetrag / restliche Monate (=3)

Also im Fall a Verteilung anteiliger Geldbetrag in 2017 und in Fall b wird der gesamte Geldbetrag auf die 3 Monate verteilt.

Wie kann ich sowas abbilden, ohne "wenn dann" zu verwenden??

crystal

Hallo,

natürlich "bremst" jede Berechnung innerhalb einer Abfrage.

Die Frage ist nur, wie stark.
Wenn eine Berechnung z.B. eine tausendstel Sekunde dauern würde, würde sie für tausend Datensätze also eine Sekunde brauchen.
Kommen solche Datenmengen in deiner Abfrage vor? Wie groß ist die Tabelle, aus der du selektieren möchtest? Grenzen nicht andere Bestandteile der Abfrage die Menge schon erheblich ein?

Du könntest die "Bremse" ja leicht ermitteln, indem du zwei Abfragen baust: eine selektiert aus einer großen Tabelle alles, eine andere führt einfache Berechnungen und "Wenn-danns" zusätzlich aus. Lasse diese Abfragen dann jeweils hundert Mal laufen und messe die Zeiten.

Ansonsten gilt natürlich: ohne genaue Kenntnis der Datenstruktur, der Indizes usw. kann kaum jemand eine sinnvolle Antwort auf deine Frage geben.

Es bleibt nur die Aussage: jede Wenn-dann-Konstruktion in einer Abfrage kostet natürlich Zeit, Milli- oder Micro-Sekunden, 1000 oder 10 CPU-Takte. Solche Überlegungen werden m.E. aber erst relevant, wenn man deutlich mehr als 10.000 Datensätze betrachtet, also z.B. 1 Million.

Wenn ich mir jedoch vorstelle, dass sich deine Abfrage auf ein paar dutzend oder hundert Datensätze bezieht, ist die zusätzliche Zeit wohl eher unwichtig.

Ein Ansatz wäre es vielleicht, die gewünschten Datensätze in kaskadierten Abfragen zu ermitteln (1. grobe Abfrage, 2. feinere Abfrage, die aus der 1. Abfrage selektiert usw.).

lg
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

ebs17

ZitatJetzt habe ich öfter gelesen/gehört, dass das die Abfrage stark ausbremsen kann.
Das kommt darauf an. Berechnungen haben durch den enthaltenen Aufwand ein Gewicht. Ein IIF ist, da im Sprachschatz von SQL vorkommend und eine einfache logische Operation, nun nicht sehr aufwändig. Allerdings kommt es auch auf den Ort der Berechnung und die Weiterverwendung des berechneten Feldes an. Bei einem berechneten Feld gibt es nachfolgend keine Indexnutzung und damit evtl. Probleme dann, wenn man darauf filtert, sortiert, gruppiert, verknüpft usw.

In nicht seltenen Fällen ist aber ein Wenn-Dann einer etwas ungünstigen Datenmodellierung geschuldet. Alternierende Bedingungen kann man oft in einer zusätzlichen Tabelle unterbringen und über einen Schlüssel in die Abfrage verknüpfen.

In Deinem Beispiel stört mich die unterschiedliche Verrechnung des Geldbetrages. Man könnte darüber nachdenken, ob man Speicherung des Wertes und Verarbeitung anders gestalten könnte, müsste aber sicher den Hintergrund des Ganzen wissen.
Mit freundlichem Glück Auf!

Eberhard