数据库索引有哪几种?怎样建立索引?

数据库索引有哪几种?怎样建立索引?,第1张

种类:

1、按照索引列值的唯一性,索引可分为唯一索引和非唯一索引;

非唯一索引:

create index 索引名 on 表名(列名) tablespace 表空间名;

唯一索引:

建立主键或者唯一约束时会自动在对应的列上建立唯一索引;

2、索引列的个数:单列索引和复合索引;

3、按照索引列的物理组织方式。

索引的创建格式: 

CREATE UNIUQE | BITMAP INDEX <schema><index_name>     ON <schema><table_name>     (<column_name> | <expression> ASC | DESC,      <column_name> | <expression> ASC | DESC,)     TABLESPACE <tablespace_name>     STORAGE <storage_settings>     LOGGING | NOLOGGING     COMPUTE STATISTICS     NOCOMPRESS | COMPRESS<nn>     NOSORT | REVERSE     PARTITION | GLOBAL PARTITION<partition_setting>

使用USER_IND_COLUMNS查询某个TABLE中的相应字段索引建立情况

使用DBA_INDEXES/USER_INDEXES查询所有索引的具体设置情况。

在Oracle中的索引可以分为:B树索引、位图索引、反向键索引、基于函数的索引、簇索引、全局索引、局部索引等,下面逐一讲解:

一、B树索引:

最常用的索引,各叶子节点中包括的数据有索引列的值和数据表中对应行的ROWID,简单的说,在B树索引中,是通过在索引中保存排过续的索引列值与相对应记录的ROWID来实现快速查询的目的。其逻辑结构如图:

可以保证无论用户要搜索哪个分支的叶子结点,都需要经过相同的索引层次,即都需要相同的I/O次数。

B树索引的创建示例:

create index ind_t on t1(id) ;

注1:索引的针对字段创建的,相同字段不能创建一个以上的索引;

注2:默认的索引是不唯一的,但是也可以加上unique,表示该索引的字段上没有重复值(定义unique约束时会自动创建);

注3:创建主键时,默认在主键上创建了B树索引,因此不能再在主键上创建索引。

二、位图索引:

有些字段中使用B树索引的效率仍然不高,例如性别的字段中,只有“男、女”两个值,则即便使用了B树索引,在进行检索时也将返回接近一半的记录。

所以当字段的基数很低时,需要使用位图索引。(“低”的标准是取值数量 < 行数1%)

位图索引的逻辑结构如上图所示:索引中不再记录rowid和键值,而是将每个值作为一列,用0和1表示该行是否等于该键值(0表示否;1表示是)。其中位图索引的行顺序与原表的行顺序一致,可以在查询数据的过程中对应计算出行的原始物理位置。

位图索引的创建示例:

create bitmap index ind_t on t1(type);

注:位图索引不可能是唯一索引,也不能进行键值压缩。

三、反向键索引:

考虑这个情况:某一字段的值是1-1000顺序排列,建立B树索引后依旧递增,到后来该B数索引不断在后面增加分支,会形成如下如的不对称树:

反向键索引是一种特殊的B树索引,在存储构造中与B树索引完全相同,但是针对数值时,反向键索引会先反向每个键值的字节,然后对反向后的新数据进行索引。例如输入2008则转换为8002,这样当数值一次增加时,其反向键在大小中的分布仍然是比较平均的。

反向键索引的创建示例:

create index ind_t on t1(id) reverse;

注:键的反转由系统自行完成。对于用户是透明的。

四、基于函数的索引:

有的时候,需要进行如下查询:select from t1 where to_char(date,'yyyy')>'2007';

但是即便在date字段上建立了索引,还是不得不进行全表扫描。在这种情况下,可以使用基于函数的索引。其创建语法如下:

create index ind_t on t1(to_char(date,'yyyy'));

注:简单来说,基于函数的索引,就是将查询要用到的表达式作为索引项。

五、全局索引和局部索引:

这个索引貌似很复杂,其实很简单。总得来说一句话,就是无论怎么分区,都是为了方便管理。

具体索引和表的关系有三种:

1、局部分区索引:分区索引和分区表1对1

2、全局分区索引:分区索引和分区表N对N

3、全局非分区索引:非分区索引和分区表1对N

创建示例:

首先创建一个分区表

create table student

(

stuno number(5),

sname vrvhar2(10),

deptno number(5)

)

partition by hash (deptno)

(

partition part_01 tablespace A1,

partition part_02 tablespace A2

);

创建局部分区索引(1v1):

create index ind_t on student(stuno)

local(

partition part_01 tablespace A2,

partition part_02 tablespace A1

); --local后面可以不加

创建全局分区索引(NvN):

create index ind_t on student(stuno)

global partition by range(stuno)

(

partition p1 values less than(1000) tablespace A1,

partition p2 values less than(maxvalue) tablespace A2

); --只可以进行range分区

创建全局非分区索引(1vN)

create index ind_t on student(stuno) GLOBAL;

根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。

具体步骤如下:/导致这种情况的原因主要是

设置以下环境变量:

INFORMIXDIR the location of your IDS installation

PATH add $INFORMIXDIR/bin

add $INFORMIXDIR/extend/<spatialDataBladeDir>/bin (see below)

  安装Spatial DataBlade。安装指导可从 IDS 1110 信息中心获得(参考本文末尾的链接)。

下面的指令假设您已经在默认位置安装好了 Spatial DataBlade version 821: $INFORMIXDIR/extend/spatial821xC1,其中 ‘x’ 表示特定于平台的字母。对于 64 位 Linux x86,默认位置为 $INFORMIXDIR/extend/spatial821FC1。可根据您的环境对指令作出相应修改。

为空间数据创建 sbspace。注意:sbspace 名必须与 ONCONFIG 文件中的 SYSSBSPACENAME 值匹配。本例假设 sbspace 名为 syssbspace。

在与根dbspace相同的目录中创建名为 syssbspace 的空文件(ONCONFIG 文件中 ROOTPATH 的值指定根dbspace的名称和位置)。

将文件所有权改为informix:informix。

将文件权限改为mode 660。

以用户informix的身份,创建sbspace:

onspaces -c -S syssbspace -p <fullpath>/syssbspace -o 0 -s 100000

  创建您的数据库。

dbaccess - -

create database spatialdb;

  注册 Spatial DataBlade。

使用 blademgr 实用工具注册 Spatial DataBlade。Spatial DataBlade 依赖于 R-Tree DataBlade,后者由 IDS 自动附带。因此,必须同时向您的数据库注册这两个 DataBlade。

blademgr

register ifxrltree200 spatialdb

register spatial821FC1 spatialdb

list spatialdb

DataBlade modules registered in database spatialdb:

ifxrltree200 spatial821FC1

  加载空间数据。

从City Limits 2007和Tsunami Inundation Line下载中提取文件,并分别保存在两个目录中,即citylim_2007和tsunami:

ls citylim_2007

citylim_2007dbf

citylim_2007prj

citylim_2007sbn

citylim_2007sbx

citylim_2007shp

citylim_2007shpxml

citylim_2007shx

ls tsunami

PRJdevelopmentpdf

tsunamidbf

tsunamihtml

tsunamipdf

tsunamiprj

tsunamishp

tsunamishpxml

tsunamishx

假设A1单元格是要计算税金的工资数,B1单元格为税率,C1单元格为扣除数,D1单元格为应交税金税率的公式为:

(IF(AND(A1>0,A1<=500),5%,IF(AND(A1>500,A1<=2000),10%,IF(AND(A1>2000,A1<=5000),15%,IF(AND(A1>5000,A1<=20000),20%,IF(AND(A1>20000,A1<=40000),25%。

IF(AND(A1>40000,A1<=60000),30%,IF(AND(A1>60000,A1<=80000),35%,0)))))))+IF(AND(A1>80000,A1<=100000),40%,IF(A1>100000,45%,0))) 。

速算扣除数的公式为:

=IF(B1=5%,0,IF(B1=10%,25,IF(B1=15%,125,IF(B1=20%,375,IF(B1=25%,1375,IF(B1=30%,3375,IF(B1=35%,6375,IF(B1=40%,10375,0))))))))+IF(B1=45%,15375,0) 。

应交税金的公式:=round(A1B1-C1,2)。

扩展资料:

EXCEL学习函数最快的方法:

理解:因为函数是英文,所以英文转化为汉语,汉语转化为真实含义,都是一个过程。理解之后,使用起来就会得心应手。

运用:许多函数忘记了,是因为基本用不上,把好用的函数用起来,后面就会越用越上瘾。

目标:是偷懒,偷懒的心,其实是前期设置好,后期自动化。

心法:是解决问题的总思路。这个学会了,所有的方法技巧,都可以随便就能拿过来。

1、理解函数,比如sum,是总结,概括, 归纳的意思。下一次计算合计数,直接输入=sum(),心随我动。再比如,column,是列的意思,这个函数是返回列的序号。

比如column(B4)=4,在批量生成公式时非常好用。怎么记忆?column,名词,纵队,列;圆柱;专栏。只要去百度一下他的含义,读一遍,记住这个单词,就能记住这个公式。

2、记忆函数:常用的函数并不多,一般来说,记忆几个基本函数,就可以解决90%的问题了,sum(合计),sumif(条件求和),vlookup(查找并返回同一行的其他值),offset(偏移函数),if(假如,则),count(计数)。

countif,index(索引函数),int(向下取整数),rand(随机函数),文本的组合,text,&,concatenate三个函数, 关于时间的函数,mouth,now等。给每一个函数做一个自己的解释。有不超过20个基本的函数,绝对够用了。

3、使用函数:函数不用,就会忘掉。

不会使用某个函数,就直接去看帮助实例,或者百度看案例。是最直接有效的方法。前面要用3个小时的问题,用这个函数技巧,10分钟就解决了、有学习的动力,就主动学习好用的函数,用多了,就记住了。

4、心法:要在EXCEL实现某个目标,就必须学会用多种思路解决,此路不通时,可以用其他方法解决。一个基本的思维方式是:表格——工具——函数。比如去重复数据,

(1),直接要求数据来源提供不重复的数据!

(2),利用2007版工具栏中去重复数据。或者数据——筛选——选择不重复记录,粘贴就可以了。

(3),利用函数查找和对比筛选。=IF(COUNTIF(A:A,A1),A1,"")。

所以最高心法就是,数据从源头到结果,前面的一步走弯了,后面就会走更多的弯路,才能回到正轨。所以从一开始就要求数据输入格式,统一,标准化,都为后面做好准备。

其次是基本功能的运用。再次是数据处理过程的自动化,前期把函数设置好,检查好,后期才会省时省力。

1、函数的语法,本身就需要用小括号的。如:

文本函数TEXT的语法:TEXT(数值,"格式")

例:A1输入196301,B1显示日期1963年01月:

B1=TEXT(A1,"0000年00月")

替换函数SUBSTITUTE的语法:SUBSTITUTE(需替换字符的文本或引用,旧文本,新文本,替换位次)

例:A1为 2005年度,但要改为2015年度:

B1=SUBSTITUTE(A1,"0","1",2)

换算函数CONVERT的语法:CONVERT(数值,原数值计量单位,转换后的计量单位)

例:A1输入2(表示2米),B1换成英寸:

B1=CONVERT(A1,"m","in")

条件平均函数AVERAGEIF的语法:AVERAGEIF(数据区域,条件,实际平均区域)

索引函数INDEX的语法:INDEX(要返回的区域或数组常量,区域行号,区域列号)

……

2、而一连串加减乘除也要根据需要设置先后缓急吧。如:

成本核算,里面就需要用到加减乘除四则运算(看下面抓图):

毛利(J3)可以=H3G3-E3G3就不用括号。但用=(H3-E3)G3使用了括号,列式就相对简洁了。

但如果数据复杂(见下面抓图),不用括号就很费事了:

像J8,用函数式就是=(H8-SUMIF(B$3:B8,B8,F$3:F8)/SUMIF(B$3:B8,B8,D$3:D8))G8,公式可上下填充。改为四则运算为=H8G8-(F3+F6)/(D3+D6)G8,但只能J列各个单元格单独使用。

像这样的四则运算要去掉括号,可想知道要多费事。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12157604.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存