Wie kann man die vorhandenen Indexe ermitteln?

Wie kann man die vorhandenen Indexe ermitteln?

Um sich die vorhandenen Indexe ausgeben zu lassen, kann man nach nachfolgender Anleitung vorgehen.  Offizielle Anleitung mit weiteren Informationen:
https://learn.microsoft.com/de-de/sql/relational-databases/system-catalog-views/sys-indexes-transact-sql?view=sql-server-ver16  
https://learn.microsoft.com/de-de/sql/relational-databases/system-catalog-views/sys-index-columns-transact-sql?view=sql-server-ver16

Schritt-für-Schritt-Anleitung

alle Indexe der Datenbank ausgeben

  1. ODBC-Datenbankverbindung herstellen, z. Bsp. mit einem MSSQL-Managementstudio oder winsql.exe oder .... 

  2. Bei Verwendung MSSQL-Management-Studio:
    Mit der Datenbank verbinden, deren Indexe man auslesen möchte. Entweder per Menü, Beispiel für Datenbank PH1110: 

    image-20260102-080320.png


    oder per Statement: 

    USE [meineDatenbank]; 

    Beispiel: 

    use [PH1110]; 
    image-20260102-080409.png

     

  3. Diese Statements absetzen (DBOwner-Rechte genügen):

    -- mit der gewünschten Datenbank verbinden: USE [meineDatenbank];  -- alle Indexe ermitteln: SELECT TableName = t.name, IndexName = ind.name, IndexId = ind.index_id, ColumnId = ic.index_column_id, ColumnName = col.name, ind.*, ic.*, col.* FROM sys.indexes ind INNER JOIN sys.index_columns ic ON  ind.object_id = ic.object_id and ind.index_id = ic.index_id INNER JOIN sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id INNER JOIN sys.tables t ON ind.object_id = t.object_id WHERE ind.is_primary_key = 0 AND ind.is_unique = 0 AND ind.is_unique_constraint = 0 AND t.is_ms_shipped = 0 ORDER BY  t.name, ind.name, ind.index_id, ic.index_column_id;
  4. Man erhält eine Liste, die wie folgt zu lesen ist: 

    image-20260102-080448.png


    wichtige Felder:  
    - Tablename = Tabelle, für welche der Index gilt
    - Indename = Name des Indexes. Achtung, der Name kann mehrfach vorkommen. Das bedeutet, dass es ein kombinierter Index ist (= mehrere Felder sind im Index enthalten)
    - ColumnName = Felder, die im Index enthalten sind

    Beispiel:
    Index bgrel_ex0_idx besteht aus 2 Feldern (benutzer_id und gruppen_id)

 

Man kann damit keine Statements ausgeben zum Erzeugen aller Indexe. D.h. man muss sich anhand dieser Liste die Statements selbst zusammenstellen. 

Tipp: Über den enaio Edio die SQL-Statements ausgeben. Das gibt aber nur Standardindexe aus. Dieses SQL bitte anpassen auf unsere empfohlenen Indexe, siehe Was ist in Bezug auf die Indexe zu beachten (empfohlene Indexe)?
Manuell gesetzte Indexe müssen auch manuell hinzugefügt werden. Das fertige SQL kann dann direkt auf der Datenbank ausgeführt werden. 

 

einen einzelnen Index ausgeben und Skript für Erstellung generieren

  1. ODBC-Datenbankverbindung herstellen, z. Bsp. mit einem MSSQL-Managementstudio oder winsql.exe oder .... 

  2. Mit der Datenbank verbinden, deren Indexe man auslesen möchte. Entweder per Menü, Beispiel für Datenbank PH850: 

     

    oder per Statement: 

    USE [meineDatenbank]; 

    Beispiel: 

    use [PH850]; 
  3. Die Tabelle aus dem Objectexplorer heraussuchen, deren Indexe man sehen möchte und je mit “+“ aufklappen bis die Indexe zu sehen sind. Beispiel:

  4. Den gewünschten Index markieren. 

    1. Infos ausgeben:
      Über Eigenschaften (rechte Maustaste) bekommt man den Index angezeigt, Beispiel: 

       

      Bei diesen Eigenschaften bekommt man auch Informationen zur Größe des Indexes etc. 

    2. Skript erhalten:

      Über rechte Maustaste "Skript-Erstellung, Create to, Neue Abfrage ..." bzw. "script index as, create to, new query editor ..." erhält man das Statement zum Erstellen.
      Beispiel: 

       

      ergibt:

 

 

Aktuell gibt es nur die Möglichkeit, alle Indexe der Datenbank auszugeben. 
Bei einem einzelnen Index kann man sich ein Statement ausgeben lassen. 

 

Verwandte Artikel