这样的视图会产生全表扫描——后用物化视图来解决,不知道还有没有更好的方法

[复制链接]
查看11 | 回复9 | 2010-3-1 11:20:08 | 显示全部楼层 |阅读模式
最近系统升级,升级上去后客户一直反应慢。
起了个跟踪,发现问题SQL。
这个查询对象是一张视图,视图是这样写的:
select* fromt_pd_sb_znglkg a,t_pd_sb_znglkg_geo b where a.obj_id=b.obj_id
这个视图是为了按一定条件关联两张表后再来查询,且两张表都有同一个字段obj_id,且都有建索引。
但是这样关联起来怎么就会去全表扫描呢?
——后用物化视图来解决,不知道还有没有更好的方法
[ 本帖最后由 soro 于 2009-5-19 21:19 编辑 ]
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
如果a.obj_id在b.obji_id中都存在(或者大部分存在),则a肯定是全表扫,反之亦然~~
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
原帖由 soro 于 2009-5-18 19:50 发表
最近系统升级,升级上去后客户一直反应慢。
起了个跟踪,发现问题SQL。
这个查询对象是一张视图,视图是这样写的:
select* fromt_pd_sb_znglkg a,t_pd_sb_znglkg_geo b where a.obj_id=b.obj_id
这个视图是为了按一定条件关联两张表后再来查询,且两张表都有同一个字段obj_id,且都有建索引。
但是这样关联起来怎么就会去全表扫描呢?


若这个问题SQL是在这次升级所引入的,那系统反应慢的原因,很有可能如三思所说的。楼主可以验证一下。
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
哦,确实是这样,那如果要把两张表关联起来这个视图如何写才能不产生全表扫描呢。
请再指点。
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
因为这两张表一个是模型一个是台帐,obj_id大部分字段都是对应的,但是确实不知道有什么更好的办法来优化这个视图写法。。。
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
别用视图
你要查某个id
select* fromt_pd_sb_znglkg a,t_pd_sb_znglkg_geo b where a.obj_id=? and a.obj_id=b.obj_id
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
原帖由 soro 于 2009-5-18 22:23 发表
因为这两张表一个是模型一个是台帐,obj_id大部分字段都是对应的,但是确实不知道有什么更好的办法来优化这个视图写法。。。

如果是这样,那你要查询的就几乎是全表的数据,ORACLE当然会认为全表扫效率更高,当然实际上也是如此~~
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
原帖由 junsansi 于 2009-5-19 10:17 发表
如果是这样,那你要查询的就几乎是全表的数据,ORACLE当然会认为全表扫效率更高,当然实际上也是如此~~

扫把跟踪服务啊


回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
原帖由 〇〇 于 2009-5-19 09:19 发表
别用视图
你要查某个id
select* fromt_pd_sb_znglkg a,t_pd_sb_znglkg_geo b where a.obj_id=? and a.obj_id=b.obj_id


郁闷的是我们组件是封装好的,不用视图就得去改底层。。。
回复

使用道具 举报

千问 | 2010-3-1 11:20:08 | 显示全部楼层
原帖由 junsansi 于 2009-5-19 10:17 发表
如果是这样,那你要查询的就几乎是全表的数据,ORACLE当然会认为全表扫效率更高,当然实际上也是如此~~

那如果一定要这样写是不是就没办法了。
我们进行一个操作,需要执行几十个这样的视图,每个表数据从几万到几十万,那这样系统慢的问题是不是就基本是全表扫描引起的?
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行