码迷,mamicode.com
首页 > 数据库 > 详细

36. SQL -- 聚集索引和非聚集索引(2)

时间:2015-04-05 06:47:06      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:聚集索引   非聚集索引   

 

关于聚集索引与非聚集索引的讨论:

A、区

聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个

聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存并不连续

B、关于索引的几个问题:

DEMO 分析:

一个学生表student,里面是学生号id,学生姓名,学生所在城市ID,学生成()

· :如果想按姓名查询,如何做化?

· 答:在姓名字段上建立索引。

· :建立什么类型的索引?

· 答:建立非聚集索引。

·

· 答:一般有范围查询的需求,可以考在此字段上建聚集索引。

· :学分有重性,在学分字段上建聚集索引能行....沉思,不能?之前的目好像真这样

· 答:应该可以吧。

· :聚集索引的束是什

· 答:唯一性啊?

· :既然是唯一性,那学分字段上建聚集索引....再次沉思,应该可以啊,但索引的束又怎么说呢?

· 答:应该可以的,以前用

1 :聚集索引的束是唯一性,是否要求字段也是唯一的呢?

分析:如果认为是的朋友,可能是受系认设置的影响,一般我指定一个表的主,如果个表之前没有聚集索引,同建立主键时候没有制指定使用非聚集索引,SQL 会默在此字段上建一个聚集索引,而主都是唯一的,所以理所当然的认为创建聚集索引的字段也需要唯一,因此建了聚集索引的列,并不一定要求其列字段的唯一性。结论:聚集索引可以建在任何一列你想建的字段上,是从理实际情况并不能随便指定,否在性能上会是梦。

○2聚集索引可以建在任何一列上,如果此表没有主键约束,即有可能存在重行数据呢?

粗一看,这还真是和聚集索引的束相背,但实际情况真可以建聚集索引,分析其原因是:如果未使用 UNIQUE 属性建聚集索引,数据引擎将向表自添加一个四字uniqueifier列。必要,数据引擎 将向行自添加一个 uniqueifier ,使唯一。此列和列供内部使用,用不能看或访问

3 :是不是聚集索引就一定要比非聚集索引性能呢?

如果想查询学分在60-90 的学生的学分以及姓名,在学分上建聚集索引是否是最的呢?

答:否。既然只出两列,我可以在学分以及学生姓名上合非聚集索引,此的索引就形成了覆盖索引,即索引所存的内容就是最终输出的数据,这种索引在比以学分聚集索引做查询性能更好。

4 :在数据中通描述聚集索引与非聚集索引的?

 

索引是通二叉的形式行描述的,我可以这样区分聚集与非聚集索引的区:聚集索引的叶点就是最的数据点,而非聚集索引的叶仍然是索引点,但它有一个指向最数据的指

5:在主建聚集索引的表在数据插入上比主建非聚集索引表速度要慢?

有了上面第四点的认识,我分析问题就有把握了,在有主的表中插入数据行,由于有主唯一性的束,所以需要保插入的数据没有重。我来比下主键为聚集索引和非聚集索引的找情况:聚集索引由于索引叶点就是数据,所以如果想检查的唯一性,需要遍所有数据点才行,但非聚集索引不同,由于非聚集索引上已包含了主键值,所以找主唯一性,只需要遍所有的索引就行,比遍所有数据行减少了不少IO 消耗。就是建非聚集索引比主建聚集索引在插入数据要快的真正原因。

 

DEMO:有索引与无索引查询效率分析

A、堆表描:

create table tb_heap (co1 int identity (1,1),co2 char(10))

go

insert into tb_heap (co2)

values (‘demo‘)

go 1000

select * from tb_heap

估的划:

查询估的

示占有的磁

sp_spaceused tb_heap

B、聚集索引描:

create table tb_index (co1 int identity (1,1) primary key,co2 char(10))

go

insert into tb_index (co2)

values (‘demo‘)

go 1000

当在表中建了主键约束后,将自将主键创键为聚集索引,当全表查询时查询方式聚集索引.

select * from tb_index

估的划:

示占有的磁

sp_spaceused tb_index

 

当在表中建了主键约束后,将自将主键创键为聚集索引,当where行条件查询时查询方式聚集索引.

select * from tb_index

where co1 = 10

估的划:

 

管理索引

根据数据的功能,可以在数据库设计器中建三索引:唯一索引、主索引和聚集索引

唯一索引: 唯一索引是不允其中任何两行具有相同索引的索引。

有数据中存在重键值时,大多数数据不允将新建的唯一索引与表一起保存。数据库还可能防止添加将在表中建重复键值的新数据。例如,如果在employee 表中职员的姓(lname)建了唯一索引,任何两个工都不能同姓。

索引:

数据常有一列或列合,其唯一标识表中的一行。列称表的主。在数据库关表定将自动创建主索引,主索引是唯一索引的特定型。索引要求主中的都唯一。当在查询中使用主索引,它许对数据的快速访问

聚集索引

在聚集索引中,表中行的物理序与键值逻辑(索引)序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,表中行的物理序与键值逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

 

语法:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]

INDEX index_name ON {table | view } column [ ASC | DESC ][,...n])

[WITH [PAD_INDEX] [ [, ]FILLF ACTOR = fillfactor][ [, ] IGNORE_DUP_KEY]

[ [, ] DROP_EXISTING] [ [, ] STATISTICS_NORECOMPUTE]

[ [, ] SORT_IN_TEMPDB ]]

 

UNIQUE:表示唯一索引,可

CLUSTEREDNONCLUSTERED:表示聚集索引是非聚集索引,可

FILLFACTOR:表示填充因子,指定一个0 100 该值指示索引的空所占的百分比。

注:数据TEXTNTEXTIMAGE BIT 的列不能作索引的列。 由于索引的度不能超900 个字,因此数据CHARVARCHARBINARY VARBINARY的列的列度超900 ,或数据NCHARNVARCHAR 的列的列度超450 个字节时也不能作索引的列。

 

创建主键索引:

tb_ha1 tb_ha2 2 表,其中tb_ha2 配置主使用统计开关显查询时间

--统计开关

set statistics profile off

set statistics io off

set statistics time off

--统计开关

set statistics profile on

set statistics io on

set statistics time on

 

 

建一普通表 tb_ha1

create table tb_ha1 (docno nvarchar(20), part nvarchar(30))

go

insert into tb_ha1

select LEFT (convert (nvarchar(128),newid()),20),left(convert

 (nvarchar(128),newid()),30)

go 5000

select * from tb_ha1

统计开关查询时间

SQL Server 分析和编译时间:

CPU 时间= 0 毫秒,占用时间= 1 毫秒。

(5000 行受影响)

‘tb_ha1‘1逻辑读75 次,物理0 次,预读0 次,lob 逻辑读0 次,lob 物理0 次,lob 预读0 次。

(2 行受影响)

SQL Server 时间:

CPU 时间= 31 毫秒,占用时间= 173 毫秒。

建表tb_ha2,并定索引:

create table tb_ha2 (docno nvarchar(20) primary key, part nvarchar(30))

go

insert into tb_ha2

select LEFT (convert (nvarchar(128),newid()),20),left(convert

(nvarchar(128),newid()),30)

go 5000

统计开关查询时间

Select * from tb_ha2

SQL Server 分析和编译时间:

CPU 时间= 0 毫秒,占用时间= 1 毫秒

(5000 行受影响)

‘tb_ha2‘1逻辑读108 ,物理0 次,预读0 次,lob 逻辑读0 次,lob

0 次,lob 预读0 次。

(2 行受影响)

SQL Server 时间:

CPU 时间= 0 毫秒,占用时间= 132 毫秒。

LEFT (convert (nvarchar(128),newid()),20)

使用newid(一个随机数),转换数据nvarchar(128),从左始取20 .

创建唯一聚集索引:

DEMOtb_ha1 建唯一聚集索引:

create unique CLUSTERED

index index_docno

on tb_ha1 (docno)

select * from tb_ha1

where docno = ‘0046CC15-B219-4745-B‘

检查tb_ha1是否建了索引:

sp_helpindex tb_ha1

创建一个非聚集索引:

DEMO:

create table tb_ha3 (docno nvarchar(20), part nvarchar(30))

go

insert into tb_ha3

select LEFT (convert (nvarchar(128),newid()),20),left(convert

(nvarchar(128),newid()),30)

go 5000

建索引:

create nonclustered

index index_part

on tb_ha3 (part)

看所建的索引:

sp_helpindex tb_ha3

创建复合索引:

tb2 建一个合索引:

sp_help tb2

select * from tb2

ctoyid cBrandld 建一个合索引:

create

index index_cBr

on tb2 (ctoyid,cBrandld)

查看索引:

sp_helpindex tb2

使用形化界面建索引:

数据 → 表 → 设计 → 列 → 右 → 索引/

索引重命名:

使用sp_rename

法 :

sp_rename

[ @objname = ] ‘object_name‘ ,

[ @newname = ] ‘new_name‘

[ , [ @objtype = ] ‘object_type‘ ]


删除索引:

DROP INDEX命令除索引

DROP INDEX 命令可以除一个或多个当前数据中的索引

法:

DROP INDEX ‘tablename.indexname‘ [,...n]

DROP INDEX 命令不能除由CREATETABLE ALTER TABLE 命令建的PRIMARY KEY UNIQUE 束索引。也不能除系表中的索引

DEMO

drop index tb2.idx_ctoy

T-SQL 一命名:

-- pk:

-- fk:外

-- idx: 索引

-- check:check


本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1628994

36. SQL -- 聚集索引和非聚集索引(2)

标签:聚集索引   非聚集索引   

原文地址:http://57388.blog.51cto.com/47388/1628994

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!