在优化SQL语句中使用虚拟索引

时间:2022-09-05 13:55:01

定义:虚拟索引(virtual index) 是指没有创建对应的物理段的索引。

虚拟索引的目的:是在不损耗主机CPU,IO,磁盘空间去实际创建索引的情况下,来判断一个索引是否能够对SQL优化起到作用。列如我们在优化一条SQL语句的时候,通常会查看需要优化的语句的执行计划,在考虑是否需要在表的某列上建立索引时就可以用到虚拟索引。虚拟索引建立的时候因为其没有消耗主机的相关资源,因此可以在相当快的时间内建立完成。

下面我们来看一下试验:

首先建立两张测试表

create table bigtab as select rownum as id,a.* from sys.all_objects a;

create table smalltab as select rownum as id,a.* from  a;

create table smalltab as select rownum as id,a.* from sys.all_tables a;

多次运行以下语句,以插入多一些测试数据:

insert into bigtab select ronum as id,a.* from sys.all_objects a;

insert into smalltab select rownum as id,a.* from sys.all_tables a;

查看需要执行语句的执行计划:

SQL> explain plan for select count(*) from bigtab a,smalltab b where a.object_name=b.table_name;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3089226980 --------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 518 (1)| 00:00:07 |
| 1 | SORT AGGREGATE | | 1 | 40 | | |
|* 2 | HASH JOIN | | 99838 | 3899K| 518 (1)| 00:00:07 |
| 3 | TABLE ACCESS FULL| SMALLTAB | 15311 | 299K| 172 (0)| 00:00:03 |
| 4 | TABLE ACCESS FULL| BIGTAB | 85284 | 1665K| 345 (1)| 00:00:05 |
-------------------------------------------------------------------------------- PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OBJECT_NAME"="B"."TABLE_NAME") 16 rows selected.

下面我们在两个表上创建两个虚拟索引,分别在object_name和table_name列上,看看优化器是否会使用这两个索引,以及优化器的成本会如何变化。

SQL> show parameter _use_nosegment
SQL> alter session set "_use_nosegment_indexes"=true; Session altered. SQL> show parameter _use_nosegment NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_use_nosegment_indexes boolean TRUE
SQL> create index big_ind on bigtab(object_name) nosegment; Index created. SQL> create index small_ind on smalltab(table_name) nosegment;

create index语句的NOSEGMENT选项表明这个索引是“虚拟的”-----就是没有与之相关联的实际索引段。如果优化器认为这个索引有用,参数_use_nosegment_indexes将指示数据库可以在执行计划中使用这些索引。下面我们来看看如果真的创建这些索引,它们是否值得使用:

SQL> explain plan for select count(*) from bigtab a,smalltab b where a.object_name=b.table_name;

Explained.

SQL> select * from table(dbms_xplan.display());                  

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1254475829 ------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 40 | 19 (6)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 40 | | |
|* 2 | HASH JOIN | | 99838 | 3899K| 19 (6)| 00:00:01 |
| 3 | INDEX FAST FULL SCAN| SMALL_IND | 15311 | 299K| 9 (0)| 00:00:01 |
| 4 | INDEX FAST FULL SCAN| BIG_IND | 85284 | 1665K| 9 (0)| 00:00:01 |
------------------------------------------------------------------------------------ PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("A"."OBJECT_NAME"="B"."TABLE_NAME") 16 rows selected.

执行计划显示,这两个索引确实被认为有用,优化器估算的成本也下降到19了。所以如果需要优化语句可以建议创建这些索引。

在优化SQL语句中使用虚拟索引的更多相关文章

  1. 应用索引技术优化SQL 语句(转)

    原文出处 一.前言 很多数据库系统性能不理想是因为系统没有经过整体优化,存在大量性能低下的SQL 语句.这类SQL语句性能不好的首要原因是缺乏高效的索引.没有索引除了导致语句本身运行速度慢外,更是导致 ...

  2. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

  3. 三,mysql优化--sql语句优化之索引一

    1,需求:如何在一个项目中,找到慢查询的select,mysql数据库支持把慢查询语句,记录到日志中.供程序员分析.(默认不启用此功能,需要手动启用) 修改my.cnf文件(有些地方是my.ini) ...

  4. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  5. SQL Server数据库性能优化(一)之 优化SQL 语句

    最近工作上基本没什么需求(好吧 不是最近是好久了,所以随便看看基础的东西来填补自己的空白) 原文出自:http://www.blogjava.net/allen-zhe/archive/2010/07 ...

  6. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

  7. SQL点滴35—SQL语句中的exists

    原文:SQL点滴35-SQL语句中的exists 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,CompanyName FROM Customers c WHE ...

  8. mysql优化sql语句

    mysql优化sql语句   常见误区   www.2cto.com   误区1:   count(1)和count(primary_key) 优于 count(*)   很多人为了统计记录条数,就使 ...

  9. MySql(五)SQL优化-优化SQL语句的一般步骤

    MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...

随机推荐

  1. log4net的使用

    1.0 下载并引用 log4net.dll 2.0 修改Web.config <configuration> <configSections> <section name ...

  2. js疑问

    var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];var aCopy = arr.slice();aCopy; // ['A', 'B', 'C', 'D', ...

  3. hdu 1151 Air Raid&lpar;二分图最小路径覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 Air Raid Time Limit: 1000MS   Memory Limit: 10000K To ...

  4. 【译】 AWK教程指南 附录D-AWK的内置变量

    因内置变量的个数不多,此处按其相关性分类说明,并未按其字母顺序排列. ARGC ARGC表示命令行上除了选项 -F, -v, -f 及其所对应的参数之外的所有参数的个数.若将"awk程序&q ...

  5. 多线程读写共享变量时,synchronized与volatile的作用

    在<effective java>中看的的知识点,在工作中确实遇到了~ keywordsynchronized能够保证在同一时刻,仅仅有一个线程能够运行某一个方法,或者某一个代码块. 同步 ...

  6. Common Table Expressions &lpar;CTE&rpar;

    子查询有时使用起来很麻烦,因为所有的过滤和匹配逻辑都必须集成到子查询表达式中.如果只需要执行一个任务,且只需要使用一次杳询表达式,子查询是很好的选择.但子查询不能被重用,也不能很好地支持多个需求.这个 ...

  7. top batch output

    echo 3 > sudo tee /proc/sys/vm/drop_caches top -d30 -bn20 > a

  8. &lbrack;Swift&rsqb;LeetCode36&period; 有效的数独 &vert; Valid Sudoku

    Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to th ...

  9. Vue之状态管理&lpar;vuex&rpar;与接口调用

    Vue之状态管理(vuex)与接口调用 一,介绍与需求 1.1,介绍 1,状态管理(vuex) Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态 ...

  10. OCP-第三节课&period;md

    一. dataguard  stream  字节流技术: 二. 突然断电:触发实例恢复过程: 三. 宕机:赔钱 四. Redis.MQ(消息中间件.队列管理器.缓存)(内存数据库) 五. IBM MQ ...