0
 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 在列中有一些重复项,所以我什至无法运行该命令。我有点困惑。

4

2 回答 2

2

首先,索引以下字段:

TBOM.Component
TBOM.Product 
TComponent_Status.component   
Stock.ProductNumber

并非所有上述索引都可能是必需的(例如,最后两个),但这是一个好的开始。

另外,DISTINCT如果您不是绝对需要它,请删除它。

于 2013-04-10T16:48:26.237 回答
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 子句将被优化,并且 distinct 也将被优化,因为片段已经是索引的一部分。

但是,如果您目前拥有它,如果单个“组件”有 10 个 TBOM 条目,并且该组件有 100 个更改,那么您的结果集中现在有 10 * 100 或 1,000 个条目。拿这个跨越2400万,它肯定不会好看。

于 2013-04-10T17:01:50.563 回答