【发布时间】:2015-02-22 16:01:51
【问题描述】:
SELECT p.*
FROM (
SELECT ProductID,ProductName,ProductCode,SampleRefNum
FROM products
WHERE hidden = 'N'
UNION ALL
SELECT product_variants.ProductID,products.ProductName,product_variants.ProductCode,product_variants.SampleRefNum
FROM product_variants
JOIN products
ON product_variants.ProductID = products.ProductID
) AS p
LEFT JOIN stock_list AS s
ON p.ProductCode = s.ProductCode OR p.SampleRefNum = s.SampleRefNum
WHERE s.ProductCode IS NULL AND p.ProductCode IS NOT NULL AND p.ProductCode <> "" OR s.SampleRefNum IS NULL AND p.SampleRefNum IS NOT NULL AND p.SampleRefNum <> ""
上面的查询非常慢,1分钟。如果我只是快速完成工会部分。或者只使用 products 表而不联合它的快
(我在这里做什么?) 产品有变体,因此我将产品和产品变体结合起来,以获得具有产品代码和示例参考编号的项目列表。 然后我加入库存列表(包含大约 50 000 行产品代码和来自另一个系统的示例参考代码的表),所以我可以获得没有匹配 ProductCode 或 SampleRefNum 的任何记录的列表
------------编辑
我在所有表上都有 ProductID、ProductCode、SampleRefNum 索引
-- 这很快 -----
SELECT p.ProductID,p.ProductName,p.ProductCode,p.SampleRefNum FROM products AS p
LEFT JOIN stock_list AS s
ON p.ProductCode = s.ProductCode OR p.SampleRefNum = s.SampleRefNum
WHERE p.Hidden = 'N' AND (s.ProductCode IS NULL AND p.ProductCode IS NOT NULL AND p.ProductCode <> "" OR s.SampleRefNum IS NULL AND p.SampleRefNum IS NOT NULL AND p.SampleRefNum <> "" )
AND (p.ProductID NOT IN(SELECT ProductID FROM product_variants) )
--- 这需要 10 秒
SELECT p.*
FROM (
SELECT ProductID,ProductName,ProductCode,SampleRefNum
FROM products
WHERE hidden = 'N'
) AS p
LEFT JOIN stock_list AS s
ON p.ProductCode = s.ProductCode OR p.SampleRefNum = s.SampleRefNum
WHERE s.ProductCode IS NULL AND p.ProductCode IS NOT NULL AND p.ProductCode <> "" OR s.SampleRefNum IS NULL AND p.SampleRefNum IS NOT NULL AND p.SampleRefNum <> ""
【问题讨论】:
-
你能发布解释计划吗?你检查过索引吗?
-
如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。