sql 语句优化

[复制链接]
查看11 | 回复8 | 2007-1-24 12:58:48 | 显示全部楼层 |阅读模式
请各位看看下面的sql语句,会不会有性能上的问题
最主要的TD_GROUP_CUSTPRODUCT_REF表大概有100w条记录,不会有增长。
虽然看着有点眼晕,但还是希望各位能给点建议,因为我不想挨骂
在线等!
----
select distinct
TD_GROUP_CUSTPRODUCT_REF.GROUP_PRO_ID,
TD_GROUP_CUSTPRODUCT_REF.GROUP_ID,
TD_GROUP_CUSTPRODUCT_REF.CUST_NAME,
TD_GROUP_CUSTPRODUCT_REF.GROUP_TYPE_ID,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_ID,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_CODE,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_NAME,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_TYPE_ID,
TD_GROUP_CUSTPRODUCT_REF.DEAL_NAME,
TD_GROUP_CUSTPRODUCT_REF.DEAL_CERT_NUM,
TD_GROUP_CUSTPRODUCT_REF.DEAL_PHONE,
TD_GROUP_CUSTPRODUCT_REF.DEAL_EMAIL,
TD_GROUP_CUSTPRODUCT_REF.DEAL_RELA_METHOD,
TD_GROUP_CUSTPRODUCT_REF.CREATE_TIME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_STAFF_NAME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_REMARK,
TD_GROUP_CUSTPRODUCT_REF.CREATE_AREA_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_AREA_NAME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_COUNTRY_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_COUNTRY_NAME,
TD_GROUP_CUSTPRODUCT_REF.STATE,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_TIME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_NAME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_REASON,
TD_GROUP_CUSTPRODUCT_REF.LOSE_REASON,
TD_GROUP_CUSTPRODUCT_REF.REGISTER_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.REGISTER_TIME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_NAME,

count(distinct TD_GROUP_USER.GROUP_USER_ID),
count(distinct TD_GROUP_USERPROBUY.GROUP_USER_ID),
TD_GROUP_CUST. MGR_STAFF_ID
from TD_GROUP_CUSTPRODUCT_REF
left join TD_GROUP_USER on
(TD_GROUP_USER.GROUP_ID=TD_GROUP_CUSTPRODUCT_REF.GROUP_ID)
join TD_GROUP_USERPROBUY on
(TD_GROUP_USERPROBUY.GROUP_PRO_ID=TD_GROUP_CUSTPRODUCT_REF.GROUP_PRO_ID)
join TD_GROUP_CUST on
(TD_GROUP_CUST.GROUP_ID=TD_GROUP_CUSTPRODUCT_REF.GROUP_ID)
where TD_GROUP_USERPROBUY.GROUP_ID
in
(select TD_GROUP_CUST.GROUP_ID from TD_GROUP_CUST
where TD_GROUP_CUST.MGR_STAFF_ID='E00001')
and TD_GROUP_CUSTPRODUCT_REF.PRODUCT_ID=1
group by
TD_GROUP_CUSTPRODUCT_REF.GROUP_PRO_ID,
TD_GROUP_CUSTPRODUCT_REF.GROUP_ID,
TD_GROUP_CUSTPRODUCT_REF.CUST_NAME,
TD_GROUP_CUSTPRODUCT_REF.GROUP_TYPE_ID,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_ID,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_CODE,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_NAME,
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_TYPE_ID,
TD_GROUP_CUSTPRODUCT_REF.DEAL_NAME,
TD_GROUP_CUSTPRODUCT_REF.DEAL_CERT_NUM,
TD_GROUP_CUSTPRODUCT_REF.DEAL_PHONE,
TD_GROUP_CUSTPRODUCT_REF.DEAL_EMAIL,
TD_GROUP_CUSTPRODUCT_REF.DEAL_RELA_METHOD,
TD_GROUP_CUSTPRODUCT_REF.CREATE_TIME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_STAFF_NAME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_REMARK,
TD_GROUP_CUSTPRODUCT_REF.CREATE_AREA_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_AREA_NAME,
TD_GROUP_CUSTPRODUCT_REF.CREATE_COUNTRY_ID,
TD_GROUP_CUSTPRODUCT_REF.CREATE_COUNTRY_NAME,
TD_GROUP_CUSTPRODUCT_REF.STATE,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_TIME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_NAME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_REASON,
TD_GROUP_CUSTPRODUCT_REF.LOSE_REASON,
TD_GROUP_CUSTPRODUCT_REF.REGISTER_STAFF_ID,
TD_GROUP_CUSTPRODUCT_REF.REGISTER_TIME,
TD_GROUP_CUSTPRODUCT_REF.REMOVE_STAFF_NAME,
TD_GROUP_CUST. MGR_STAFF_ID
having
TD_GROUP_CUST.MGR_STAFF_ID='E00001'
and
TD_GROUP_CUSTPRODUCT_REF.PRODUCT_ID=1;
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
别沉啊
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
不好说。
应该还好吧。
最主要看TD_GROUP_CUSTPRODUCT_REF上的数据分布
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
估计性能不会太好, 4张表进行外联结, 而且还有subquery!
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
能不能只traceonly,看看执行计划?
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层

就目前你这个语句, 有2点有问题!
(1)既然你已经用了group by, 那为什么在select中还用distinct 呢?
因为select中用distinct 和不用, 结果有可能不是完全相同的!
(2)在having子句中的条件, 完全应该加在where子句中!


回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
原帖由 bell6248 于 2009-8-19 13:03 发表

就目前你这个语句, 有2点有问题!
(1)既然你已经用了group by, 那为什么在select中还用distinct 呢?
因为select中用distinct 和不用, 结果有可能不是完全相同的!
(2)在having子句中的条件, 完全应该加在where子句中!


having 中的字句在where中有,但是查出来的结果有些并没有进行过滤,无赖只好在having中再写一次
其实这也是我觉得最奇怪的一个地方
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
in 语句换成exist吧这样效率会高点一般SQL语句优化中都会说到尽量不要用in
回复

使用道具 举报

千问 | 2007-1-24 12:58:48 | 显示全部楼层
原帖由 Davizhang 于 2009-8-19 13:13 发表
having 中的字句在where中有,但是查出来的结果有些并没有进行过滤,无赖只好在having中再写一次
其实这也是我觉得最奇怪的一个地方



那只能说明, 这个语句写的有问题, 我认为那个subquery有可能完全可以改写, 但要有具体的环境!
从语法上来说, 你的这个语句having 中的字句的条件完全可以用where来替代, 并且用where效率会大大提高!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行