perf(pos): eliminar JOIN vehicle_parts de queries de navegacion

vehicle_parts tiene 14B+ rows. Las queries de brands, models, years,
engines ahora solo usan model_year_engine (mucho mas rapido).
vehicle_parts solo se consulta para categories/groups/parts donde
se filtra por un mye_id especifico.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 22:16:31 +00:00
parent a3abb6d3a8
commit d5569d0cb6

View File

@@ -18,23 +18,13 @@ import re
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
def get_brands(master_conn): def get_brands(master_conn):
"""Get all vehicle brands that have at least one part in the catalog. """Get all vehicle brands that have MYE entries (fast, no vehicle_parts scan)."""
Uses EXISTS on model_year_engine + vehicle_parts to avoid scanning
vehicle_parts fully. The subquery stops at the first match per brand.
"""
cur = master_conn.cursor() cur = master_conn.cursor()
cur.execute(""" cur.execute("""
SELECT DISTINCT b.id_brand, b.name_brand SELECT DISTINCT b.id_brand, b.name_brand
FROM brands b FROM brands b
WHERE EXISTS ( JOIN models m ON m.brand_id = b.id_brand
SELECT 1 JOIN model_year_engine mye ON mye.model_id = m.id_model
FROM models m
JOIN model_year_engine mye ON mye.model_id = m.id_model
JOIN vehicle_parts vp ON vp.model_year_engine_id = mye.id_mye
WHERE m.brand_id = b.id_brand
LIMIT 1
)
ORDER BY b.name_brand ORDER BY b.name_brand
""") """)
rows = cur.fetchall() rows = cur.fetchall()
@@ -43,19 +33,13 @@ def get_brands(master_conn):
def get_models(master_conn, brand_id): def get_models(master_conn, brand_id):
"""Get models for a brand that have at least one MYE with parts.""" """Get models for a brand that have MYE entries (fast, no vehicle_parts scan)."""
cur = master_conn.cursor() cur = master_conn.cursor()
cur.execute(""" cur.execute("""
SELECT DISTINCT m.id_model, m.name_model SELECT DISTINCT m.id_model, m.name_model
FROM models m FROM models m
JOIN model_year_engine mye ON mye.model_id = m.id_model
WHERE m.brand_id = %s WHERE m.brand_id = %s
AND EXISTS (
SELECT 1
FROM model_year_engine mye
JOIN vehicle_parts vp ON vp.model_year_engine_id = mye.id_mye
WHERE mye.model_id = m.id_model
LIMIT 1
)
ORDER BY m.name_model ORDER BY m.name_model
""", (brand_id,)) """, (brand_id,))
rows = cur.fetchall() rows = cur.fetchall()
@@ -64,19 +48,13 @@ def get_models(master_conn, brand_id):
def get_years(master_conn, model_id): def get_years(master_conn, model_id):
"""Get distinct years for a model (via MYE) that have parts. Ordered DESC.""" """Get distinct years for a model via MYE (fast, no vehicle_parts scan). Ordered DESC."""
cur = master_conn.cursor() cur = master_conn.cursor()
cur.execute(""" cur.execute("""
SELECT DISTINCT y.id_year, y.year_car SELECT DISTINCT y.id_year, y.year_car
FROM years y FROM years y
JOIN model_year_engine mye ON mye.year_id = y.id_year JOIN model_year_engine mye ON mye.year_id = y.id_year
WHERE mye.model_id = %s WHERE mye.model_id = %s
AND EXISTS (
SELECT 1
FROM vehicle_parts vp
WHERE vp.model_year_engine_id = mye.id_mye
LIMIT 1
)
ORDER BY y.year_car DESC ORDER BY y.year_car DESC
""", (model_id,)) """, (model_id,))
rows = cur.fetchall() rows = cur.fetchall()
@@ -85,19 +63,13 @@ def get_years(master_conn, model_id):
def get_engines(master_conn, model_id, year_id): def get_engines(master_conn, model_id, year_id):
"""Get MYE entries (engine + trim) for a model+year combo that have parts.""" """Get MYE entries (engine + trim) for a model+year combo."""
cur = master_conn.cursor() cur = master_conn.cursor()
cur.execute(""" cur.execute("""
SELECT mye.id_mye, e.name_engine, mye.trim_level SELECT mye.id_mye, e.name_engine, mye.trim_level
FROM model_year_engine mye FROM model_year_engine mye
JOIN engines e ON e.id_engine = mye.engine_id JOIN engines e ON e.id_engine = mye.engine_id
WHERE mye.model_id = %s AND mye.year_id = %s WHERE mye.model_id = %s AND mye.year_id = %s
AND EXISTS (
SELECT 1
FROM vehicle_parts vp
WHERE vp.model_year_engine_id = mye.id_mye
LIMIT 1
)
ORDER BY e.name_engine, mye.trim_level ORDER BY e.name_engine, mye.trim_level
""", (model_id, year_id)) """, (model_id, year_id))
rows = cur.fetchall() rows = cur.fetchall()