aximand
Goto Top

SQL-Abfrage beschleunigen durch View mit Variablen oder abspeichern der ABfrage

Hallo,

es gibt eine Tabelle mit knapp 120000 Datensätzen.
Darin gibt es wichtige Felder wie Kundenummer, UmsatzBelegposition,Belegnummer, UmsatzDatum.

Um jetzt den kumulierten Umsatz eines Kunden über einen Zeitraum bezogen auf Belegnummer abzufragen muss ich sowas schreiben wie:

Select SUM( UmsatzBelegposition) AS Belegumsatz from Tabelle 
where 
Kundenummer ="KDNR"  
and 
UmsatzDatum >= "Datumuntergrenze" and UmsatzDatum <="Datumobergrenze"  
group by Belegnummer ....


Das ganze ist derzeit als AbfrageString in VBA in einer Excel-Mape hinterlegt. Da es viele verschiedene Abfragen gibt wird der Code umfangreich.

Mein Gedanke war nun diese Abfrage irgendwie im SQL-Server mit Variablen zu speichern, die dann aus dem VBA-Projekt von Excel kommen.

Außerdem erhoffe ich mir davon eine Geschwindigkeitssteigerung.

Ist sowas möglich?

Content-Key: 526770

Url: https://administrator.de/contentid/526770

Printed on: May 22, 2024 at 15:05 o'clock

Member: emeriks
emeriks Dec 18, 2019 updated at 07:29:27 (UTC)
Goto Top
Hi,
Du kannst Dir in der Datenbank dafür Views erstellen. Damit kann man das dann "bequemer" abfragen. Sprich, der Quelltext unter VBA wird etwas kürzer, aber auch nur um die Längen der Abfragestrings. Aber schneller wird das dadurch auch nicht. Nicht, dass ich wüsste.

Wenn da nach der einfachen Abfrage noch weitere Aktionen mit diesen Daten erfolgen, Folgeabfragen entstehen usw., dann müsste man sehen, was man davon auch mit TSQL abfackeln könnte. Und sowas dann als gespeicherte Prozedure in der SQL-DB abgelegt, das könnte dann einen Gewschindigkeitsvorteil bringen.

E.
Member: wiesi200
wiesi200 Dec 18, 2019 at 07:46:15 (UTC)
Goto Top
Hallo,

für sowas gibt es BI Lösungen. Bei einem MS SQL Server ist das "Analysis Services" mit dabei.
https://docs.microsoft.com/de-de/analysis-services/analysis-services-ove ...

Da kannst du deine Daten im Vorfeld schon berechnen lassen und dann in Excel darstellen und auswerten.
Bis man sich auskennt ist ne spielerei, aber dann ist echt ne tolle sache wenn man sich auskennt.

Und die Auswertungen sind dann auch richtig schnell.
Member: BirdyB
BirdyB Dec 18, 2019 at 07:52:08 (UTC)
Goto Top
Moin,

bezüglich der Geschwindigkeit:
Hast du Indexe eingerichtet?

Viele Grüße
Member: SeaStorm
SeaStorm Dec 18, 2019 at 07:56:34 (UTC)
Goto Top
Hi

also grundsätzlich gibt es hier mehrere Hebel.
Ein einfacher View ist lediglich ein Alias für eine Abfrage. Entsprechend ändert sich an der Geschwindigkeit nix.

Ein Indexed View hingegen ist technisch eine neue Tabelle, die permanent aktualisiert wird, wenn sich die referenzierten Daten dahinter ändern.
Damit könnte man das ggf lösen. Kommt auf die Daten an. Damit könnte man also die Daten permanent schon aufbereitet vorhalten, was die schlussendliche Abfrage entsprechend verbessert.

Das wohl relevanteste ist aber: Sind die Tabellen mit den Umsätzen denn ordentlich Indexiert? Indexe bringen eigentlich immer am meisten Performance. und

Mein Gedanke war nun diese Abfrage irgendwie im SQL-Server mit Variablen zu speichern, die dann aus dem VBA-Projekt von Excel kommen.
Das sollte sogar Standard sein. Parametrisierte Abfragen führen zu vorkompilierten Abfrageplänen im SQL, was grundsätzlich schon mal CPU Zeit spart.
Member: GrueneSosseMitSpeck
GrueneSosseMitSpeck Dec 18, 2019 at 13:15:59 (UTC)
Goto Top
1.) Indizes hinzufügen
2.) den Querystore anwerfen und gucken was da so teuer ist, man findet da auch Informationen über fehlende Indizes.
3.) Migration nach Columnstore Indizes, die sind für solche Art von Abfragen optimiert, diese sollten idealerweise auch noch komprimiert sein
4.) Tabelle nach "memory optimized" umstellen
Member: ukulele-7
ukulele-7 Dec 18, 2019 at 13:22:01 (UTC)
Goto Top
Als Stichwörter würde ich jetzt noch materialized view und stored procedure in den Raum werfen die die Geschwindigkeit erhöhen können aber wie schon erwähnt ist der Index i.d.R. der Schlüssel zum Erfolg und bringt am meisten. Im konkreten Fall wäre ein Index auf Kundennummer und Umsatz Datum für deine Abfrage sinnvoll, aber natürlich verlangsamt jeder Index auch Schreibvorgänge auf der Tabelle, es gibt also eine Downside die sich auswirken kann.