在SQL中怎样用指定索引查询

在SQL中怎样用指定索引查询,第1张

格式为:

SELECT 字段名表

FROM 表名表

WITH (INDEX(索引名))

WHERE 查询条件

SQL-索引的作用:

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

select aname as tabname

,hname as idname

from sysobjects as a

right join sysindexes as h on aobject_id=hobject_id

where atype<>'s'

go

由于索引和系统列没有直接对应关系 所以不能直接查看列字段和字段长度

MySQL支持很多数据类型,选择合适的数据类型存储数据对性能有很大的影响。通常来说,可以遵循以下一些指导原则:

(1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。

(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。

(3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

主键是表中的一个或多个字段,它的值用于惟一地标识表中的某一条记录且不能为空;

索引是对数据库表中一列或多列的值进行排序的一种结构,只有当经常查询索引列中的数据时,才需要在表上创建索引,使用索引可快速访问数据库表中的特定信息。

索引占用磁盘空间,并且降低添加、删除和更新行的速度。当然索引也有好处就是查询速度快,它利还是大于弊的所以请慎重使用索引。

比如:一个学生表(t_stu

)有1000条数据,给它id列建个主键和索引,

你想查询id=1000;的这条信息,如果没有索引,它就一条一条的比对查找,系统运行1000次才找到,要是创建了索引,你查询id=1000的这条信息,系统只运行一次就找到了。

种类:

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;

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

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

问题一:索引怎么建立使用 如果你查询的字段都在索引中,那么可以只查询索引,不用查询表,就可以输出数据。

这是建索引时的一种考虑。

但是在你这种情况下不适用。

我猜你是想输出大批数据,而不是根据索引选择有数的那么几条。

输出数据占总数据量达到一定比例以后,再用索引就是浪费更多资源而得不到回报了。

因为数据行存储在块中。一块存多行。用索引时是根据索引信息,每一行访问一次数据块。

数据多了会覆盖大多数数据块,并且一个数据块会被访问多次。就不如全表扫描一次,访问一个叮据块就把该块所有行都输出。这样效率最高。

所以你这种情况不应该用索引的。

问题二:如何建立主索引 首先有一点你没有弄明白,数据库表才可以建主索引,自由表是不能建主索引的。也就是说数据库表可以建4种索引:主索引、候选索引、普通索引、唯一索引。但自由表只能建立3种索引:候选索引、普通索引、唯一索引。 如果要建主索引,可以在表设计器窗口的“索引”选项卡中建立,但index on 命令中不能建立主索引,此命令只能建候选索引、普通索引和唯一索引。 如:index on 学号 tag 学号 candidate index on 姓名 tag 姓名 unique index on 性别 tag 性别 (上述三个命令分别的是建立候选索引、唯一索引、普通索引) 但create table 命令中可以在指定字段属性的同时建立此字段为主索引,前提也是必须是数据库表。 举个例子:要求创建一个“学生”数据库中的“学籍”表,字段有学号,姓名,成绩,同时指定学号为主索引。 open data 学生 create table 学籍 (学号 C(6) primary key ,姓名 c(8),成绩 n(5,1))

问题三:oracle 数据库如何建立索引 如何用索引 5分 方法如下:

Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);

例如:

create index index_userid on tbl_detail(userid);

如何找数据库表的主键字段的名称

SELECT FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';

Oracle 在创建主键(可以不加constrai浮t SYS_AAA),会为库表自动创建索引,

索引的列为主键列。 并且当库表某些列名或者库表名改变时候,

Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns

desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS

例子1:更改库表的列名

ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),

constraint SYS_AAA primary key(ID) );

查找约束名字

select cCONSTRAINT_NAME,ctable_name,ccCOLUMN_NAME from user_constraints c, user_cons_columns cc

where cconstraint_name=ccconstraint_name and ctable_name ='AAA' AND CCONSTRAINT_TYPE='P';

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME ------------------------------ ------------ ------------- SYS_AAA AAA ID

查找索引

select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES

问题四:word中如何建立索引 1要编入目录的行在有正文字样栏点下拉选项样式里设置成标题同时也可以更改字题及大小,但要使用样式为标题才可以如果你在编写WORD文档时使用了标题样式,第一步略

2视图用大纲视图方式,打开文档结构视图,用向左向右箭头调整目录大纲级别合适为好

3光标移到最上面 4插入索引和目录,点目录标签

5确定,完成

问题五:如何创建空间索引 into user_sdo_geom_metadata(table_name,COLUMN_NAME, DIMINFO, SRID)

values(

't_city',

'GEOMETRY',

MDSYSSDO_DIM_ARRAY(

MDSYSSDO_DIM_ELEMENT('X',-180,180,0005),

MDSYSSDO_DIM_ELEMENT('Y',-90,90,0005)

),

8307

)

问题六:sql怎么建立索引 CREATE INDEX

为给定表或视图创建索引。

只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。

语法

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name

ON { table | view } ( column [ ASC | DESC ] [ ,n ] )

[ WITH [ ,n] ]

[ ON filegroup ]

::=

{ PAD_INDEX |

FILLFACTOR = fillfactor |

IGNORE_DUP_KEY |

DROP_EXISTING |

STATISTICS_NOREPUTE |

SORT_IN_TEMPDB

}

--这是基本语法,建立索引,只针对查询和一些更新和删除的速度,像性别一列,如果表里面有1000行,如果只有1行是男,这样用索引的话肯定高,如果有990行是男,那么它不如直接扫描了,这是选择性

问题七:数据库索引有哪几种,怎样建立索引 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。 在数据库表中创建的索引可以是是唯一索引、主键索引和聚集索引 景安服务器即使为您解答

问题八:如何创建唯一索引 例如,如果计划频繁查询 employee 表中(其中主键为 emp_id)的身份z号码 (ssn)列,并希望确保身份z号码是唯一的,则可以在 ssn 上创建唯一索引。如果用户为一个以上的雇员输入相同的身份z号码,则数据库将显示错误而且无法保存该表。在创建或修改唯一索引时,可以可设置一个忽略重复键的选项。如果此选项已设置为“是”,当您试图通过添加影响多行的数据来创建重复键(使用 INSERT 语句)时,则不会添加包含重复项的行;如果此选项设置为“否”,则整个插入 *** 作将失败,并且将回滚所有数据。 创建唯一索引 在对象资源管理器中,右键单击表,再单击“设计”。此时,将在表设计器中打开该表。在表设计器菜单上,单击“索引/键”。单击“添加”。“选定的主/唯一键或索引”列表将显示新索引的系统分配名称。在网格中,单击“类型”。从属性右侧的下拉列表中选择“索引”。在“列”下,选择要编制索引的列。最多可选择 16 列。为获得最佳的性能,请只为每个索引选择一列或两列。对于所选的每一列,指定索引是以升序还是以降序来排列此列的值。在网格中,单击“是唯一的”。从属性右侧的下拉列表中选择“是”。如果希望忽略会在唯一索引中创建重复键(用 INSERT 语句)的数据,请选择“忽略重复键”选项并选择“是”。在保存表或关系图时将在数据库中创建该索引。注意:如果单个列在多行中包含 NULL,则无法对该列创建唯一索引。同样,如果列的组合在多行中包含 NULL,则无法对多个列创建唯一索引。在进行索引时,它们都被视为重复值。

问题九:怎么创建数据库的索引 打个比方

create table t1(a int);

create index i1 on t1(a);

那么t1表的列a就创建了索引。以后查询t1表,列a有查询条件的时候就可以用到这个索引。

使用索引提高查询效率是数据库自己的事情,一般情况下不需要人为干预索引的使用

问题十:oracle建立索引 对三个字段建立索引:

create index Stuname on student(name);

create index Stusex on student(sex);

create index Stugrade on student(grade);

注意的问题,考虑是不是要建立唯一索引(unique),如果有学号的话,可以考虑建立唯一索引引。

再就是对经常查询,但又相对稳定的可以建立聚簇索引,提高查询效率

SELECT 索引名称=aname

,表名=cname

,索引字段名=dname

,索引字段位置=dcolid

FROM sysindexes a

JOIN sysindexkeys b ON aid=bid AND aindid=bindid

JOIN sysobjects c ON bid=cid

JOIN syscolumns d ON bid=did AND bcolid=dcolid

WHERE aindid NOT IN(0,255)

-- and cxtype='U' and cstatus>0 --查所有用户表

AND cname='message' --查指定表

ORDER BY cname,aname,dname

需创建索引 例如:

根据某列判断是否有重复记录,如果该列为非主键,则创建索引

根据经常查询的列,创建索引

无须创建索引

字段内容大部分一样,例如:男,女

不要给所有的列都创建索引,这样在创建新记录时,增加维护开销时间。

以上就是关于在SQL中怎样用指定索引查询全部的内容,包括:在SQL中怎样用指定索引查询、如何查询sqlserver数据库中得所有索引、mysql数据库,索引是怎么使用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/sjk/9856639.html

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

发表评论

登录后才能评论

评论列表(0条)

保存