索引基础

-- =============================================               
-- Author:      余波(杭州)               
-- Create date: 2011/09/29               
-- Description: 索引基础              
-- ============================================= 
------测试表结构
create table test
(
	id int,
	name int
)
------插入测试数据
insert into test
select 1,1
union
select 2,2
union
select 3,3
union
select 4,4
------在表上创建索引
------语法
--create [unique][nonclustered|clustered] index index_name on tablename(column_name)
--1、创建唯一/非唯一 聚集索引
create unique clustered index u_clu_index on test(a)
create clustered index u_clu_index on test(a)
--2、创建唯一/非唯一 非聚集索引
create unique nonclustered index u_nclu_index on test(a)
create nonclustered index u_nclu_index on test(a)
------在试图上创建索引
create view v_test
with schemabinding
as
select id from dbo.test
--建立视图索引的前提有四个,都要在创建视图时满足
--1、要用with schemabinding绑定schema
--2、视图中用到的表格式要满足schema.test,如dbo.test,如果写成test,则报错
--3、select中要指定列名,如id,不能使用* 
--4、视图上要建立索引,先要建立唯一的聚集索引,只有建立了唯一的聚集索引才能建立非聚集索引

--在视图上建立唯一聚集索引
create unique clustered index v_clu_index on v_test(id)
--在视图上建立唯一聚集索引之后,可以建立非聚集索引
create nonclustered index v_nclu_index on v_test(name)

-------删除索引
drop index test.u_clu_index --eg 
-------删除由主键创建生成的聚集索引的话,需要删除主键约束
alter table test
drop constraint pk_test

-------禁用表索引
alter index u_uclu_index on test disable
--禁用聚集索引和禁用非聚集索引的效果是不一样的
--因为聚集索引的叶级别存储的是实际数据页本身
--而非聚集索引的叶级别存储的是指向实际数据页的指针
--所以当禁用聚集索引时,就无法访问到实际表数据
--而禁用非聚集索引,则只是指针,不会影响对实际表数据的访问
--如下:
--禁用聚集索引
alter index u_clu_index on test disable
select * from test
--当执行select 时得到以下提示
/*
The query processor is unable to produce a plan because the index 'u_clu_index' on table or view 'test' is disabled.
*/

--禁用非聚集索引
alter index u_uclu_index on test disable
select * from test
---当执行select时,能得到表数据,结果如下
/*
id	name
1	1
2	2
3	3
4	4	
*/

--当表上的聚集索引为disable时,则不能再表上创建非聚集索引
--例如
alter index u_clu_index on test disable
create index c_test on test(id)
--以上语句会得到下面的提示
/*
Cannot create nonclustered index 'c_test' on table 'test' because its clustered index is disabled.
*/

----以上禁用规则是针对表来说的,如果是视图的话,不管是禁用聚集索引还是非聚集索引
--禁用后,都能通过视图访问表数据


--补充:
--1、聚集索引列选择:经常出现在范围查询的关键字中(如between、大于和小于等关键字)
--2、经常更新或非唯一的列不适合建聚集索引
--3、非聚集索引选择列:出现在关键字where、order by、join中的列;高选择性且选择返回值少的列
--4、索引键不支持大型数据类型如:varchar(max),nvarchar(max),text,ntext,image,varbinary(max),nvarbinary(max),xml
--5、如果表中已经存在非聚集索引,则新建聚集索引会重建非聚集索引
--6、NULL值在唯一索引中是允许的,但是只能出现一次
--7、查看索引元数据 exec sp_helpindex 'tablename'

 

你可能感兴趣的:(索引基础)