为给定表或视图创建索引。
只有表或视图的所有者才能为表创建索引。表或视图的所有者可以随时创建索引,无论表中是否有数据。可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。
语法
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行是男,那么它不如直接扫描了,这是选择性
问题二: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_IDcreate table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) )
查找约束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name ='AAA' AND C.CONSTRAINT_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
问题三:如何正确合理的建立MYSQL数据库索引 如何正确合理的建立MYSQL数据库索引
索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型。
在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL
)我们随机向里面插入了10000条记录,其中有一条:5555, admin。
在查找username=admin的记录 SELECT * FROM mytable WHERE
username='admin'时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。
MySQL索引类型包括:
(1)普通索引
这是最基本的索引,它没有任何限制。它有以下几种创建方式:
◆创建索引
CREATE INDEX indexName ON mytable(username(length))
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。
◆修改表结构
ALTER mytable ADD INDEX [indexName] ON (username(length))
◆创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length)) )删除索引的语法:
DROP INDEX [indexName] ON mytable
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
◆创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
◆修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
◆创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length)) )
(3)主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL,
PRIMARY KEY(ID) )当然也可以用 ALTER 命令。记住:一个表只能有一个主键。
(4)组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:
CREATE TABLE mytable( ID INT......>>
问题四:数据库索引有哪几种,怎样建立索引 索引分为聚簇索引和非聚簇索引两种,聚簇索引 是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 根据数据库的功能,可以在数据库设计器中创建三种索引:唯一索引、主键索引和聚集索引。 在数据库表中创建的索引可以是是唯一索引、主键索引和聚集索引 景安服务器即使为您解答
问题五:数据库创建索引后怎么使用 索引在筛选率低于一定的值的情况是会很有效果.
主要还是看你的查贰语句是怎么写的.
记住,在筛选条件中,不要在字段上使用函数.查询条件要尽量简单.能够让数据库引擎更好地分析到合适的执行计划.
问题六:怎么创建数据库的索引 打个比方
create table t1(a int)
create index i1 on t1(a)
那么t1表的列a就创建了索引。以后查询t1表,列a有查询条件的时候就可以用到这个索引。
使用索引提高查询效率是数据库自己的事情,一般情况下不需要人为干预索引的使用
问题七:请问数据库的索引创建后要怎么用啊? 索引要针对where语句中频繁出现的字段创建,索引增加查询检索效率,降低插入速度,耗费硬盘空间
问题八:SQL server中 表中如何创建索引? if exists(select *from sys.objects where naem = 'newindex')
drop index newindex
create index
--===================================
竟然没有悬赏...唉...
那算了吧
我还是都告诉你吧..
看个示例
自己琢磨去:
--==============================================
use master
go
if db_id(N'zhangxu')is not null
drop database zhangxu
go
create database zhangxu
sp_helpdb zhangxu
use zhangxu
go
IF EXISTS (SELECT *FROM SYS.OBJECTS WHERE NAME = N'WORKER')
DROP TABLE WORKER
GO
create table worker
(
w_id int identity (1000,1) not null,
w_name Nvarchar(10) unique,
w_age SMALLINT CONSTRAINT CK_W_AGE CHECK(w_age>20 and w_age>
问题九:数据库创建索引有什么优点和缺点 数据库中索引的优缺点
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点,但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
建立索引的优缺点:为什么要创建索引呢?
这是因为,创建索引可以大大提高系统的性能。
第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二、可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五、通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。
这是因为,增加索引也有许多不利的一个方面:
第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。
第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
什么样的字段适合创建索引:
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
一般来说,应该在这些列上创建索引,例如:
第一、在经常需要搜索的列上,可以加快搜索的速度;
第二、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
第三、在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
第四、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
第五、在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
第六、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
建立索引,一般按照select的where条件来建立,比如: select的条件是where f1 and f2,那么如果我们在字段f1或字段f2上简历索引是没有用的,只有在字段f1和f2上同时建立索引才有用等。
什么样的字段不适合创建索引:
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,
并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,
在查询的结果中,结果集的数据行占了表中数据行的很大比 例,即需要在表中搜索的数据行的比例很大。
增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, p_w_picpath和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。
当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。
因此,当修改性能远远大于检索性能时,不应该创建索引。
创建索引的方法::
1、创建索引,例如 create index <索引的名字>on table_name (列的列表)
2、修改表,例如 alter table table_name add index[索引的名字] (列的列表)
3、创建表的时候指定索引,例如create table table_name ( [...], INDEX [索引的名字] (列的列表) )
查看表中索引的方法:
show index from table_name查看索引
索引的类型及创建例子::
1.PRIMARY KEY (主键索引)
mysql>alter table table_name add primary key ( `column` )
2.UNIQUE 或 UNIQUE KEY (唯一索引)
mysql>alter table table_name add unique (`column`)
3.FULLTEXT (全文索引)
mysql>alter table table_name add fulltext (`column` )
4.INDEX (普通索引)
mysql>alter table table_name add index index_name ( `column` )
5.多列索引 (聚簇索引)
mysql>alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )
修改表中的索引:
alter table tablename drop primary key,add primary key(fileda,filedb)
什么是聚簇
聚簇是根据码值找到数据的物理存储位置 从而达到快速检索数据的目的 聚簇索引的顺序就是数据的物理存储顺序 叶节点就是数据节点 非聚簇索引的顺序与数据物理排列顺序无关 叶节点仍然是索引节点 只不过有一个指针指向对应的数据块 一个表最多只能有一个聚簇索引
使用 Oracle 聚簇索引
聚簇是一种存储表的方法 这些表密切相关并经常一起连接进磁盘的同一区域 例如 表 BOOKSHELF 和BOOKSHELF_AUTHOR 数据行可以一起插入到称为簇(Cluster)的单个区域中 而不是将两个表放在磁盘上的不同扇区上 簇键(Cluster Key)可以是一列或多列 通过这些列可以将这些表在查询中连接起来(例如 BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列) 为了将表聚集在一起 必须拥有这些将要聚集在一起的表
下面是create cluster命令的基本格式
create cluster (column datatype [ column datatype] ) [other options]
cluster的名字遵循表命名约定 column datatype是将作为簇键使用的名字和数据类型 column的名字可以与将要放进该簇中的表的一个列名相同 或者为其他有效名字 下面是一个例子
create cluster BOOKandAUTHOR (Col VARCHAR ( ))
这样就建立了一个没有任何内容的簇(象给表分配了一块空间一样) COL 的使用对于簇键是不相干的 不会再使用它 但是 它的定义应该与要增加的表的主键相符 接下来 建立包含在该簇中的表
create table BOOKSHELF (Title VARCHAR ( ) primary key Publisher VARCHAR ( ) CategoryName VARCHAR ( ) Rating VARCHAR ( ) constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName) ) cluster BOOKandAUTHOR(Title)
在向BOOKSHELF表中插入数据行之前 必须建立一个聚簇索引
create index BOOKandAUTHORndx on cluster BOOKandAUTHOR
在上面的create table语句中 簇BOOKandAUTHOR(Title)子句放在表的列清单的闭括号的后面 BOOKandAUTHOR是前面建立的聚簇的名字 Title是将存储到聚簇Col 中的该表的列 create cluster语句中可能会有多个簇键 并且在created table语句中可能有多个列存储在这些键中 请注意 没有任何语句明确说明Title列进入到Col 中 这种匹配仅仅是通过位置做到的 即Col 和Title都是在它们各自的簇语句中提到的第一个对象 多个列和簇键是第一个与第一个匹配 第二个与第二个匹配 第三个与第三个匹配 等等 现在 添加第二个表到聚簇中
create table BOOKSHELF_AUTHOR (Title VARCHAR ( ) AuthorName VARCHAR ( ) constraint TitleFK Foreign key (Title) references BOOKSHELF(Title) constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName) ) cluster BOOKandAUTHOR (Title)
当这两个表被聚在一起时 每个唯一的Title在簇中实际只存储一次 对于每个Title 都从这两个表中附加列
来自这两个表的数据实际上存放在一个位置上 就好像簇是一个包含两个表中的所有数据的大表一样
散列聚簇
对于散列聚簇 它只有一个表 它通过散列算法求出存储行的物理存储位置 从而快速检索数据 创建散列聚簇时要指定码列的数据类型 数据行的大小及不同码值的个数 如果码值不是平均分布的 就可能有许多行存储到溢出块上 从而会降低查询该表的SQL语句的性能
散列聚簇被用在总是通过主键查询数据的情况 例如要从表 T 查询数据并且查询语句总是是这样
select * from T where id = :x
这时散列聚簇是一个好的选择 因为不需要索引 Oracle 将通过散列算法得到值 :x 所对应的物理地址 从而直接取到数据 不用进行索引扫描 只通过散列值进行一次表访问
散列聚簇语法示例
lishixinzhi/Article/program/Oracle/201311/18689
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)