Skip to content

AxonOps — AI-Native Control Plane for Open Source Data Platforms

SAI Index Tables

The SAI (Storage-Attached Index) virtual tables provide introspection into index state, build progress, and per-SSTable index metadata. Available in Cassandra 5.0+.


SAI indexes are tightly integrated with SSTable storage. These virtual tables expose:

  • Index metadata and queryability status
  • Per-SSTable index information
  • Index segment details for debugging
TablePurpose
sai_column_indexesIndex metadata and build status
sai_sstable_indexesPer-SSTable index info
sai_sstable_index_segmentsDetailed segment metadata

Metadata about SAI indexes including build status.

VIRTUAL TABLE system_views.sai_column_indexes (
keyspace_name text,
index_name text,
table_name text,
column_name text,
analyzer text,
is_building boolean,
is_queryable boolean,
is_string boolean,
PRIMARY KEY (keyspace_name, index_name)
) WITH CLUSTERING ORDER BY (index_name ASC)
ColumnTypeDescription
keyspace_nametextKeyspace name
index_nametextIndex name
table_nametextBase table name
column_nametextIndexed column
analyzertextText analyzer (for string indexes)
is_buildingbooleanIndex currently building
is_queryablebooleanIndex ready for queries
is_stringbooleanString-type index
-- All SAI indexes
SELECT keyspace_name, index_name, table_name, column_name,
is_queryable, is_building
FROM system_views.sai_column_indexes;
-- Indexes currently building
SELECT keyspace_name, index_name, table_name, column_name
FROM system_views.sai_column_indexes
WHERE is_building = true;
-- Non-queryable indexes (building or failed)
SELECT keyspace_name, index_name, is_building
FROM system_views.sai_column_indexes
WHERE is_queryable = false;
-- String indexes (check analyzer column for configured analyzers)
SELECT keyspace_name, index_name, column_name, analyzer
FROM system_views.sai_column_indexes
WHERE is_string = true;
is_queryableis_buildingState
truefalseReady - normal operation
falsetrueBuilding - queries may return partial results
falsefalseFailed or not yet started
truetrueQueryable but rebuild in progress

Per-SSTable SAI index information.

VIRTUAL TABLE system_views.sai_sstable_indexes (
keyspace_name text,
index_name text,
sstable_name text,
table_name text,
column_name text,
cell_count bigint,
min_row_id bigint,
max_row_id bigint,
start_token text,
end_token text,
format_version text,
per_column_disk_size bigint,
per_table_disk_size bigint,
PRIMARY KEY (keyspace_name, index_name, sstable_name)
) WITH CLUSTERING ORDER BY (index_name ASC, sstable_name ASC)
ColumnTypeDescription
keyspace_nametextKeyspace name
index_nametextIndex name
sstable_nametextSSTable identifier
table_nametextBase table
column_nametextIndexed column
cell_countbigintNumber of indexed cells
min_row_idbigintMinimum row ID in index
max_row_idbigintMaximum row ID in index
start_tokentextStart token range
end_tokentextEnd token range
format_versiontextIndex format version
per_column_disk_sizebigintIndex size for this column
per_table_disk_sizebigintTotal index size for table
-- Index size per SSTable
SELECT index_name, sstable_name,
per_column_disk_size / 1048576 AS index_size_mb,
cell_count
FROM system_views.sai_sstable_indexes
WHERE keyspace_name = 'my_keyspace';
-- SSTables with large indexes (> 100 MB)
SELECT keyspace_name, index_name, sstable_name,
per_column_disk_size / 1048576 AS size_mb
FROM system_views.sai_sstable_indexes
WHERE per_column_disk_size > 104857600;

Detailed segment information within SAI indexes. Useful for advanced debugging.

VIRTUAL TABLE system_views.sai_sstable_index_segments (
keyspace_name text,
index_name text,
sstable_name text,
segment_row_id_offset bigint,
table_name text,
column_name text,
cell_count bigint,
min_sstable_row_id bigint,
max_sstable_row_id bigint,
min_term text,
max_term text,
start_token text,
end_token text,
component_metadata map<text, map<text, text>>,
PRIMARY KEY (keyspace_name, index_name, sstable_name, segment_row_id_offset)
) WITH CLUSTERING ORDER BY (index_name ASC, sstable_name ASC, segment_row_id_offset ASC)
ColumnTypeDescription
segment_row_id_offsetbigintSegment offset within SSTable
min_termtextMinimum indexed term
max_termtextMaximum indexed term
cell_countbigintCells in this segment
component_metadatamapDetailed component info
-- Segment distribution for an index
SELECT sstable_name, segment_row_id_offset, cell_count,
min_term, max_term
FROM system_views.sai_sstable_index_segments
WHERE keyspace_name = 'my_keyspace'
AND index_name = 'my_index';
-- Term range analysis
SELECT index_name, min_term, max_term
FROM system_views.sai_sstable_index_segments
WHERE keyspace_name = 'my_keyspace';

-- Monitor index build progress
SELECT keyspace_name, index_name, is_building, is_queryable
FROM system_views.sai_column_indexes
WHERE is_building = true;
-- Track build by watching SSTable coverage
SELECT index_name, sstable_name
FROM system_views.sai_sstable_indexes
WHERE keyspace_name = 'my_keyspace';

Count distinct SSTables per index in application.

-- SAI index sizes by table
SELECT table_name,
per_column_disk_size / 1048576 AS index_mb
FROM system_views.sai_sstable_indexes
WHERE keyspace_name = 'my_keyspace';
-- Table sizes for comparison
SELECT table_name, mebibytes AS table_mb
FROM system_views.disk_usage
WHERE keyspace_name = 'my_keyspace';

Sum index_mb per table in application and compare to table_mb to calculate overhead percentage.

-- Term data for cardinality estimation
SELECT index_name, column_name, min_term
FROM system_views.sai_sstable_index_segments
WHERE keyspace_name = 'my_keyspace';

Count distinct terms per index/column in application for cardinality estimation.


-- Alert: Index not ready for queries
SELECT keyspace_name, index_name, is_building
FROM system_views.sai_column_indexes
WHERE is_queryable = false;
-- Get index sizes for alerting
SELECT keyspace_name, index_name, per_column_disk_size
FROM system_views.sai_sstable_indexes;

Sum sizes per index in application. Alert when total exceeds 10 GB (10737418240 bytes).


Symptoms:

  • is_building = true for extended period
  • is_queryable = false

Investigation:

-- Check indexed SSTables
SELECT sstable_name
FROM system_views.sai_sstable_indexes
WHERE index_name = 'problematic_index';

Count results in application to see how many SSTables are indexed.

Resolution:

  • Check compaction status (builds happen during compaction)
  • Review logs for errors
  • Consider dropping and recreating the index

Symptoms:

  • Queries return fewer results than expected
  • is_queryable = true but is_building = true

Explanation: During index build, queries only search already-indexed SSTables.

-- Check build progress
SELECT index_name, is_queryable, is_building
FROM system_views.sai_column_indexes
WHERE keyspace_name = 'my_keyspace';

Symptoms:

  • Index size approaching or exceeding table size

Investigation:

-- Index to data ratio
SELECT index_name,
per_column_disk_size / 1048576 AS index_mb
FROM system_views.sai_sstable_indexes
WHERE keyspace_name = 'my_keyspace';

Sum index_mb per index in application and compare to table size from disk_usage.

Resolution:

  • Review if index is needed
  • Consider more selective indexing
  • Evaluate alternative data models