1.问题描述
Selec count(1) RB_Product 超时,每天39次/天
http://158-2.zhcxkj.com/Log/DBError_2022-04-20.txt
2.问题分析
select count(1)查询里有多余的查询字段和left join连接
3.解决方案
去掉:查询里有多余的查询字段和left join连接,查询很快,
优化后的SQL:
SELECT Count(1)
FROM (SELECT p.ID
FROM dbo.RB_Product (NOLOCK) p
LEFT JOIN RB_Product_Admin pa WITH ( NOLOCK )
ON pa.SKU = p.SKU
AND pa.CustomerID = p.CustomerID
WHERE p.CustomerID = 1
AND p.DeleteStatus = 0
AND p.ProductState IN ( 0, 1, 3, 4, 5 )
AND pa.DevelopStatus = 3
AND pa.EditStatus = 3
AND pa.ImageStatus = 3
AND pa.CheckStatus = 0
AND p.ProductProperty = 1
AND Isnull(p.BrandID, 0) = 0) AS TempCount;
4.超时sql
SELECT Count(1) FROM (SELECT p.ID, p.CustomerID, p.ClientSKU, p.SKU, p.ProductState, p.MinSaleNum, p.ImageUrl, p.ProductProperty, p.WithBattery, p.PlugRelate, p.PlugRelateType, p.ProductGroupSKU, p.ProductName, p.ProductNameCN, p.LastSupplierPrice, p.GrossWeight, p.UnitShipFee, p.LastBuyShipFee, p.SalePrice, p.PackWeight, p.IsGroup, p.OnlineStatus, p.ComeSource AS ComeSource, Isnull(whp.GoodNum, 0) GoodNum, Isnull(whp.AvgDailySales, 0) AvgDailySales, Isnull(wh.WareHouseName, '') DefaultLocalWarehouseName, pa.RecommendValue, pa.AddAdminID, pa.AddAdminName, pa.AddTime, pa.DevelopmentAuditOperatorName, pa.ProductDevelopmentAuditTime, pa.EditAuditOperatorName, pa.ProductEditAuditTime, pa.PictureAuditOperatorName, pa.ProductPictureAuditTime, pa.IsAmazonSale, pa.NoSalePlatform, pa.NoSaleCountry, pa.DevelopStatus, pa.DevelopAdminID, pa.DevelopAdminName, pa.DevelopTime, pa.DevelopRefuseReason, pa.DevelopRefuseTime, pa.AssignDevelopAdminID, pa.AssignDevelopAdminName, pa.AssignDevelopTime, pa.EditStatus, pa.EditAdminID, pa.EditAdminName, pa.EditTime, pa.EditRefuseTime, pa.ToImageMemo, pa.ImageStatus, pa.ImageAdminID, pa.ImageAdminName, pa.ImageTime, pa.ImageRefuseTime, pa.BuyerID, pa.BuyerName, pa.BuyerSetTime, pa.CheckStatus, pa.CheckReason, pa.CheckAdminID, pa.CheckAdminName, pa.CheckTime, pa.OnlineTime, pa.OfflineTime, pa.OfflineAdminID, pa.OfflineAdminName, p.TaxPoint, p.TaxRate, p.IsRawMaterial, Isnull(ProductBadNum, 0) ProductBadNum, Isnull(NumError, 0) NumError, p.ProductType, Isnull(p.IsFBABarCode, 0) IsFBABarCode, Isnull(p.IsRecommendOcean, 0) AS IsRecommendOcean, pd.DeclarationPriceRate, p.IsCheckDeclarationCode, p.IsCheckTransport, p.LastBuyPrice, pa.PriceSpecialistOperatTime, Isnull(p.DefaultLocalWarehouse, 0) AS DefaultLocalWareHouse, p.DevelopType, p.AppointDevelopType, p.PictureSource, p.PreclassStatus, p.PreclassGoodsCode, p.ImitatingBrandRemark, p.ProductStateRemarks, p.ClassID1, p.ClassID2, p.ClassID, p.BeginTime, p.EndTime, p.ProdutcArrivalDate, Isnull(pa.PhotographerId, 0) PhotographerId, Isnull(pa.PhotographerName, '') PhotographerName, pa.PhotographerTime, pa.WrapDesignerId, pa.WrapDesignerName, pa.WrapDesignerTime, pa.ImageDesignerId, pa.ImageDesignerName, pa.ImageDesignerTime, pa.IntellectualPropertyRightsAdminID, pa.IntellectualPropertyRightsAdminName, pa.IntellectualPropertyRightsTime, Isnull(p.EditNum, 0) EditNum, p.IsNeedCeCertification FROM dbo.RB_Product (NOLOCK) p LEFT JOIN RB_Product_Admin pa WITH ( NOLOCK ) ON pa.SKU = p.SKU AND pa.CustomerID = p.CustomerID LEFT JOIN RB_WareHouse_Product whp WITH ( NOLOCK ) ON whp.SKU = p.SKU AND whp.CustomerID = p.CustomerID AND whp.WareHouseID = ( CASE p.DefaultLocalWarehouse WHEN 0 THEN 5312 WHEN NULL THEN 5312 ELSE p.DefaultLocalWarehouse END ) AND EXISTS (SELECT 1 FROM RB_WareHouse WHERE whp.WareHouseID = RB_WareHouse.ID AND whp.CustomerID = RB_WareHouse.CustomerID AND RB_WareHouse.WareHouseType = 1) LEFT JOIN RB_WareHouse wh (NOLOCK) ON p.CustomerID = wh.CustomerID AND p.DefaultLocalWarehouse = wh.ID AND wh.IsActive = 1 LEFT JOIN (SELECT CustomerID, SKU, Sum(BadNum) AS ProductBadNum FROM RB_Procurement_Detail_BadList WITH ( NOLOCK ) WHERE BadNum > 0 AND DType = 1 GROUP BY CustomerID, SKU) AS RB_Procurement_Detail_BadList ON p.SKU = RB_Procurement_Detail_BadList.SKU AND p.CustomerID = RB_Procurement_Detail_BadList.CustomerID LEFT JOIN (SELECT CustomerID, SKU, Sum(NumError) AS NumError FROM RB_ProductManageLog WITH ( NOLOCK ) WHERE NumError > 0 GROUP BY CustomerID, SKU) AS RB_ProductManageLog ON p.SKU = RB_ProductManageLog.SKU AND p.CustomerID = RB_ProductManageLog.CustomerID LEFT JOIN RB_Product_Declaration pd ( NOLOCK ) ON p.CustomerID = pd.CustomerID AND p.SKU = pd.SKU WHERE p.CustomerID = 1 AND p.DeleteStatus = 0 AND p.ProductState IN ( 0, 1, 3, 4, 5 ) AND pa.DevelopStatus = 3 AND pa.EditStatus = 3 AND pa.ImageStatus = 3 AND pa.CheckStatus = 0 AND p.ProductProperty = 1 AND Isnull(p.BrandID, 0) = 0) AS TempCount;

3.解决方案
去掉:查询里有多余的查询字段和left join连接,查询很快,