首页 新闻 会员 周边 捐助

oracle 多条件查询 1千多万数据查询速度很慢··怎么办

0
悬赏园豆:20 [已解决问题] 解决于 2017-08-10 17:12

A表B表join

筛选的字段为AB表的所有字段

条件为 A.1 A.2 A.3 A.4 A.5 B.1 B.2 的随机组合,也可能是单个

 

尝试过建索引···但是因为AB表所有字段太多以及条件随机组合所以不知道怎么建有效的索引,哪位大侠有什么招,目前仅从sql上进行优化

碗粥的主页 碗粥 | 初学一级 | 园豆:6
提问于:2017-08-09 09:02
< >
分享
最佳答案
-2

千万级的数据建索引后肯定能达到秒级查询,关键的怎么建索引

可以建立联合索引

a表的所有查询条件涉及的字段+a b join 使用到的字段建立联合索引
b表的所有查询条件涉及的字段+a b join 使用到的字段建立联合索引

我觉得建立好这种索引应该就会解决当前查询慢的问题了,除非你是所有字段都有查询,或者查询中使用了 like '%开头的语句' 照成全表扫描

收获园豆:20
刘宏玺 | 专家六级 |园豆:14020 | 2017-08-09 09:41

因为条件是随机组合的,建联合索引的话,它的前导索引不一定会有值,在这种情况下oracle它自己在数据量稍大的情况下它不会去调用的·因为我试过了·······朋友还有别的招不

碗粥 | 园豆:6 (初学一级) | 2017-08-09 09:44

@不会代码的椰子: 是不是在过滤中出现了like '%开头的语句'

刘宏玺 | 园豆:14020 (专家六级) | 2017-08-09 09:46

保证没有····你稍等会···我把sql发你

碗粥 | 园豆:6 (初学一级) | 2017-08-09 09:46

@刘宏玺: 发你短消息了,帮忙看看,谢谢

碗粥 | 园豆:6 (初学一级) | 2017-08-09 09:54

@不会代码的椰子: 

你要是保证没有like '%开头的语句'的话

还有一种优化方法

你不是a和bjoin吗

a的过滤条件加在查询a的子查询上

b的过滤条件加在查询b的子查询上

像这种

 

select * from 

(select * from a where a.1 = '' or a.2 = '') as a

left join 

(select * from b where b.1 = '' or b.2 = '') as b

on a.x = b.x

这样在join的时候形成的笛卡尔积就会小很多了,效率也会上来

刘宏玺 | 园豆:14020 (专家六级) | 2017-08-09 10:00

@刘宏玺: 听起来好像有道理。。。但是我个人认为哈,这么写和where感觉是一样的,where也是两张便先过滤再join的····我还是先试试···

碗粥 | 园豆:6 (初学一级) | 2017-08-09 10:08

@不会代码的椰子: 不一样的,只有join的条件才先进行过滤,剩余的数据先做笛卡尔积,再做where,这样做肯定会提高效率的,而且过滤条件越多,查询越快,否则就是过滤条件越多,查询相对要慢一点

刘宏玺 | 园豆:14020 (专家六级) | 2017-08-09 10:12

@刘宏玺: 哦···我不懂····然后建索引的问题还是没有解决···因为a表条件是随机组合的这次可能只有条件1下次可能是条件2和3,这样的话它不会走联合索引的

碗粥 | 园豆:6 (初学一级) | 2017-08-09 10:18

@不会代码的椰子: 那就每个查询字段单独建索引,这样效果虽然不是特别好,但是很有用

刘宏玺 | 园豆:14020 (专家六级) | 2017-08-09 10:20

@刘宏玺: 但是单独建索引它执行计划会出现这么一条 TABLE ACCESS BY INDEX ROWID  这一条会很花时间

碗粥 | 园豆:6 (初学一级) | 2017-08-09 10:25

@刘宏玺:刘宏玺,再问你个问题我用组合索引中的某一列的条件去查询的时候,如果是输入的数据库中已有的数据比如“123456”就很快,如果当前数据库中没有“123456”这个数据那么你用它作为条件去查就十分慢跟没建索引似的 

碗粥 | 园豆:6 (初学一级) | 2017-08-10 15:21

@不会代码的椰子: 对啊,没有命中了,就会慢了

刘宏玺 | 园豆:14020 (专家六级) | 2017-08-10 15:24

@刘宏玺: 好吧,谢谢啦。

碗粥 | 园豆:6 (初学一级) | 2017-08-10 17:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册