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:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user