写复杂视图时需要注意的问题
2014-05-14 22:14
225 查看
不知道大家写复杂视图时有没有遇到这样的困境:这个视图需要关联十几张表,但这十几张表之间不一定有关系(例如,我要写一张产品销售金额的视图,主体表肯定是产品销售金额表,但是视图中需要显示公司英文名,则需要公司信息基础表),这个时候你有几种写法可以选择:
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. 把全部表直接列在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操作),这就需要你根据具体的情况去衡量了。。。
所以,我建议大家写复杂视图的时候,还是选择第三种方法,效果会比较好,虽然阅读起来有点吃力。。。。。
相关文章推荐
- MVC中使用aspx当作视图需要注意的问题
- 在定义SharePoint列表的SPD数据视图的时候需要注意的问题
- JS学习笔记——在浏览器中处理复杂运算需要注意的问题
- VS2012_MVC4入门例子、代码视图分离办法、需要注意的坑爹问题等_被坑后不断更新此贴,要转载的话,请使用链接,不要转载内容
- 创建视图时的注意点(关于需要创建索引的问题)
- 视图中需要注意的几个问题
- sql server数据库转换为access中需要注意的严重问题--access视图的一个死机‘特色’
- [征询意见]博客园购买新服务器时需要注意哪些问题
- 严重注意MSSQL视图跨数据库复制的问题
- C++程序员在学习C#时需要注意的一些问题(一)
- WSS站点迁移时需要注意用户SID的问题
- 【原创】Bug追踪过程中需要注意的问题
- 将ACCESS转化成SQL2000需要注意的几个问题
- ASP.NET中实现二级或多级域名(修改UrlRewrite)需要注意的问题
- [转]AppFuse中使用Oracle需要注意的问题
- 写跨浏览器脚本需要注意的问题
- 『EXP2』关于在函数内部分配内存时需要注意的问题
- 离职时需要注意的问题
- Firefox中Javascript使用event对象需要注意的问题
- 漂亮MM拍照时需要注意的一些问题(火力增强版)