首页 新闻 会员 周边 捐助

SQL语句优化

0
悬赏园豆:20 [待解决问题]

a表有4000条数据,b表有100000条数据,然后要 a left join b之后对结果分组,分组之后只有2千多条数据,查询需要20秒秒,索引也都加了,还要什么优化的?

具体sql如下:

SELECT P.T_PROJECT_NUM, P.Phd_ProjectName, P.M_PRODUCT_NUM, P.M_PRODUCT_DESC, P.T_INVENTORY_ITEM_CODE
, P.T_ITEM_DESCRIPTION, P.T_PRIMARY_UNIT_OF_MEASURE, SUM(P.T_PRIMARY_QUANTITY) AS MaterialCount
FROM (
SELECT T_PROJECT_NUM, Phd_ProjectName, M_PRODUCT_NUM, M_PRODUCT_DESC, T_INVENTORY_ITEM_CODE
, T_ITEM_DESCRIPTION, T_PRIMARY_UNIT_OF_MEASURE, T_PRIMARY_QUANTITY
FROM ERP_INV_InquiryMtlTransaction
LEFT JOIN BP_MDM_Material ON T_INVENTORY_ITEM_CODE = M_MATERIAL_CODE
LEFT JOIN T_ProjectHisDoc
ON (Phd_ProjectNumber = T_PROJECT_NUM
OR Phd_ProjectNumber15 = T_PROJECT_NUM)
) P
GROUP BY P.T_PROJECT_NUM, P.Phd_ProjectName, P.M_PRODUCT_NUM, P.M_PRODUCT_DESC, P.T_INVENTORY_ITEM_CODE, P.T_ITEM_DESCRIPTION, P.T_PRIMARY_UNIT_OF_MEASURE

好像没有走索引查询

灬丶的主页 灬丶 | 初学一级 | 园豆:3
提问于:2019-12-11 16:26

当数据量较大时,应该用较小的那张表做驱动 表, 数据量大的做为被驱动表 这样在查询时间上会有很大的节省时间

一支会记忆的笔 5年前

@一支会记忆的笔: 什么意思?我用表小的左连接表大的不对?

灬丶 5年前

join查询在有索引条件下 ,驱动表有索引不会使用到索引,被驱动表建立索引会使用到索引,在以小表驱动大表的情况下,再给大表建立索引会大大提高执行速度

一支会记忆的笔 5年前

@一支会记忆的笔: 那我应该用表大的right join 表小的?

灬丶 5年前

@灬丶: 例如:
A是小表,B是大表   
使用left join 时,则应该这样写select * from A a left join B b on a.code=b.code   
A表时驱动表,B表是被驱动表

一支会记忆的笔 5年前

@一支会记忆的笔: 我原来就是这样写的,我判断了下,应该是or的原因
LEFT JOIN T_ProjectHisDoc
ON (Phd_ProjectNumber = T_PROJECT_NUM
OR Phd_ProjectNumber15 = T_PROJECT_NUM

灬丶 5年前

@灬丶: 你在试试 我觉得这样是ok 的

一支会记忆的笔 5年前

@一支会记忆的笔: 我开始写的就是你说的这样的,不理想,我刚把那个or语句那部分去掉之后执行速度就变快了

灬丶 5年前
< >
分享
所有回答(1)
0

group by 就为了统计数量,应该可以去掉一些多余的列。 用with先 查出 主键,数据 的table结果。再关联这个table
最外面的select 多余,可以去掉。

geass.. | 园豆:1821 (小虾三级) | 2019-12-11 17:42

什么意思,看不懂。。。。

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2019-12-11 17:43

@灬丶: with t as(
select T_INVENTORY_ITEM_CODE,T_PROJECT_NUM,sum(T_PRIMARY_QUANTITY) T_PRIMARY_QUANTITY from ERP_INV_InquiryMtlTransaction GROUP BY T_INVENTORY_ITEM_CODE,T_PROJECT_NUM
)
select t.T_PROJECT_NUM, Phd_ProjectName, M_PRODUCT_NUM, M_PRODUCT_DESC, t.T_INVENTORY_ITEM_CODE
, T_ITEM_DESCRIPTION, T_PRIMARY_UNIT_OF_MEASURE,t.T_PRIMARY_QUANTITY
FROM ERP_INV_InquiryMtlTransaction a inner join t on t.T_INVENTORY_ITEM_CODE=a.T_INVENTORY_ITEM_CODE and a.T_PROJECT_NUM=t.T_PROJECT_NUM
LEFT JOIN BP_MDM_Material ON T_INVENTORY_ITEM_CODE = M_MATERIAL_CODE
LEFT JOIN T_ProjectHisDoc
ON (Phd_ProjectNumber = T_PROJECT_NUM
OR Phd_ProjectNumber15 = T_PROJECT_NUM

支持(0) 反对(0) geass.. | 园豆:1821 (小虾三级) | 2019-12-11 17:47

@灬丶: 不清楚你用到的表的结构,写得不对

支持(0) 反对(0) geass.. | 园豆:1821 (小虾三级) | 2019-12-11 17:56

@geass..: 我刚百度了下,with as好像只是说让sql可读性提高,没有说什么效率会提示

支持(0) 反对(0) 灬丶 | 园豆:3 (初学一级) | 2019-12-12 08:58

@灬丶: 个人习惯。优化首先拆分复杂查询语句成多条查询,统计每条查询花的时间,再针对性。

支持(0) 反对(0) geass.. | 园豆:1821 (小虾三级) | 2019-12-12 16:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册