ArcGIS Pro 3.4 API Reference Guide
ArcGIS.Core.Data.DDL Namespace / AttributeIndexDescription Class / AttributeIndexDescription Constructor / AttributeIndexDescription Constructor(String,TableDescription,IEnumerable<String>)
The name of the description.
The description object representing the ArcGIS.Core.Data.Table that will hold the attribute index.
The names of the ArcGIS.Core.Data.Fields present in the attribute index.
Example Version

AttributeIndexDescription Constructor(String,TableDescription,IEnumerable<String>)
Creates a description object of the attribute ArcGIS.Core.Data.Index.
Syntax

Parameters

indexName
The name of the description.
tableDescription
The description object representing the ArcGIS.Core.Data.Table that will hold the attribute index.
indexFieldNames
The names of the ArcGIS.Core.Data.Fields present in the attribute index.
Exceptions
ExceptionDescription
The list of field names is invalid.
Example
Creating a table with index from scratch
public void CreatingTableWithIndex(SchemaBuilder schemaBuilder)
{
    FieldDescription nameFieldDescription = FieldDescription.CreateStringField("Name", 50);
    FieldDescription addressFieldDescription = FieldDescription.CreateStringField("Address", 200);

    // Creating a feature class, 'Buildings' with two fields
    TableDescription tableDescription = new TableDescription("Buildings", new List<FieldDescription>() { nameFieldDescription, addressFieldDescription });

    // Enqueue DDL operation to create a table
    TableToken tableToken = schemaBuilder.Create(tableDescription);

    // Creating an attribute index named as 'Idx'
    AttributeIndexDescription attributeIndexDescription = new AttributeIndexDescription("Idx", new TableDescription(tableToken),
      new List<string> { nameFieldDescription.Name, addressFieldDescription.Name });

    // Enqueue DDL operation to create an attribute index
    schemaBuilder.Create(attributeIndexDescription);

    // Execute build indexes operation
    bool isBuildSuccess = schemaBuilder.Build();
}
Adding indexes in pre-existing dataset
public void AddingIndexes(SchemaBuilder schemaBuilder, FeatureClassDefinition featureClassDefinition)
{
    // Field names to add in the attribute index
    string fieldName = featureClassDefinition.GetFields().First(f => f.AliasName.Contains("Name")).Name;
    string fieldAddress = featureClassDefinition.GetFields().First(f => f.AliasName.Contains("Address")).Name;

    // Creating an attribute index with index name 'Idx' and two participating fields' name
    AttributeIndexDescription attributeIndexDescription = new AttributeIndexDescription("Idx", new TableDescription(featureClassDefinition), new List<string> { fieldName, fieldAddress });

    // Enqueue DDL operation for an attribute index creation 
    schemaBuilder.Create(attributeIndexDescription);

    // Creating the spatial index 
    SpatialIndexDescription spatialIndexDescription = new SpatialIndexDescription(new FeatureClassDescription(featureClassDefinition));

    // Enqueue DDL operation for the spatial index creation
    schemaBuilder.Create(spatialIndexDescription);

    // Execute build indexes operation
    bool isBuildSuccess = schemaBuilder.Build();

    if (!isBuildSuccess)
    {
        IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
        // Iterate and handle errors 
    }
}
Create Attribute Indexes on KG Schemas with SchemaBuilder
await QueuedTask.Run(() =>
{
  using (var kg = GetKnowledgeGraph())
  {
    if (kg == null)
      return;

    var entity_name = "PhoneCall";

    //indexes are managed on the GDB objects...
    var entity_table_def = kg.GetDefinition<TableDefinition>(entity_name);
    var entity_table_desc = new TableDescription(entity_table_def);


    var entity_table_flds = entity_table_def.GetFields();
    AttributeIndexDescription attr_index1 = null;
    AttributeIndexDescription attr_index2 = null;
    foreach (var fld in entity_table_flds)
    {
      //index the first string field
      if (fld.FieldType == FieldType.String && attr_index1 == null)
      {
        if (fld.Name == "ESRI__ID")//special case
          continue;
        //Index _must_ be ascending for KG
        attr_index1 = new AttributeIndexDescription(
          "Index1", entity_table_desc, new List<string> { fld.Name })
        {
          IsAscending = true
        };
      }
      //index the first numeric field (if there is one)
      if ((fld.FieldType == FieldType.BigInteger ||
           fld.FieldType == FieldType.Integer ||
           fld.FieldType == FieldType.Single ||
           fld.FieldType == FieldType.SmallInteger ||
           fld.FieldType == FieldType.Double) && attr_index2 == null)
      {
        attr_index2 = new AttributeIndexDescription(
          "Index2", entity_table_desc, new List<string> { fld.Name })
        {
          IsAscending = true,
          IsUnique = true //optional - unique if all values are to be unique in the index
        };
      }
      if (attr_index1 != null && attr_index2 != null) break;
    }

    if (attr_index1 == null && attr_index2 == null)
      return; //nothing to index

    //Run the schema builder
    try
    {
      SchemaBuilder sb = new(kg);
      if (attr_index1 != null)
        sb.Create(attr_index1);
      if (attr_index2 != null)
        sb.Create(attr_index2);
      if (!kg.ApplySchemaEdits(sb))
      {
        var err_msg = string.Join(",", sb.ErrorMessages.ToArray());
        System.Diagnostics.Debug.WriteLine($"Create index error: {err_msg}");
      }
    }
    catch (Exception ex)
    {
      System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
  }
});
Delete Attribute Indexes on KG Schemas with SchemaBuilder
await QueuedTask.Run(() =>
{
  using (var kg = GetKnowledgeGraph())
  {
    if (kg == null)
      return;

    var entity_name = "PhoneCall";

    //indexes are managed on the GDB objects...
    var entity_table_def = kg.GetDefinition<TableDefinition>(entity_name);
    var entity_table_desc = new TableDescription(entity_table_def);

    var indexes = entity_table_def.GetIndexes();
    foreach (var idx in indexes)
    {
      System.Diagnostics.Debug.WriteLine($"Index {idx.GetName()}");
    }
    var idx1 = indexes.FirstOrDefault(
      idx => idx.GetName().ToLower() == "Index1".ToLower());
    var idx2 = indexes.FirstOrDefault(
      idx => idx.GetName().ToLower() == "Index2".ToLower());

    if (idx1 == null && idx2 == null)
      return;

    //Run the schema builder
    try
    {
      SchemaBuilder sb = new(kg);

      if (idx1 != null)
      {
        var idx_attr = new AttributeIndexDescription(idx1, entity_table_desc);
        sb.Delete(idx_attr);
      }
      if (idx2 != null)
      {
        var idx_attr = new AttributeIndexDescription(idx2, entity_table_desc);
        sb.Delete(idx_attr);
      }

      if (!kg.ApplySchemaEdits(sb))
      {
        var err_msg = string.Join(",", sb.ErrorMessages.ToArray());
        System.Diagnostics.Debug.WriteLine($"Delete index error: {err_msg}");
      }
    }
    catch (Exception ex)
    {
      System.Diagnostics.Debug.WriteLine(ex.ToString());
    }
  }
});
Requirements

Target Platforms: Windows 11, Windows 10

ArcGIS Pro version: 3.1 or higher.
See Also