> For the complete documentation index, see [llms.txt](https://docs.ninox.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ninox.com/ninox-scripting/de/automate-your-workflows/automations/optimize-the-performance-of-your-app.md).

# Optimiere die Performance deiner App

Erfahre, wie du die Performance deiner Ninox App mit effizienten Abfragen, Triggern und Datenverarbeitung optimierst.

Die folgenden Best Practices sind zentrale Empfehlungen, die sich bewährt haben. Sie behandeln häufige Stolperfallen wie ineffizienten Datenzugriff, unerwünschte Trigger-Kaskaden und rechenintensive Schleifen. Wenn du diese Richtlinien konsequent anwendest, kannst du Ladezeiten reduzieren und Systemressourcen schonen.

#### **Startansichten für große Tabellen optimieren**

Filtere bei großen Tabellen die Startansicht so, dass sie nur eine relevante Teilmenge der Datensätze zeigt. Zeige nur die benötigten Datensätze an. Das verbessert die Ladezeit erheblich und erleichtert die Nutzung.

#### **Trigger-Konflikte und Zyklen vermeiden**

Stelle sicher, dass Trigger unabhängig arbeiten und sich nicht gegenseitig beeinflussen. Vermeide besonders Konfigurationen, die zyklische Referenzen oder unbeabsichtigte Trigger-Schleifen erzeugen können. Diese können zu unvorhersehbarem Verhalten und Performance-Problemen führen.

#### **Select-Statements sparsam verwenden**

Verwende `select`-Statements nur, wenn sie unbedingt notwendig sind. Wenn Referenzen auf die Zieltabelle bereits vorhanden sind, nutze diese. Greife bei zugehörigen Daten in Untertabellen mit der Punktnotation statt mit `select`-Statements zu. Das verbessert die Performance und hält die Logik klar.

❌ Vermeide:

```none
sum((select rechnungspositionen where rechnung = i).netto_gesamt)
```

✅ Verwende stattdessen:

```none
let me := this;
sum((rechnungspositionen[rechnung = me]).netto_gesamt)
```

#### **select-Statements in Logikfeldern minimieren**

Vermeide nach Möglichkeit `select`-Statements in Logikfeldern, die in Tabellen- oder Formularansichten angezeigt werden. Wenn ein `select`-Statement erforderlich ist, definiere Bedingungen mit der `where`-Klausel statt mit eckigen Klammern `[...]`.

#### **Wiederholte select-Ausführungen vermeiden**

Wenn ein `select`-Statement in einem Skript erforderlich ist, führe es nur einmal aus und speichere das Ergebnis in einer Variablen. Verwende diese Variable erneut, um bei Bedarf auf mehrere Felder zuzugreifen. Das verbessert die Performance und reduziert überflüssige Datenbankoperationen.

#### **select-Statements in verschachtelten Schleifen vermeiden**

Vermeide nach Möglichkeit `select`-Statements in verschachtelten Schleifen. Dieses Muster kann durch wiederholten Datenbankzugriff erhebliche Performance-Einbußen verursachen. Rufe die Daten stattdessen vorab ab und verwende zwischengespeicherte Daten.

#### **Statische Werte dem wiederholten Berechnen von Logik vorziehen**

Berechne Logik nicht jedes Mal dynamisch neu. Schreibe stattdessen statische Werte mit Triggern in Datenfelder, wenn das sinnvoll und vorteilhaft ist. Das reduziert den Verarbeitungsaufwand und verbessert die Performance deiner App.

#### **Suchen in Tabellenansichten aus Dashboard-Formularansichten optimieren**

Definiere bei Suchen in Tabellenansichten über eine Formularansicht oder Seite alle Variablen mit `let`, bevor du die Suche mit einem `select`-Statement ausführst. Begrenze die Ergebnisse, damit keine unnötigen Daten geladen werden. Verwende außerdem den Befehl `not`, um leere Suchfelder korrekt zu behandeln und präzise zu filtern.

```none
let mySuche := projektsuche;
select projekte where (not mySuche or projektname +
     concat(projekt_mitarbeiter.waehle_person.name) like mySuche) from 0 to 100
```

#### **Große Textblöcke nicht in Textfeldern speichern**

Speichere große Inhalte nicht direkt in Text- oder HTML-Feldern. Dazu gehören beispielsweise CSV-Dateien, Base64-Dateien oder JSON-Payloads für API-Calls. Da Ninox jede Änderung protokolliert, kann der Änderungsverlauf dadurch sehr groß werden und die Performance beeinträchtigen. Erstelle solche Inhalte stattdessen mit `createTextFile()` und speichere sie als Anhang.

Du kannst dann über die API oder mit der folgenden Funktion auf die Datei zugreifen:

```none
let response := http("GET", Sharelink);
text(html(response.result))
```

#### **Indizierung gezielt verwenden**

Wende Indizierung nur auf Felder an, die häufig durchsucht werden und von einem schnelleren Zugriff profitieren. Felder mit wenigen möglichen Werten, wie Ja/Nein-Felder, benötigen normalerweise keine Indizierung.\
Weitere Informationen findest du unter [Indexfelder für schnellere Filter und Suchen](/ninox-scripting/de/automate-your-workflows/automations/index-fields-to-speed-up-filters-and-searches.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ninox.com/ninox-scripting/de/automate-your-workflows/automations/optimize-the-performance-of-your-app.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
