• 视图和索引


    视图就是提取一张或者多张表的数据生成一个映射,操作视图可以达到操作原表的效果,方便数据的管理以及安全操作。

        视图的作用:
            1.隐藏表中的重要数据
            2.代替一些比较长的sql语句

        视图分为俩类:
            简单视图:
               视图所代表的sql中如果没有group by语句,没有组函数,查询的只有一张表,那么这样的视图就是简单视图.
            复杂视图
               视图所代表的sql中如果有group by语句,或者有组函数,或者查询的是多张表,那么这样的视图就是复杂视图.


        简单视图和复杂视图的区别:
            通过简单视图可以修改原来表中的数据,通过复杂视图是不能修改原来的数据的。

        创建视图:
            create or replace view 视图名字
            as
            sql语句
        
        删除视图
            drop view 视图名字;


        测试表:
        create table t_user(
            id number constraint user_id_pk primary key,
            name varchar2(100),
            salary number
        );
        drop table t_user;
        
        插入数据:
        insert into t_user(id,name,salary)
        select id,last_name,salary
        from s_emp;

        //创建视图
        create or replace view v_test
        as
        select *
        from t_user
        where id > 10;

        //查看视图内容
        select *
        from v_test;


        //可以通过*简单视图*对原来的表进行数据的删除/更新/插入
        delete from v_test where id=16;

        update v_test set name = 'zhangsan' where id = 20;

        insert into v_test(id,name,salary) values(28,'tom1',3000);

        

        
        with read only语句
            特点:只能通过视图进行查询数据,不能修改
            例如:
            create or replace view v_test
            as
            select *
            from t_user
            where id > 10
            with read only;
            
            这个视图v_test将来只能查询,不能进行修改
            
            此时再使用上面的DML进行操作数据就会报错。




        with check option语句
            特点:通过视图进行的修改 那么也必须可以通过这个视图能够显示出来,否则就操作失败

        例如:
            //测试用的表及其数据
            drop table t_user;
            create table t_user(
                id number constraint user_id_pk primary key,
                name varchar2(100),
                salary number
            );

            insert into t_user values(1,'tom',1000);
            insert into t_user values(2,'tom2',2000);
            
            
            创建视图:
            create or replace view v_test
            as
            select id,name,salary
            from t_user
            where id=2
            with check option;
            

            //查询视图中的数据
            select * from v_test;

            //插入报错 因为这个操作通过视图显示不出来
            insert into v_test values(3,'tom3',3000);

            //更新失败 因为这个操作通过视图显示不出来
            update v_test
            set name='lily'
            where id=1;

            //更新成功 因为这个操作通过视图可以显示出来
            update v_test
            set name='lily'
            where id=2;

        
        复杂视图
            例如:
                create or replace view v_test
                as
                select avg(salary) avgSal
                from t_user;
            
            复杂视图只能用来查询,不能修改
            
            select * from v_test;

            update v_test
            set avgSal=2019;



    第十三章: 索引(index)
        索引的概念:
            1. 类似书的目录结构
            2. Oracle 的"索引"是一种对象,是与表关联的可选对象,能提高SQL查询语句的速度
            3. 索引直接指向包含所查询值的行的位置,减少磁盘I/O
            4. 索引和表是相互独立的物理结构
            5. Oracle 自动使用并维护索引,插入、删除、更新表后,自动更新索引
        

        索引的原理:
            例如:一个表中有name字段,假设要查找name='tom'的这条数据

            若没有索引,查找这个记录时,需要搜索表中所有的记录,因为不能保证只有一个tom,那么就必须将表中数据全部搜索一遍

            若在name上建立索引,oracle会对全表进行一次搜索,将每条记录的name值在什么位置按照一定的规则进行排列,然后构建索引条目,存储到索引段中,查询name为tom时,可以直接查找该数据所在的对应地方。

            创建了索引并不一定就会使用,因为oracle在自动统计表的信息后,会决定是否使用索引,表中数据很少时,使用全表扫描速度已经很快了,那么就没有必要使用索引了。
        

        索引的创建:
            1.自动创建
                当在表中指定了primary Key或者unique约束时会自动创建唯一值索引。
            2.用户创建。
            用户可以创建非唯一值索引以提高在访问数据时的效率。
            语法:
                create index 索引名
                on 表名(列名);
            例如:
                 create index emp_index
                 on s_emp(last_name);

            
            删除索引:
                drop index 索引名;
            例如:
                drop index emp_index;

            创建成功后可以通过如下语句查看:
                select index_name from user_indexes;

        给某列创建索引的原则:
            1.列经常作为where子句的限定条件或者作为连接条件
            2.列包含的数据量很大,并且很多非空的值。
            3.两个或者更多列频繁的组合在一起作为where的限定条件或者连接条件
            4.列总是作为搜索条件
            5.索引查出的数据量占2%~4%
            6.索引不是越多越好,不是索引越多越能加速查找。
            7.要索引的表不经常进行修改操作
        
        注意:
            1.在表中的某一个合适的列加入上了索引,那么也只有在数据量很大的时候,才能有所体现出这个查询的效率.
            2.索引一旦建立成功,那么之后这个索引就由系统来管理,我们自己是控制不了的.


        索引的种类:
            Single column 单列索引
            Concatenated  多列索引
            Unique          唯一索引
            NonUnique     非唯一索引
        

        索引结构分为:
            B-tree(默认是这种结构)
                适合大量的增、删、改;
                不能用包含OR操作符的查询;
                适合高基数的列(唯一值多)
                典型的树状结构;

                默认创建的索引就是这种结构。
                create index emp_index on s_emp(last_name);

                drop index emp_index;

            位图
                做UPDATE代价非常高(oracle要根据表的每次修改来更新索引)
                非常适合OR操作符的查询;
                数据基数比较少的时候较适合建位图索引。

                create bitmap index bitmap_index on s_emp(last_name);

                drop index bitmap_index;
                

                注意:查询是否具备了bitmap索引的功能
                select * from v$option Where PARAMETER='Bit-mapped indexes'

                如果value值为false表示,Oracle该版本不具有bitmap索引功能或未装

            反序
                反向索引是B-tree索引的一个分支,主要是在创建索引时,针对索引列的索引键值进行字节反转。
                例如,键值1001、1002、1003,反转后1001、2001、3001,进而将值分散到不用的节点中。

                create index emp_index_reverse on s_emp(last_name) reverse;

                drop index emp_index_reverse;

            函数索引
                经常对某个字段做查询的时候,并且是带函数操作的,那么此时函数索引就可以发挥作用,提高检索速度。

                create index func_index  on s_emp(upper(last_name));

                drop index func_index;

  • 相关阅读:
    Java FileInputStream与FileReader的区别
    java 保存和读取本地json文件
    java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结
    Java魔法堂:注解用法详解——@SuppressWarnings
    使用Restlet Client发送各种Get和Post请求
    postman VS restlet client基本使用
    Java获取请求客户端的真实IP地址
    dom4j解析xml字符串实例
    C++ Boost库简介(一些自己的感受)
    打仗其实最讲成本核算,大炮轰的都是黄金,日军在中国就是不断赔本
  • 原文地址:https://www.cnblogs.com/yxj808/p/12023453.html
Copyright © 2020-2023  润新知