4D Server crashed nach SQL Zugriffe

Hallo,

ich habe einen 4D Server v13 (kurz vom Update auf v15).

Dieser läuft seit 18 Jahren Jahren stabil mit aktuell 17 Clients (Danke 4D ;-)). Der 4D Server läuft aktuell auf einem Windows 2012 Rechner.

Seit 2-3 Monaten lässt die Entwicklungsabteilung der Firma (habe da keinen Einfluss, was gemacht wird) viele SQL-Zugriffe auf den 4D SQL Server aus einer externen Anwendung laufen.

Die Anfragen werden immer mehr und komplexer und of über 30.000 im Stundenrhythmus.

Beim Crash waren es 2000 Anfragen/Minute und sahen in der Regel so aus:

SQL Server execute:SELECT HA.HISTORIE_STAMM_ID, … WHERE HA.abrechnungAm < ‘14.02.2017’
AND HA.HISTORIE_STAMM_ID >= xxxxx AND HA.HISTORIE_STAMM_ID < xxxxx+50

AND HA.Abrechnungam = ( SELECT MAX(HB.Abrechnungam) FROM HISTORIE HB
WHERE HB.abrechnungAm >= ‘14.02.2017’ AND HB.abrechnungAm < ‘28.02.2017’
AND HB.HISTORIE_STAMM_ID >= xxxxx AND HB.HISTORIE_STAMM_ID < xxxxx+50 )
ORDER BY abrechnungAm

Es werden so pro Abfrage rund 50 Datensätze mit 20 x 12 historischen Datensätze aus einer Tabelle (HISTORIE) die aus 75 Zahlenfelder besteht, abgerufen.

Können solche Abfragen einen Crash des 4D Servers verursachen? Auf das Abfrageverhalten der Entwicklungsabteilung habe ich-wie gesagt-keinen Einfluss :frowning:

Grüsse

Stefan

Hallo Herr Schäfer,

64bit? 4D-Info-Komponente installiert und geloggt?

Zumindest mal das Debug-Log mitlaufen lassen um zu sehen wo genau der Crash erfolt.

Hi Stephan,
I would try to remove the ORDER by, I remember having encountered problems with it.

Ja, 64 bit.
Nein(natürlich nicht, da ich es noch nie brauchte) mache ich aber sofort, ich schwöre :wink:

Wie Herr Schumacher schon schrieb: Logs…

Das Debug Log zeigt Ihren Code.
Das Netzwerk Log zeigt externen (SQL). Allerdings zeigt das Netzwerklog nur die vollständig ausgeführten Aufrufe der letzte der zum Crash führte fehlt. Man bekommt aber eine Vorstellung wieviele Aufrufe und wie lange diese benötigten.
Die Info Komponente zeigt Speicherverhalten des Servers, das wäre hier für mich erstmal der Einstieg.

Ansonsten, das sind >30 Aufrufe pro Sekunde, die je 250 Datensätze aus 2 verschiedenen Tabellen mit je 75 Felder zurückliefern sollen - und das noch sortiert? ich hoffe SSD und ordenlich RAM - und alles wichtige indiziert? Vor allemHB.Abrechnungam und HISTORIE_STAMM_ID ? Für abrechnungam eigenes index, für abrechnungam und HA.HISTORIE_STAMM_ID nochmal ein zusammengesetztes?

Da hier noch ein Join auf eine andere Tabelle dabei ist, könnte man sich überlegen berechnete Felder redundant zu speichern, also eine Hilfstabelle nur für die Abfrage. dazu müsste man sich Struktur und Daten anschauen.

Hi Arnaud,

i hope, the SQL-Guys are convincible…

Thanks

Stefan

Hallo Herr Maul,

Danke, ich werde versuchen, das mit der Entwicklungsabteilung zu besprechen. Die ist leider nicht sehr 4D freundlich :frowning:

Grüsse

Stefan Schäfer

Im Notfall würde ich den SQL-Zugriff auf alle normalen Tabellen sperren und stattdessen eine (oder wenige) zusätzliche Tabellen anlegen, in die alle extern-relevanten Daten per Trigger repliziert werden.

Und diese dann für SQL freigeben.

Denn die externen Anfragen können ja nicht nur zu Last/Crash führen, sondern auch Daten löschen oder unkontrolliert manipulieren…

Hallo Herr Buchwitz,

das würde ich gerne so lösen, klappt aber nicht, da ein kompletter SQL Zugriff auf die gesamte Struktur gefordert wird. Was die Jungs machen, bekomme ich nur in den Logs mit.

Eigentlich Schade, aber da regiert Windows und SQL. Die Vorzüge von 4D werden nicht “gewürdigt”.

Grüsse

Stefan Schäfer