SELECT DISTINCT `Stock`.`ProductNumber`,`Stock`.`Description`,`TComponent_Status`.`component`, `TComponent_Status`.`certificate`,`TComponent_Status`.`status`,`TComponent_Status`.`date_created`
FROM Stock , TBOM , TComponent_Status
WHERE `TBOM`.`Component` = `TComponent_Status`.`component`
AND `Stock`.`ProductNumber` = `TBOM`.`Product`
基本上表TBOM有:
24,588,820行
查询速度非常慢,我不太清楚我能做些什么才能让它变得更好。我已经在查询中索引了所有其他表,但TBOM在列中有一些重复,所以我甚至无法运行该命令。我有点困惑。
答案 0 :(得分:2)
首先,索引以下字段:
TBOM.Component
TBOM.Product
TComponent_Status.component
Stock.ProductNumber
并非所有上述索引都是必要的(例如,最后两个),但这是一个良好的开端。
另外,如果您不完全需要,请删除DISTINCT
。
答案 1 :(得分:0)
我唯一能想到的就是在你的Stock表上有一个索引
(ProductNumber, Description)
这可以通过两种方式提供帮助。由于您只在查询中使用这两个字段,因此引擎不需要转到每个库存记录的完整数据行,因为两个部分都在索引中,它可以使用它。此外,您正在进行DISTINCT,因此有可用于帮助优化DISTINCTness的索引也应该有所帮助。
现在,另一个问题是时间问题。由于您从库存到产品到产品状态不同,您要求所有2400万TBOM项目(假设物料清单),并且每个BOM组件可以创建多个状态,您将获得每个组件的每个BOM更改。
如果您真正想要的是类似于任何组件项目的最新更改,您可能想要反向...这样的事情......
SELECT DISTINCT
Stock.ProductNumber,
Stock.Description,
JustThese.component,
JustThese.certificate,
JustThese.`status`,
JustThese.date_created
FROM
( select DISTINCT
TCS.Component,
TCS.Certificate,
TCS.`staus`,
TCS.date_created
from
TComponent_Status TCS
where
TCS.date_created >= 'some date you want to limit based upon' ) as JustThese
JOIN TBOM
on JustThese.Component = TBOM.Component
JOIN Stock
on TBOM.Product = Stock.Product
如果是这种情况,我会确保组件状态表上的索引,例如 (date_created,component,certificate,status,date_created)作为索引。这样,WHERE子句将被优化,并且由于片段已经是索引的一部分,因此也是不同的。
但是,您目前如何拥有它,如果您有一个“组件”的10个TBOM条目,并且该组件有100个更改,您现在在结果集中有10 * 100或1,000个条目。拿这个,跨越2400万,它绝对不会好看。