> 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/index-fields-to-speed-up-filters-and-searches.md).

# Indexiere Felder um Filtern und Suche zu beschleunigen

Erfahre, wie du Indizes in Ninox nutzt und die Performance großer Apps sicherst.

Indizes helfen Ninox, passende Datensätze zu finden, ohne eine ganze Tabelle zu durchsuchen.\
Abfragen können ganze Tabellen wiederholt durchsuchen, auch wenn sie nur wenige Ergebnisse liefern. Das beeinflusst die Performance einer App und ihrer Cloud-Umgebung.

Das passiert oft, wenn:

* eine Tabelle 20.000 oder mehr Datensätze enthält
* eine Abfrage regelmäßig und sehr oft läuft
* das gefilterte Feld keinen Index hat

Die Auswirkungen nehmen zu, wenn mehrere Nutzer diese Abfragen gleichzeitig ausführen.

## Index für ein Feld aktivieren

Du kannst die Indizierung unter <img src="https://4281725330-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeOtcN1ayM0eBTQcbPg1J%2Fuploads%2FHj7kzDrcYwhetyJnlNok%2Frule_settings_icon.png?alt=media&amp;token=2129836d-00e4-427c-8d45-9075023354e7" alt="" data-size="line">**Verhalten** in den **Einstellungen** des Felds aktivieren. Weitere Details findest du unter [Gemeinsame Feldeinstellungen](/builder-hub/de/design-your-app/add-and-edit-data-fields-in-your-tables/all-data-fields/shared-field-settings.md).

Dadurch entsteht eine Suchstruktur, mit der die Datenbank Datensätze effizient findet.

## Wann du Indizierung verwendest

Indexiere ein Feld, wenn alle folgenden Bedingungen zutreffen:

* Die Tabelle enthält Tausende Datensätze.
* Das Feld wird in `where`-Bedingungen verwendet.
* Die Abfrage läuft häufig in Ansichten, Dashboards, Skripten oder Automatisierungen.

Die Tabelle "Aufgaben" ist beispielsweise groß und wird häufig für Dashboards abgefragt. Jede Aufgabe hat einen eindeutigen Code im Feld "Referenz". Ein Feld "SearchReference" liefert den gesuchten Wert.

```none
let mySearch := search_reference;
select tasks where reference = mySearch
```

Das Indizieren des Felds "Referenz" verbessert diese Abfrage. Felder mit eindeutigen Werten sind gute Kandidaten. Ein Auswahlfeld enthält meist wiederkehrende Werte. Das verringert den Nutzen eines Index.

Verwende für Dashboards in großen Apps mit mehreren Nutzern auch clientseitige `select`-Statements.

## Wann du Indizierung vermeiden solltest

Indexiere nicht jedes Feld. Indizes benötigen zusätzlichen Speicher und Arbeitsspeicher. Sie erhöhen auch die Zeit zum Schreiben von Datensätzen.

Vermeide Indizierung in folgenden Fällen:

* Die Tabelle ist klein oder das Feld wird selten gefiltert.
* Die Abfrage läuft nicht häufig.
* Die meisten Datensätze haben denselben Wert.
* Das Feld hat wenige mögliche Werte, etwa ein Ja/Nein Feld.

## Wie Indizierung die Performance verbessert

Betrachte diese Abfragen:

```none
select tasks where status = 1
```

```none
select tasks where zugeteilter_nutzer = user()
```

Ohne Index prüft Ninox jeden Datensatz gegen die Bedingung. Bei einer Tabelle mit 20.000 Datensätzen sind das 20.000 Auswertungen pro Abfrage. Wenn die Abfrage 5.000 Mal läuft, sind das 100 Millionen Auswertungen.

Mit einem Index sucht Ninox den Wert, ruft passende Datensatz-IDs ab und lädt nur diese Datensätze. Das reduziert die Anzahl der Datensätze, die Ninox durchsuchen muss.

## Anforderungen für die Verwendung eines Index

Das Erstellen eines Index reicht nicht aus. Die Abfrage muss alle folgenden Anforderungen erfüllen:

* Verwende das indizierte Feld direkt. Wende keine Funktion darauf an und referenziere es nicht über ein Logikfeld.
* Verwende `=`, `>`, `>=`, `<` oder `<=`.
* Vergleiche das Feld mit einem Literal oder einer `let`-Variable. Vergleiche es nicht direkt mit einem anderen Feld oder einem berechneten Wert.

Der Suchwert muss vor Beginn der Suche verfügbar sein. Eine Variable wird vor der Suche einmal ausgewertet. Eine Feldreferenz kann sich für jeden durchsuchten Datensatz ändern. Ninox kann den Index dann nicht verwenden.

**Diese Abfrage verwendet den Index:**

```none
let suchWert := such_Referenz;
select tasks where referenz = suchWert
```

**Diese Abfrage verwendet den Index nicht:**

```none
let zz := this;
select tasks where referenz = zz.such_referenz
```

Die indizierte Bedingung muss die erste Bedingung in `select` sein und für sich allein stehen. Wende weitere Bedingungen auf das `select`-Ergebnis an.

## Beispiele für Abfragen

### Funktionen verhindern die Indizierung

Das Anwenden einer Funktion auf ein indiziertes Feld verhindert die Verwendung des Index:

```none
select tasks where upper(status) = "OFFEN";
select tasks where eine_funktion(status)
```

Ninox muss alle Datensätze durchsuchen, weil das Feld nicht direkt verwendet wird.

### Separate Verzweigungen statt `or` verwenden

Eine `or`-Bedingung verhindert die Verwendung eines Index:

```none
let suchWert := suchwort;
select tasks where referenz = suchWert or title = suchWert
```

Verwende für jedes Kriterium eine eigene Verzweigung:

```none
let suchWert := suchwort;
if such_referenz then
select tasks where referenz = suchWert
else if suche_titel then
select tasks where titel = suchWert
else
null
end;
```

### Zusätzliche Bedingungen nach dem indizierten `select` anwenden

Ein `select` mit kombinierten Bedingungen durchsucht die ganze Tabelle. Er kann keinen Index verwenden, auch wenn `feld1` indiziert ist:

{% code overflow="wrap" %}

```none
let c1 := condition1;
let c2 := condition2;
let c3 := condition3;
select tasks where (not c1 or c1 = field1) and (not c2 or c2 = field2) and (not c3 or c3 = field3)
```

{% endcode %}

Wenn ein Kriterium ein indiziertes Feld verwendet, nutze diese Bedingung allein in `select`. Filtere dann das Ergebnis:

{% code overflow="wrap" %}

```none
if c1 then
(select tasks where field1 = c1)[(not c2 or field2 = c2) and (not c3 or field3 = c3)]
else
select tasks where (not c2 or c2 = field2) and (not c3 or c3 = field3)
end;
```

{% endcode %}

`not c1` behandelt auch `0` als fehlende Bedingung. Prüfe dieses Verhalten bei numerischen Kriterien oder Auswahlkriterien.

### Einen Bereich für die Präfixsuche verwenden

Zwei Bedingungen für dasselbe indizierte Feld mit `>=` und `<=` erstellen einen Bereichsscan. Berechne die Obergrenze in einer Variablen:

```none
let p := suche_referenz;
let pEnd := p + "zzzz";
select tasks where referenz >= p and referenz <= pEnd
```

### Indizes nicht für die Substring-Suche verwenden

Indizes ordnen Werte ab ihrem ersten Zeichen. Sie können einen vollständigen Wert oder ein Präfix finden. Sie können keinen Text innerhalb eines Werts finden.

`contains()` und `like` verwenden nie einen Index. Speichere Werte stattdessen in einem sauberen, normalisierten Format. Verwende einen Wert pro indiziertem Feld und suche mit `=`.

### Selects in Logikfeldern vermeiden

Ein `select` in einem Logikfeld läuft erneut, wenn du es liest. Es läuft auch, wenn sich ein Datensatz in der abgefragten Tabelle ändert. `do as server` entscheidet nur, wo die Abfrage läuft. Es ändert nicht, wie oft sie läuft.

Setze die Bedingung direkt in den `select`. Filtere ein Ergebnis aus einem Logikfeld nicht im Speicher.


---

# 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/index-fields-to-speed-up-filters-and-searches.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.
