#mysql #case #sql-query-store
Вопрос:
В моем запросе мне нужно добавить регистр для нескольких условий , но после добавления регистра это замедляет мой запрос , без регистра он занимает максимум 60 мс, но в случае, если он занимает до 700 мс, Я хочу сделать это быстро, потому что он будет работать на всех типах мобильных устройств, таких как 1 ГБ или с 2 ГБ оперативной памяти, и так далее, пожалуйста, направьте меня
запрос с регистром
SELECT sku.skuid AS _id ,
sku.skudescription,
sku.skushortdescription,
sku.skucode,
sku.piecesincarton,
sku.piecesinvirtualpack,
sku.invoicepricetodistributor,
sku.salestaxtodistributor,
sku.totalpricetodistributor,
sku.distributorsellingprice,
sku.retailpriceexcltax,
sku.salestax,
sku.totalpriceincltax,
sku.distributortotalprice,
sku.distributorsellingpriceur,
sku.distributorsalestax,
sku.distributortotalpriceur,
sku.distributorsalestaxur,
sku.skuimage,
sku.skuvariantid,
sku.skupricepointid,
sku.skupacksizeid,
sku.skupacktypeid,
sku.skuexempted,
sc.channelid,
si.remainingpieces,
sc.sellingpricelevelid,
sc.distributorid,
sc.buyingpricelevelid,
mss.masterskusid,
mss.manufacturerid,
mss.businessunitid,
mss.categoryid,
mss.brandid,
ms.typeid,
top.rank AS skurank
FROM skus AS sku
INNER JOIN skuchannels AS sc
ON sku.skuid= sc.skuid
AND sku.distributorid = sc.distributorid
AND sku.skupricelevelid = sc.sellingpricelevelid
INNER JOIN pjpbrand AS pb
ON pb.brandid = sku.brandid
INNER JOIN pjp AS p
ON p.pjpid = pb.pjpid
AND p.distributorid = sku.distributorid
LEFT JOIN distributormustsells AS ms
ON ms.channelid = sc.channelid
LEFT JOIN distributormustsellskus AS mss
ON
CASE
WHEN ms.typeid = 0 THEN mss.masterskusid = sku.masterskuid
WHEN ms.typeid = 1 THEN mss.manufacturerid = sku.manufacturerid
WHEN ms.typeid = 2 THEN mss.businessunitid = sku.bussinessunitid
WHEN ms.typeid = 3 THEN mss.categoryid = sku.categoryid
WHEN ms.typeid = 4 THEN mss.brandid = sku.brandid
ELSE mss.skuid = sku.skuid
END
LEFT JOIN topsellingskus AS TOP
ON top.skuid = sku.skuid
LEFT JOIN skuinventory AS si
ON si.skuid = sku.skuid
INNER JOIN obstores AS ob
where sc.channelid = 9
AND sku.distributorid = 70000472
AND ob.storeid = 24177
AND mss.distributorMustSellId = 28437
AND pb.pjpid = 3357
GROUP BY sku.skuid
ORDER BY skurank IS NULL,
skurank
И без дела
SELECT sku.skuid AS _id ,
sku.skudescription,
sku.skushortdescription,
sku.skucode,
sku.piecesincarton,
sku.piecesinvirtualpack,
sku.invoicepricetodistributor,
sku.salestaxtodistributor,
sku.totalpricetodistributor,
sku.distributorsellingprice,
sku.retailpriceexcltax,
sku.salestax,
sku.totalpriceincltax,
sku.distributortotalprice,
sku.distributorsellingpriceur,
sku.distributorsalestax,
sku.distributortotalpriceur,
sku.distributorsalestaxur,
sku.skuimage,
sku.skuvariantid,
sku.skupricepointid,
sku.skupacksizeid,
sku.skupacktypeid,
sku.skuexempted,
sc.channelid,
si.remainingpieces,
sc.sellingpricelevelid,
sc.distributorid,
sc.buyingpricelevelid,
mss.masterskusid,
mss.manufacturerid,
mss.businessunitid,
mss.categoryid,
mss.brandid,
ms.typeid,
top.rank AS skurank
FROM skus AS sku
INNER JOIN skuchannels AS sc
ON sku.skuid= sc.skuid
AND sku.distributorid = sc.distributorid
AND sku.skupricelevelid = sc.sellingpricelevelid
INNER JOIN pjpbrand AS pb
ON pb.brandid = sku.brandid
INNER JOIN pjp AS p
ON p.pjpid = pb.pjpid
AND p.distributorid = sku.distributorid
LEFT JOIN distributormustsells AS ms
ON ms.channelid = sc.channelid
LEFT JOIN distributormustsellskus AS mss
ON
mss.skuid = sku.skuid
LEFT JOIN topsellingskus AS TOP
ON top.skuid = sku.skuid
LEFT JOIN skuinventory AS si
ON si.skuid = sku.skuid
INNER JOIN obstores AS ob
where sc.channelid = 9
AND sku.distributorid = 70000472
AND ob.storeid = 24177
AND mss.distributorMustSellId = 28437
AND pb.pjpid = 3357
GROUP BY sku.skuid
ORDER BY skurank IS NULL,
skurank
Комментарии:
1. без регистра это займет максимум 60 мс, но с регистром это займет до 700 мс, вы можете попробовать: разделить запрос на 6 запросов с одним параметром из функции CASE каждый и ОБЪЕДИНИТЬ ВСЕ; преобразовать РЕГИСТР в 6 выражений в сочетании с ИЛИ. PS.
INNER JOIN obstores AS ob
не имеет предложения ON — заменить ПЕРЕКРЕСТНЫМ СОЕДИНЕНИЕМ.