La empresa para la que trabajo utiliza una empresa de terceros para administrar/desarrollar nuestra base de datos de comercio electrónico y nuestra API. Solo tengo acceso de lectura a la base de datos, pero con acceso de lectura, puedo consultar todos los productos y obtener lo que necesito en aproximadamente 1 segundo.
En nuestro backend usamos GraphQL para comunicarnos con la API y extraer todos los productos de la API toma 15 segundos, está lleno de errores y es inaceptable.
Tengo una consulta de selección bastante compleja que escribí que quiero probar e implementar usando typeorm. Solo necesito esta consulta para la aplicación.
select a.Disabled, a.recordnumber ItemID, CASE WHEN c.ParentID IS NOT NULL THEN 'IS Parent' ELSE 'IS NOT Parent' END AS ParentItem, a.SKU, b.ProductName, b.Description, a.Image MainImage, b.LanguageCode, a.CategoryID, a.SortOrder, a.Weight, a.Height, a.Length, a.Width, a.last_modified, a.FlagCancer, a.FlagBirthDefects, d.recordnumber DiscountID, d.last_modified DiscountIDUpdated, e.AssociateTypeID PriceGroupID, f.OrderTypeID, g.RegionID, h.StoreID, d.Start DiscountStart, d.[End] DiscountEnd, d.Price, d.PriceCurrency, d.CV, d.QV, d.RewardPointsEarned RewardPoints from INV_Inventory a join INV_LanguageValues b on a.recordnumber = b.ItemID left join ( select a.ItemID ParentID from INV_OptionItemsKeys a group by a.ItemID ) c on a.recordnumber = c.ParentID join INV_Discounts d on a.recordnumber = d.ItemID join INV_Discount_ATypes e on d.recordnumber = e.DiscountID join INV_Discount_OrderTypes f on d.recordnumber = f.DiscountID join INV_Discount_Regions g on d.recordnumber = g.DiscountID join INV_Discount_StoreMap h on d.recordnumber = h.DiscountID where c.ParentID is not null and b.LanguageCode = 'en' and g.RegionID = 1Si tiene alguna idea mejor sobre cómo hacer esto, definitivamente soy todo oídos y agradecería cualquier ayuda.
(Por favor, no reutilice un alias ( a ); hace que sea difícil seguir el SQL).
Considere la siguiente modificación. En lugar de esta expresión
CASE WHEN c.ParentID IS NOT NULL THEN 'IS Parent' ELSE 'IS NOT Parent' END AS ParentItem, más esta LEFT JOIN
left join ( SELECT a.ItemID ParentID from INV_OptionItemsKeys a group by a.ItemID ) c ON a.recordnumber = c.ParentIDSolo tienes esta expresión:
IF ( EXISTS( SELECT 1 FROM INV_OptionItemsKeys WHERE ItemID = a.recordnumber ), 'IS Parent', 'IS NOT Parent' ) AS ParentItem,(Tal vez eso se pueda modificar mediante ingeniería inversa para tipificar).
Por otro lado, dado que tiene c.ParentID is not null , IS Parent siempre es el caso?
Algunos de estos índices pueden ser útiles:
b: INDEX(LanguageCode, ItemID, ProductName, Description) d: INDEX(ItemID) e: INDEX(DiscountID, AssociateTypeID) f: INDEX(DiscountID, OrderTypeID) g: INDEX(RegionID, DiscountID) h: INDEX(DiscountID, StoreID) INV_OptionItemsKeys INDEX(ItemID)