create view的本质是什么?create view 命令发出后,数据库内部都做了哪些工作?
table建index 对view的排序速度有帮助吗?
view在数据库内部是怎样使用table的index的?

解决方案 »

  1.   

    create view A as(select * from tab where 条件一);
    然后
    select * from A where 条件二;大致等同于:
    select * from tab where 条件一 AND 条件二;因此,索引有用。
      

  2.   

    感谢各位的回复,俺想把问题说的更具体些
    假设有两个表: 员工表ta, 部门表tb
    ta(employee_id,employee_name,dept_id,x1,x2,x3,x4,x5)
    tb(dept_id,dept_name,y1,y2)
    同时ta表非常巨大,超过100万行. tb表较小,2000行左右.俺希望把 dept_name引入到员工属性中,
    并按部门名称和员工名称排序(order by dept_name,employee_name),
    而且排序速度对俺至关重要.俺权衡的两种方法是:1---如果俺将dept_name也放到ta表中,如:ta2(employee_id,dept_id,dept_name,employee_name,x1,x2,x3,x4,x5)
    俺可以建立索引(dept_name,employee_name)来保证速度,但这样的缺点显而易见,如果俺要改dept_name,就需要对两个表做操作,而且其中一个数据量巨大.2---因此俺想用view 把 dept_name引入到 员工属性中,再按部门名称和员工名称排序
    create view vv as select employee_id,dept_mame,employee_name,x1,x2,x3,x4,x5 
    from ta,tb where ta.dept_id=tb.dept_id order by dept_name,employee_name
    如果排序速度不那么重要,俺一定是会用这种方法了.俺的疑问主要在: 因为排序速度对俺至关重要,第2种方法对速度的影响俺却不甚明了.俺也难以模拟巨大的数据量来实验. 因此权衡再三,难以定夺,恳请高手指点.
    俺前面的问题是:
    table建index 对view的排序速度有帮助吗?
    view在数据库内部是怎样使用table的index的?就是想知道:在第2种方法中,如果对ta建索引(dept_id,emplyee_name), 对tb建索引(dept_id,dept_name),
    对速度有帮助吗?帮助多大?
      

  3.   

    俺最想知道的是,如果用第二种方法,它的速度比第一种方法有怎样的差别? 
    这种差别如何描述?如我们知道 index的结构是B树,它的搜索性能 教科书上有描述,
    那么第二种方法呢?
      

  4.   

    1. 排序的速度主要取决于初始化参数 SORT_AREA_SIZE(9i中已经改了,使用PGA)
    的大小。很简单,你可以做个测试:
      alter session set sort_area_size=10240000(分配10M的内存)
       ...做测试  alter session set sort_area_size=1024000(分配1M的内存)
       ...做测试  看看两种方式下的效率,如果效率差不多,就不是排序的问题了。2.我个人不太赞成把deptname引入ta表。 
       
      
      

  5.   

    当然有帮助了
    其实你可以这么简单地理解
    视图就是被优化了的SQL语句
    所谓被优化,其实就是指它比一般SQL语句少了语法检查,查询分析的过程,其他就跟select语句没什么区别了
    而一般为了加快查询速度,往往是通过建索引来实现的
    所以
    你用第二种方法,索引的建立以及select语句(tb表应该作为基准表写在from的最后)的写法对性能优化最重要
    建视图就锦上添花了
      

  6.   

    俺过去想当然的以为,
    create view vv as select employee_id,dept_mame,employee_name,x1,x2,x3,x4,x5 
    from ta,tb where ta.dept_id=tb.dept_id order by dept_name,employee_name
    后,数据库在内部某个地方保留了ta,tb做连接之后的结果,并随着表的更新作维护.看了"让我们一起飞"兄的留言,似乎不是如此, 那么每次select * from vv where... 时,数据库都要重做两个表的连接? 若果如此, 则影响速度的因素中,排序反而是次要的了,连接才是最费时的."让我们一起飞"兄,你能肯定告诉俺,每次重做连接是一定的吗?
    另外,你说的"tb表应该作为基准表写在from的最后",能详细些解释原因吗?
      

  7.   

    使用视图时还要看具体情况而定,有时建立视图的SQL在共享池中存在时,查询效率会提高。
    但是如果使用不频繁或重启动数据库后,使用视图还是要重新连接的。
      

  8.   

    关于"tb表应该作为基准表写在from的最后",LOOK:
    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
      

  9.   

    就象一个人为金钱而舍弃心爱的姑娘一样
    -----------------------------------
    呵呵,我可不会为了金钱而舍弃心爱的MM, Love is over gold.