sql语句多表联查,查询速度太慢,超过10s,由于是菜鸟,不知道怎样优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句多表联查,查询速度太慢,超过10s,由于是菜鸟,不知道怎样优化相关的知识,希望对你有一定的参考价值。

SELECT COUNT(DISTINCT sv.id) as count, m.mediatypename, s.name FROM t_project p, shannxi.dbo.bus_line sv, shannxi.dbo.bus_station bs, shannxi.dbo.bus_station_new bsn, shannxi.dbo.t_surround_value_report ss, shannxi.dbo.t_surround_district s, t_mediatype_infor m WHERE p.isdelete=0 AND p.companyid = 2248 AND p.regionid = 354 AND p.dataid = sv.id AND p.mediatypeinfoid=m.id AND p.mediatypeinfoid in ( select id from fn_get_mediatype_infor(5) ) AND sv.busid=bs.bus_id AND bsn.station_code = bs.station_code AND bs.station_name=bsn.station_name AND bsn.kind=bs.kind AND bsn.id = ss.projectid AND ss.datatype=8 AND ss.dataid = s.id GROUP BY m.mediatypename, s.name

确定是菜鸟,sql 写成这样 证明你逻辑很清楚啊,建议如果是初学者,代码规范一定要保持
不知道代码规范,可以去窗口format一下。。。
言归正传 你这个优化的话 可以把
AND p.mediatypeinfoid in (
select
id
from
fn_get_mediatype_infor(5)
)
上面这部分 换成 inner join追问

跟这个关系不大,当初就是为了更好查询才写的这个函数select id from fn_get_mediatype_infor(5)

追答

多表关联禁用 in () 。。。
这个会降低效率,你可以查查执行计划
不是说你的函数的问题 是 in 的问题

参考技术A 问题很可能出在这一句:
AND P.MEDIATYPEINFOID IN (SELECT ID FROM FN_GET_MEDIATYPE_INFOR(5)).
这个FN_GET_MEDIATYPE_INFOR里面的逻辑复杂吗?追问

跟这个没多大关系,主要是这三个二货表bus_line ,bus_station ,bus_station_new ,,公交线路经过的商圈,得通过它的站点来确定,然后又要跟媒体表,商圈表关联,所以很扯淡

追答

就这几张表关联,索引都加好了的话,一般的数据量不可能会这么慢.
这样,你把我说的那个条件注释掉,试一下用多久可以查出来.

追问

去掉一样,应该是那几张表的条件要不停做对比,耗时太久,每个表里面本里就上万条数据,几个表这样对比下来效率自然太慢

java 多表联查sql语句效率问题

select
---1
decode(Scope,'2','大型企业','3','中型企业','4','小型企业','5','微型企业',''),
--2
(SELECT nvl(COGNRESULT, nvl(COGNRESULT3,COGNRESULT4))
FROM EVALUATE_RECORD ER
WHERE ER.OBJECTTYPE = 'Customer'
AND ER.EVALUATEPERIOD = '01'
AND ER.EFFFLAG = '1'
and ER.INVALIDATEDATE > to_char(sysdate,'yyyy/mm/dd')
and ER.Objectno = ei.customerid and rownum = 1),
---3
(select decode(max(classifyresult),'A1','正常类1','A2','正常类2','B1',
'关注类1','B2','关注类2','B3','关注类3','C1','次级类1','C2','次级类2',
'D','可疑','E','损失','') from
cl_info cl where
classifyresult is not null and cl.customerid=ei.customerid)

from ent_info ei,customer_info ci where ei.customerid=ci.customerid and ci.customertype<>'0107'
这个sql语句查出3个字段,因为第三个字段查的表cl_info和ent_info是多对一关系靠customerid关联,导致整体效率变慢,去掉它就很快,不能用视图,索引也有不用想另外建,想提高效率怎么办
因为是给外围系统供数所以不能再另外加表,原表结构也不能变,存储过程不能用,甚至function都不能

参考技术A 可以加两张中间表, 把想要第2、3字段 从中间表关联获取,这样应该会快很多 参考技术B 弄一个存储过程 参考技术C 你的索引添加了吗?

以上是关于sql语句多表联查,查询速度太慢,超过10s,由于是菜鸟,不知道怎样优化的主要内容,如果未能解决你的问题,请参考以下文章

java 多表联查sql语句效率问题

结合真实的测试实例,记录一次SQL语句辅助功能测试的场景(包含多表联查及子查询)

什么?mybatis-plus的多表查询,你还在写sql语句?!CRUD2多表联查的三种方式

SQL语句UPDATE 多表关联的

我这个SQL语句进行多表联查时为啥关联字段查不出来?

MySQL常用操作--多表联查