写复杂视图时需要注意的问题

不知道大家写复杂视图时有没有遇到这样的困境:这个视图需要关联十几张表,但这十几张表之间不一定有关系(例如,我要写一张产品销售金额的视图,主体表肯定是产品销售金额表,但是视图中需要显示公司英文名,则需要公司信息基础表),这个时候你有几种写法可以选择:

1. 把全部表直接列在from后面

select ********
   from 表A,表B.....表N
where .........

这样写的好处是简单,易阅读,但是这种写法有个比较大的缺陷就是:一般都要在最后加上group by 字句,而且差不多是select多少字段就要group by 多少字段,尤其当数据量比较大的时候,这样的写法不仅慢,而且对temp表空间也会有挑战,因为要进行大量数据的分组操作。所以这种写法直接被忽视。。

2. 写子查询

select company_name,
          (select product_name
             from 表A
          where ****) product_name,
          (select money
             from 表A
          where ****) money,
          ......................
from 表B,表C.......
where ..........
这样写的好处是避免不必要的group by 操作,将主体表(产品销售金额表)与基础表(公司信息表)分开,避免表的不必要关联,也容易阅读。但是这种写法会增加对表的扫描,比如上面的例子,本来product_name,money都是表A上的字段,本来扫描一次就可以全部读取出来,但是子查询是不允许你同时查多列的数据,所以需要对同一个表扫描多次(where条件可能完全一样)来取出不同字段的值。这种方法也不是很好。。

3. 构造数据集

select t.product_name,
          t.money,
          ..........
  from (select product_name,
                      money
              from 表A where ......) t,
            表B,表C.....表N
where ........

这样写就可以避免了2中的对同一个表扫描多次的问题,将主体表中需要的多个字段通过select构造成一个数据集。这样写的关键是把握好哪些表应该放进数据集t中,一般是主体信息表(需要从该表上获取多个字段的值),以及主体信息表需要辅助关联的表,把那些跟主体信息不相关的表都单独放在外面(例如,公司基本信息表),这样写,也有个缺点,集合t中表不能引用外面的表,这个例子中就是,如果t中表A需要关联表B,才能把产品金额正确查出来的话,你必须在t中from后面加上表B,不能直接去关联外面的表B。如果视图需要表B 的区域字段值,金额表A也需要关联表B,你就要考虑,到底是在集合t中直接将表B的区域字段查出来(这可能会带来额外的group by操作),还是放在外面(这样表B就用了2次,集合t中和外面,对表B的扫描会增多,但是可以避免group by操作),这就需要你根据具体的情况去衡量了。。。

所以,我建议大家写复杂视图的时候,还是选择第三种方法,效果会比较好,虽然阅读起来有点吃力。。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值