【Oracle】如何在查询视图时使用索引
通常我们使用hint来固定查询计划选择走表的索引 固定表的连接等等,但是如果第一层查询的是视图呢?
yang@rac1>CREATE TABLE TA (ID NUMBER, NAME VARCHAR2(30), TYPE VARCHAR2(30)); Table created. yang@rac1>CREATE TABLE TB (ID NUMBER, NAME VARCHAR2(30), TYPE VARCHAR2(30)); Table created. yang@rac1>create index idx_id_ta on ta(id); Index created. yang@rac1>create index idx_id_tb on tb(id); Index created. yang@rac1>CREATE VIEW V_Tab AS 2 SELECT * FROM TA 3 UNION ALL 4 SELECT * FROM TB; View created.
普通的查询视图,并没有走索引。
yang@rac1> SELECT * 2 FROM V_TAB 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 4036260501 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | |* 3 | TABLE ACCESS FULL| TA | 4998 | 229K| 9 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL| TB | 4998 | 229K| 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("ID"<2500) 4 - filter("ID"<2500) Note ----- - dynamic sampling used for this statement (level=2)
====使用常规使用hint的方式(表名 索引名称)
yang@rac1> SELECT /*+ index(tb idx_id_tb) index(ta idx_id_ta) */* 2 FROM V_TAB 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 4036260501 ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | |* 3 | TABLE ACCESS FULL| TA | 4998 | 229K| 9 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL| TB | 4998 | 229K| 9 (0)| 00:00:01 | ----------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("ID"<2500) 4 - filter("ID"<2500)
并不凑效!依然走全表扫描!
Note
-----
- dynamic sampling used for this statement (level=2)
==使用 视图前缀修饰表名的方式(VIVE.TABNAME INDEX_NAME)
yang@rac1> SELECT /*+ index(v_tab.tb idx_id_tb) index(v_tab.ta idx_id_ta) */* 2 FROM V_TAB 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 531820221 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | | 3 | TABLE ACCESS BY INDEX ROWID| TA | 4998 | 229K| 18 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_ID_TA | 4998 | | 18 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID| TB | 4998 | 229K| 5016 (1)| 00:01:01 | |* 6 | INDEX RANGE SCAN | IDX_ID_TB | 4998 | | 17 (0)| 00:00:01 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("ID"<2500) 6 - access("ID"<2500) yang@rac1>
对于创建视图的时候包含表的别名的情况:
yang@rac1>CREATE VIEW V_Tab02 AS 2 SELECT * FROM TA t1 3 UNION ALL 4 SELECT * FROM TB t2 ; View created. yang@rac1> SELECT /*+ index(tb idx_id_tb) index(ta idx_id) */* 2 FROM V_TAB02 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3023640653 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB02 | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | |* 3 | TABLE ACCESS FULL| TA | 4998 | 229K| 9 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL| TB | 4998 | 229K| 9 (0)| 00:00:01 | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("ID"<2500) 4 - filter("ID"<2500)
yang@rac1> SELECT /*+ index(v_tab02.tb idx_id_tb) index(v_tab02.ta idx_id) */* 2 FROM V_TAB02 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3023640653 ------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB02 | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | |* 3 | TABLE ACCESS FULL| TA | 4998 | 229K| 9 (0)| 00:00:01 | |* 4 | TABLE ACCESS FULL| TB | 4998 | 229K| 9 (0)| 00:00:01 | ------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter("ID"<2500) 4 - filter("ID"<2500)
==此时必须使用创建视图的表的相对应的别名(VIVE.TAB_ALIAS_NAME INDEX_NAME)
yang@rac1> SELECT /*+ index(v_tab02.t2 idx_id_tb) index(v_tab02.t1 idx_id) */* 2 FROM V_TAB02 3 WHERE ID<2500; 9996 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3173198873 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 47 | 2 (0)| 00:00:01 | | 1 | VIEW | V_TAB02 | 1 | 47 | 2 (0)| 00:00:01 | | 2 | UNION-ALL | | | | | | | 3 | TABLE ACCESS BY INDEX ROWID| TA | 4998 | 229K| 18 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_ID | 4998 | | 18 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID| TB | 4998 | 229K| 5016 (1)| 00:01:01 | |* 6 | INDEX RANGE SCAN | IDX_ID_TB | 4998 | | 17 (0)| 00:00:01 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("ID"<2500) 6 - access("ID"<2500) Note ----- - dynamic sampling used for this statement (level=2)
【Oracle】如何在查询视图时使用索引的更多相关文章
- Oracle分区表删除分区数据时导致索引失效解决
https://blog.csdn.net/e_wsq/article/details/80896258
- oracle数据库表约束、视图、索引—该记录为本人以前微博的文章
一.Oracle 数据库常用操作续关于创建表时创建约束1.创建表的时候增加约束----约束是定义表中的数据应该遵循的规则或者满足的条件----约束是建立在列上的,让某一列或者某几列数据之间有约束--- ...
- EF查询视图只得到一条记录
1.出错结果:数据库表视图有多条数据,在使用EF框架进行查询时却只得到一条数据(注:拦截EF得到的sql语句在数据库进行查询并没有任务问题). 2.出错原因:该视图中没有ID或者主键,EF查询时进行反 ...
- Oracle学习总结_day06_视图&序列&索引
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day 06 视图,索引,序列 视图 什么是视图: 视 ...
- oracle 10g 学习之视图、序列、索引、同义词(9)
目标 通过本章学习,您将可以: l 描述视图 l 创建和修改视图的定义,删除视图 l 从视图中查询数据 l 通过视图插入, 修改和删除数据 l 使用“Top-N” 分析 l 创建, 维护, ...
- oracle 物化视图及创建索引
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询.这样对整体 ...
- SQL Server索引视图以(物化视图)及索引视图与查询重写
本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...
- MariaDB 连接查询,视图,事物,索引,外键
1.连接查询 --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name var ...
- mariadb(四)连接查询,视图,事物,索引,外键
一.连接查询 1)进入自己创建的zz数据库 2)创建学生表: create table students ( id int unsigned not null auto_increment prima ...
随机推荐
- Apache 环境变量配置
在path 中加入 C:\__S_D_K__\AndroidApache\apache-ant-1.9.14\bin 我的路径在C盘
- PHP ftp_rawlist() 函数
定义和用法 ftp_rawlist() 函数返回 FTP 服务器上指定目录中文件的详细列表. 语法 ftp_rawlist(ftp_connection,dir,recursive) 参数 描述 ft ...
- 暑期集训日志(Day6~Day17)
章·十七:2019-07-28:为谁辛苦为谁甜 ·昨日小结 颓爆了QAQ,昨天又垫底了. 最简单一道题弃疗的我直接被甩倒了总榜垫底…… 我……不想说啥…… 我是渣比. 我不能颓废了. 醒来啊麦克白! ...
- NX二次开发-UFUN特征找xxx UF_MODL_ask_feat_xxx等函数(待补充)
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> #include <u ...
- (转)在eclipse中将android项目生成apk并且给apk签名
转:http://www.cnblogs.com/tianguook/archive/2012/09/27/2705724.html 生成apk最懒惰的方法是:只要你运行过android项目,到工作目 ...
- var 更明确地表示一个变量被设置为零值
创建一个变量并被初始化其为零值,习惯使用关键字var.这种做法是为了更明确地表示一个变量被设置为零值. 如果变量被初始化为某个非零值,就配合结构字面量和短变量操作符来创建变量. 零值 数值类型:0 字 ...
- ionic-Javascript:ionic 上拉菜单(ActionSheet)
ylbtech-ionic-Javascript:ionic 上拉菜单(ActionSheet) 1.返回顶部 1. ionic 上拉菜单(ActionSheet) 上拉菜单(ActionSheet) ...
- Git 远程仓库分支管理
目录 目录 速查表 关联远程代码仓库 克隆远程仓库 分支管理 创建分支 切换分支 合并分支 删除分支 解决冲突 速查表 指令 作用 git branch 查看分支 git branch newBran ...
- Portainer Exec Container 失败解决方案
近日,将portainer服务挂了个域名,然后用Nginx代理的时候发现不能attach容器了,经过搜索在issue 找到解决方案 1.修改Nginx config server { listen 8 ...
- HDU-1850-Being a Good Boy in Spring Festival-nim博弈
一年在外 父母时刻牵挂春节回家 你能做几天好孩子吗寒假里尝试做做下面的事情吧 陪妈妈逛一次菜场悄悄给爸爸买个小礼物主动地 强烈地 要求洗一次碗某一天早起 给爸妈用心地做回早餐 如果愿意 你还可以和爸妈 ...