【发布时间】:2015-06-23 15:22:58
【问题描述】:
我的一个查询存在性能问题。
慢查询:
SELECT
Stock.StockID,
Stock.sku AS SKU,
Stock.ProductName AS PRODUCT,
SUM(OrderItems.[quantity-purchased]) AS Qty
FROM
Orders, OrderItems, CMRC_Stock as Stock
WHERE
Orders.[status] = 'PRINTED' AND
Orders.[order-id] = OrderItems.[order-id] AND
(Stock.SKU = OrderItems.SKU OR
OrderItems.sku IN (SELECT SKU FROM AlternateSKUS WHERE StockID = Stock.StockID) OR
Stock.BarCode = OrderItems.SKU) AND
Orders.channelId != 21
GROUP BY Stock.StockID, Stock.sku, Stock.ProductName
ORDER BY Qty DESC, Stock.sku
返回结果大约需要 11 秒。
我试图优化查询,从 WHERE 子句中删除嵌套的 SELECT 并想出了这个:
SELECT
Stock.StockID,
Stock.sku AS SKU,
Stock.ProductName AS PRODUCT,
SUM(OrderItems.[quantity-purchased]) AS Qty
FROM
Orders
FULL OUTER JOIN OrderItems ON Orders.[order-id] = OrderItems.[order-id]
LEFT OUTER JOIN CMRC_Stock as Stock ON OrderItems.sku = Stock.SKU
LEFT OUTER JOIN AlternateSKUS ON AlternateSKUS.StockID = Stock.StockID
WHERE
Orders.[status] = 'PRINTED' AND
(Stock.SKU = OrderItems.SKU OR
AlternateSKUS.SKU = OrderItems.sku OR
Stock.BarCode = OrderItems.SKU) AND
Orders.channelId != 21
GROUP BY Stock.StockID, Stock.sku, Stock.ProductName
ORDER BY Qty DESC, Stock.sku
它的运行速度要快得多
但是有一个问题。看来我的 SUM() 函数存在递归问题,因为它将正确的数量乘以相同 StockID 存在的“AlternateSKU”记录数。
例如,如果有 1 个订单,对于 1 个 OrderItem,则将其 (QTY) 计为 4,因为它有 4 个 AlternateSKU。如果为同一商品购买了 2 个数量,则 QTY 将返回 8。如果同一 OrderItem 有其他订单,则商品数量乘以该商品的 AlternateSKU 记录数量。 E.G 3 个单独的 OrderItems 属于单独的 Orders 将产生 12 个相同商品的数量。
我意识到这最终归结于设计不佳的架构,但是我必须使用我所拥有的。
我该如何解决这个问题?
【问题讨论】:
-
在编写查询时始终使用显式连接 (table1 INNER JOIN table2 ON)。使用“table1,table2,table3”语法会导致笛卡尔积错误。
-
@Jeremy,您能详细说明一下吗?我的 SQL 经验相当基础。
-
Here 很好地解释了@Jeremy 所指的 JOIN 语法问题。
-
啊,对了,明白了。感谢您的提示。
标签: sql sql-server database performance