永发信息网

SQL嵌套查询优化

答案:3  悬赏:10  手机版
解决时间 2021-12-03 02:25
SQL嵌套查询优化
最佳答案
单从语句方面基本上没有优化的地方了,可以尝试下
SELECt count(c.CUST_NO)
FROM CI_CUS_PERSON c
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
WHERe c.CUST_TYPE like '1%'
AND c.CUST_NO IN (SELECt CUST_NO FROM OP_ASN_CUST_INST aci WHERe ORGID IN (select eao.ORGID from eos_auth_org eao WHERe eao.OPERATORID=1)) 如果后面那个in里面的查询量不大的话。

可以考虑索引
OP_ASN_CUST_INST.CUST_NO,OP_ASN_CUST_INST.ORGID,
CI_CUS_PERSON.CUST_NO上面建立索引追问已经建立索引,90W的数据非常慢,我考虑过
SELECt count( c.CUST_NO)FROM CI_CUS_PERSON c
inner join OP_ASN_CUST_INST aci on aci.CUST_NO = c.CUST_NO inner join eos_auth_org eao on eao.ORGID = aci.ORGID and eao.OPERATORID=1
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
where c.CUST_TYPE = '1' 这样会提高点效率,可是没办法去除重复记录追答tRY

SELECt count(c.CUST_NO)
FROM (SELECt * FROM CI_CUS_PERSON WHERe CUST_TYPE like '1%') c
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
WHERe EXISTS (SELECt 1 FROM (SELECt * FROM OP_ASN_CUST_INST WHERe ORGID IN (select ORGID from eos_auth_org WHEReOPERATORID=1)) aci
WHERe aci.CUST_NO = c.CUST_NO )追问执行结果还是很慢,这个方法没有去除嵌套问题,老大再帮忙想想追答已经建立的索引有哪些?

Try this one without sub-query

SELECt count(c.CUST_NO)
FROM (select * from CI_CUS_PERSON where CUST_TYPE like '1%') c
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
INNER JOIN (SELECt aci.CUST_NO
FROM OP_ASN_CUST_INST aci
INNER JOIN (SELECt ORGID FROM eos_auth_org WHERe OPERATORID=1) eao
ON aci.ORGID =eao.ORGID) t2
ON t2.CUST_NO = c.CUST_NO追问做了下测试,在性能方面可以了,就是无法做到去除重复,加上Distinct后效率又下来了,这有没有办法解决追答不明白你的去重复是要去掉那个重复。可以考虑在distinct列加索引

当然,也要综合考虑,为了一个查询增加索引,要考虑值不值得。
全部回答
1. 关联的列都建索引
2. 这样试试:
EXISTS (SELECt 1 FROM OP_ASN_CUST_INST aci,eos_auth_org eao WHERe aci.CUST_NO = c.CUST_NO AND aci.ORGID = eao.ORGID and eao.OPERATORID=1)追问测试了下,效率还是没有提高,需要1分钟多,使用的是SYBASE数据库追答分别查一下:
1. 下列表的数据行数
2. 指定列的不同值个数
3. 指定内容的数据个数
然后根据这些情况,再尝试优化。

A. CI_CUS_PERSON 行数,CUST_NO 的个数,是否索引
B. OP_ASN_CUST_INST 行数,CUST_NO 的个数,是否索引; ORGID 的个数,是否索引
C. eos_auth_org 行数,ORGID 的个数,是否索引;OPERATORID 不同值的个数,值为1 的行数,是否索引
D. CI_CUS_CERT 行数,CUST_NO 的个数,是否索引; c.CUST_TYPE like '1%' 的行数,是否索引追问一、CI_CUS_PERSON ,条数854466,CUST_NO 是索引
二、OP_ASN_CUST_INST,条数 915789,CUST_NO ORGID 是索引
三、eos_auth_org,条数 3857,这个是视图,我也是现在才知道
四、已测试,和CI_CUS_CERT 关系不大追答1. 你没有告诉我各个关联列中的不同值的个数
2. 既然eos_auth_org是视图,可以尝试去掉它,看其影响多大(因为是视图,不管其返回多少行,需要考虑其基表有多少行,是否合理使用索引才行)
3. 再次尝试去掉子查询(我觉得这个应该和原先的等效,需要你测试一下):

SELECt count(c.CUST_NO)
FROM CI_CUS_PERSON c LEFT JOIN CI_CUS_CERT CERT
ON c.CUST_NO=CERT.CUST_NO
inner join OP_ASN_CUST_INST aci on aci.CUST_NO = c.CUST_NO
inner join eos_auth_org eao on aci.ORGID = eao.ORGID
WHERe c.CUST_TYPE like '1%' and eao.OPERATORID=1

4. 如果还不行的话,我觉得再改进的可能性不是很大。追问应该是视图导致效率低下,视图必须要改成其他方式,这种连接的,对多字段的去重,不好实现,多谢帮忙追答呵呵,不客气,找到原因就有改进的可能
Select Count(A.CUST_NO) From
(SELECt Distinct c.CUST_NO FROM CI_CUS_PERSON c
inner join OP_ASN_CUST_INST aci on aci.CUST_NO = c.CUST_NO
inner join eos_auth_org eao on eao.ORGID = aci.ORGID and eao.OPERATORID=1
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
where c.CUST_TYPE = '1'
) A追问count(A.CUST_NO) 我是用来测试的,其实查的是很多字段,有办法在很多字段里面对“A.CUST_NO”使用Distinct ?追答可以。里面选择出来,外面再选择出来就可以了
Select A.CUST_NO,A.XXXX From
(SELECt Distinct c.CUST_NO,c.XXXX FROM CI_CUS_PERSON c
inner join OP_ASN_CUST_INST aci on aci.CUST_NO = c.CUST_NO
inner join eos_auth_org eao on eao.ORGID = aci.ORGID and eao.OPERATORID=1
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
where c.CUST_TYPE = '1'
) A追问加上后SELECt Distinct TOP 2500 c.CUST_NO as "custNo", c.CUST_NAME as "custName", CERT.CERT_NO as "certNo", c.CUST_TYPE as "custType"
FROM CI_CUS_PERSON c
inner join OP_ASN_CUST_INST aci on aci.CUST_NO = c.CUST_NO
inner join eos_auth_org eao on (eao.ORGID = aci.ORGID and eao.OPERATORID=1)
LEFT JOIN CI_CUS_CERT CERT ON c.CUST_NO=CERT.CUST_NO
where c.CUST_TYPE = '1' ,效率变得很慢追答这是直接Sql提高的比较好的办法了。还是不行的话,只能想着利用存储过程来实现了。
用临时表来储存你需要的数据 逐步筛选。这样才会达到你的要求。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
、欢乐的北京(打青海一地名)2、一路顺风(打青
新姜泡醋在拿来炒菜吃会怎样
A B两个人开办公司,注册资金100万,A出资99
为什么ps画笔都成了点状?
凤铝与平果铝哪个好
仪器减肥对身体有没有伤害
昆明画廊哪家品种齐全?
请老师帮忙改一下,改成通达信版。因为该公式
2013年4月,四川雅安发生7.0级地震.在灾后疾
韩文翻译:西柚、椰奶、芦荟、蓝莓、红石榴
童谣岁月长中周作人对童谣的态度是怎样的
怪人的英文翻译
左腰有痣代表什么?
本人今年大三 学期初评选大二奖学金 本来有望
excel表格 如何手动实现正反两面打印啊?
推荐资讯
花千骨中有一句歌词是“瑶池初见,他是高高在
母牛吐水食物是怎么回事
邀请老师来家里,是家中一座还是家中一坐?那
如何设置一个文件夹,让每次打开的时候,都要
同志们,求final lovelive的百度云!!!
新华理发店地址在什么地方,我要处理点事!
省内社保转移手续流程是什么?
小弟最近算排水、这个存水弯到楼板长度 怎么
统筹城乡经济发展,建设现代农业,发展农村经
农村信用社atm(木顶乡木顶完全小学校)地址好
个股与大盘的K线走势完全一致,就像复印出来的
在哪里做昆山市陆家镇合丰村225路车
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?