索引创建规则及优化

news/2024/9/25 22:26:51
示例:
drop table if exists emp;
create table emp (eid int  CLUSTER primary key identity(1,1),ename varchar(200),age int,hiredate date,sal int,deptno int);
declare i int;
begin
for i in 1..50000 loop
insert into emp (ename,age,hiredate,sal,deptno)
select dbms_random.string('2',trunc(dbms_random.value(2,4))),
trunc(dbms_random.value(1,100)),
 ADD_DAYS(sysdate(),dbms_random.value(-10000,-10)),
 trunc(dbms_random.value(1,10000)),
trunc(dbms_random.value(1,6)) from dual;
end loop;
if  mod(i,5000)=0 then
end if;
end;
commit;
选择性:基数(某个列不同值的数量)与总行数的比值再乘以100%就是某个列的选择性。一般选择性大于20%就可以考虑建索引了。
--根据下面可以查询ENAME字段的基数和选择性,
select dnum 基数,tnum 总数,round(dnum/tnum*100,2) 选择性 from
(select count(DISTINCT(ename)) dnum ,count(*) tnum from emp ) t;

-- 如果值为0,达梦整数的除法运算需要修改参数CALC_AS_DECIMAL为1,重启数据库生效
统计信息:主要是描述数据库中表和索引的大小数以及数据分布状况等的一类信息,优化器依赖统计信息来评估选择最佳的执行计划
--上面所示,ename选择性好,在该字段创建一个索引进行测试
create index idx_emp_name on emp(ename);
-- 从EMP表中找出Ename为SKJ的数据
 select * from emp where ename= 'SKJ';

查询该sql的执行计划
EXPLAIN select * from emp where ename='SKJ';

 --从上面可以看到,Ename 为SKJ的结果只有4条数据,而执行计划里面的结果集是2500

优化器依赖统计信息来评估选择率(符合条件的记录数与原总记录数的比例)。如果没有统计信息可用,则对于列名=<常量>的谓词,选择率固定为SEL_RATE_EQU,默认值为2.5%,其他谓词为SEL_RATE_SINGLE,默认值5%
收集统计信息
call DBMS_STATS.GATHER_TABLE_STATS('SYSDBA','EMP',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
统计信息收集之后,查看执行计划

回表:先通过普通索引扫描出数据所在的行,再通过的rowid或聚集索引找出表中的数据,回表一般是单块读,回表次数太多会严重影响SQL性能
 --查询ename 开头是A的年龄信息
 select ename,age from emp where ename like 'A%' ;

执行计划如下
EXPLAIN select ename,AGE from emp where ENAME like 'A%';

覆盖索引:索引中包含了查询中的所有字段,是为了避免回表从而降低查询耗时的一种使用索引的方法。
--前面ename的选择性是26.21,而age的选择性是0.2,创建组合索引时将过滤条件好的放前面
--在emp表中建立ename,age组合索引
create index idx_ename_age on EMP(ename,age);
--可以看到执行计划已经没了BLKUP2的操作符了,已经消除了回表 
最左侧匹配原则:使用联合索引进行查询时,会优先使用最左边的列进行匹配,然后再依次向右匹配。遇到范围查询就会停止
select  ename,age from emp where ename like 'A%' and age=20 ;
如上所示,因为ename字段条件是like,后面的字段age就不会使用到创建的组合索引
索引下推:索引断裂走不下去后,不会立即回表,还会向下推一步再继续比较其它索引字段。
--通过添加hint采用索引下推之后,执行计划如下
select /*+ENABLE_INDEX_FILTER(1)*/ ename,age from emp where ename like 'A%' and age=20 ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46129.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[模式识别复习笔记] 第6章 PCA

1. 主成分分析 PCA PCA:寻找最能够 表示 原始数据的投 影方法,对数据进行降维,除去冗余的信息。——不考虑类别 1.1 PCA 主要步骤计算 散布矩阵 \(S\)(或者样本的协方差矩阵) \[S = \sum_{i=1}^{n}(\bm{x}_i - \bm{\mu})(\bm{x}_i - \bm{\mu})^{\text{T}} \]其中 \(\bm{\m…

一个练习项目,好玩的bbs-前端部分

common.jsfunction setCookie(name, value, daysToLive = 7) {let cookie = name + "=" + encodeURIComponent(value);if (typeof daysToLive === "number") {cookie += "; max-age=" + (daysToLive*24*60*60); // max-age单位是秒}document.coo…

Python版WGCNA分析和蛋白质相互作用PPI分析教程

在前面的教程中,我们介绍了使用omicverse完成基本的RNA-seq的分析流程,在本节教程中,我们将介绍如何使用omicverse完成加权基因共表达网络分析WGCNA以及蛋白质相互作用PPI分析。环境的下载 在这里我们只需要安装omicverse环境即可,有两个方法:一个是使用conda:conda inst…

一个练习项目,好玩的bbs-c#

c#代码:using MySql.Data.MySqlClient; using System.Data; using Newtonsoft.Json; using System.Security.Cryptography; using System.Text;int pagesize = 20; string secretKey = "saacac3423@21212";var builder = WebApplication.CreateSlimBuilder(args); v…

一个练习项目,好玩的bbs-java

java这个我是用springboot做的 目录结构 application.ymlspring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/my_bbs?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8&allowPubl…

从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对

最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以…

redis自学(47)服务端优化

持久化配置 Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议: ① 用来做缓存的redis实例尽量不要开启持久化功能 ② 建议关闭RDB持久化功能,使用AOF持久化(RDB的数据安全性一直是有问题的,两次RDB的时间比较长,又不能频繁的RDB…

一个练习项目,好玩的bbs-1

目录结构 nginx配置:upstream bbs_upstream {server 127.0.0.1:1081; #phpserver 127.0.0.1:1086; #csharpeserver 127.0.0.1:1087; #javaserver 127.0.0.1:1084; #ruby-sinatraserver 127.0.0.1:1104; #ruby-buskerserver 127.0.0.1:1105; #ruby-ramazeserver 127.0.0.1:1080…