Skip to content

Conversation

@jrgemignani
Copy link
Contributor

NOTE: This work was done with an AI coding tool and a human.

Replace sequential table scans with index-based lookups for single-row vertex operations in the unified vertex table architecture. This improves performance from O(n) to O(log n) for vertex existence checks, retrievals, updates, and deletions.

Changes:

  • vertex_exists() in cypher_utils.c: Use systable_beginscan() with the primary key index instead of table_beginscan()
  • get_vertex() in agtype.c: Use index scan for startNode()/endNode() vertex retrieval
  • process_delete_list() in cypher_delete.c: Use index scan for vertex lookups; fix scan key comparison from F_GRAPHIDEQ to F_INT8EQ since unified vertex table stores id as bigint, not graphid
  • process_update_list() in cypher_set.c: Use index scan for SET/REMOVE operations

Add cache-first lookup optimization:

  • _label_name_from_table_oid() in ag_label.c: Check label relation cache before falling back to syscache lookup, reducing catalog overhead for repeated label name lookups

All changes use RelationGetIndexList() with rd_pkindex to obtain the primary key index OID for systable_beginscan().

Added regression tests.

modified: regress/expected/unified_vertex_table.out
modified: regress/sql/unified_vertex_table.sql
modified: src/backend/catalog/ag_label.c
modified: src/backend/executor/cypher_delete.c
modified: src/backend/executor/cypher_set.c
modified: src/backend/executor/cypher_utils.c
modified: src/backend/utils/adt/agtype.c

NOTE: This work was done with an AI coding tool and a human.

Replace sequential table scans with index-based lookups for single-row
vertex operations in the unified vertex table architecture. This improves
performance from O(n) to O(log n) for vertex existence checks, retrievals,
updates, and deletions.

Changes:

* vertex_exists() in cypher_utils.c: Use systable_beginscan() with the
  primary key index instead of table_beginscan()
* get_vertex() in agtype.c: Use index scan for startNode()/endNode()
  vertex retrieval
* process_delete_list() in cypher_delete.c: Use index scan for vertex
  lookups; fix scan key comparison from F_GRAPHIDEQ to F_INT8EQ since
  unified vertex table stores id as bigint, not graphid
* process_update_list() in cypher_set.c: Use index scan for SET/REMOVE
  operations

Add cache-first lookup optimization:

* _label_name_from_table_oid() in ag_label.c: Check label relation cache
  before falling back to syscache lookup, reducing catalog overhead for
  repeated label name lookups

All changes use RelationGetIndexList() with rd_pkindex to obtain the
primary key index OID for systable_beginscan().

Added regression tests.

modified:   regress/expected/unified_vertex_table.out
modified:   regress/sql/unified_vertex_table.sql
modified:   src/backend/catalog/ag_label.c
modified:   src/backend/executor/cypher_delete.c
modified:   src/backend/executor/cypher_set.c
modified:   src/backend/executor/cypher_utils.c
modified:   src/backend/utils/adt/agtype.c
@github-actions github-actions bot added the override-stale To keep issues/PRs untouched from stale action label Dec 20, 2025
@jrgemignani jrgemignani merged commit 72a4bca into apache:Dev_Multiple_Labels Dec 20, 2025
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

override-stale To keep issues/PRs untouched from stale action

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant