From f3daf1cad7f4c2f5c189cf93d0ac9f05b62a566f Mon Sep 17 00:00:00 2001 From: mrrajan <86094767+mrrajan@users.noreply.github.com.> Date: Wed, 10 Jun 2026 17:10:15 +0530 Subject: [PATCH] perf(db): add index on sbom_external_node(sbom_id, external_node_ref) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eliminates sequential scan during external node resolution. Verified: Seq Scan → Index Scan on hosted environment. Implements TC-4750 Assisted-by: Claude Code --- migration/src/lib.rs | 2 + .../m0002200_sbom_external_node_ref_index.rs | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 migration/src/m0002200_sbom_external_node_ref_index.rs diff --git a/migration/src/lib.rs b/migration/src/lib.rs index f40c951a8..1e277c688 100644 --- a/migration/src/lib.rs +++ b/migration/src/lib.rs @@ -58,6 +58,7 @@ mod m0002160_fix_ref_fk; mod m0002170_drop_cvss_tables; mod m0002180_advisory_fk_indexes; mod m0002190_vulnerability_base_score_advisory; +mod m0002200_sbom_external_node_ref_index; pub trait MigratorExt: Send { fn build_migrations() -> Migrations; @@ -132,6 +133,7 @@ impl MigratorExt for Migrator { .normal(m0002170_drop_cvss_tables::Migration) .normal(m0002180_advisory_fk_indexes::Migration) .normal(m0002190_vulnerability_base_score_advisory::Migration) + .normal(m0002200_sbom_external_node_ref_index::Migration) } } diff --git a/migration/src/m0002200_sbom_external_node_ref_index.rs b/migration/src/m0002200_sbom_external_node_ref_index.rs new file mode 100644 index 000000000..4052a9dc6 --- /dev/null +++ b/migration/src/m0002200_sbom_external_node_ref_index.rs @@ -0,0 +1,50 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +#[allow(deprecated)] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_index( + Index::create() + .if_not_exists() + .table(SbomExternalNode::Table) + .name(Indexes::IdxSbomExternalNodeRef.to_string()) + .col(SbomExternalNode::SbomId) + .col(SbomExternalNode::ExternalNodeRef) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_index( + Index::drop() + .if_exists() + .table(SbomExternalNode::Table) + .name(Indexes::IdxSbomExternalNodeRef.to_string()) + .to_owned(), + ) + .await?; + + Ok(()) + } +} + +#[derive(DeriveIden)] +enum Indexes { + IdxSbomExternalNodeRef, +} + +#[derive(DeriveIden)] +enum SbomExternalNode { + Table, + SbomId, + ExternalNodeRef, +}