The low-level Commerce DTO API is not automatically fast: counting the database round trips per imported row, and four fixes I would apply first.
Committing a 250,000-row Optimizely catalog import row by row, returning a per-row failure report, and coalescing catalog events into one per batch.
Upserting a catalog entry through CatalogContext and MetaDataPlus: ContentGuid, the meta class seam, response groups, and a create path that rolls back.
Why bulk catalog writes in Optimizely Commerce belong on the DTO API rather than IContentRepository — measured 2.7-3.3x faster, and what it costs you.
What I learned shipping a Blazor Server UI inside Optimizely CMS 13 — Razor components in a NuGet package, the Blazor hub next to MapContent(), prerendering.