SQL Server 索引和视图

Ø 索引

1.索引就是数据表中数据和相应的存储位置的列表,利用索引可以提高在表或视图中的查找数据的速度。


2.索引分类
数据库中索引主要分为两类:聚集索引和非聚集索引。

# 聚集索引
聚集索引是值表中数据行的物理存储顺序和索引的存储顺序完全相同。
聚集索引根据索引顺序物理地重新排列了用户插入到表中的数据,因此,每个表只能创建一个聚集索引。聚集索引经常创建在表中经常被搜索到的列或按顺序访问的列上。在默认情况下,主键约束自动创建聚集索引。

# 非聚集索引
非聚集索引不改变表中数据列的物理存储位置,数据与索引分开存储,通过索引指向的地址与表中的数据发生关系。
非聚集索引没有改变表中物理行的位置,索引可以在以下情况下使用非聚集索引:
如果某个字段的数据唯一性比较高
如果查询所得到的数据量比较少


聚集索引和非聚集索引的区别:

聚集索引 非聚集索引
每个表只允许创建一个聚集索引 最多可以有249个非聚集索引
物理的重排表中的数据以符合索引约束 创建一个键值列表,键值指向数据在数据页中的位置
用于经常查找数据的列 用于从表中查找单个值的列

 

3.创建索引
语法
create [unique] [clustered | noclustered]
index index_name
on table_name (column_name ...)
[with fillfactor=x]

参数
unique唯一索引
clustered聚集索引
noclustered非聚集索引
fillfactor填充因子大小,范围在0-100直接,表示索引页填满的空间所占的百分比。

示例
if (exists (select * from sys.indexes where name = 'idx_stu_name'))
drop index student.idx_stu_name
go
create index idx_stu_name
on
student(name);

 

 

--非聚集索引
create nonclustered index idx_cid
on
student (cid)
with fillFactor = 30; --填充因子

--聚集索引
if (exists (select * from sys.indexes where name = 'idx_sex'))
  drop index student.idx_sex
go
create clustered index idx_sex
on
student(sex);

 

--聚集索引
if (exists (select * from sys.indexes where name = 'idx_name'))
  drop index student.idx_name
go
create unique index idx_name
on
student(name);

 

4.适合的创建索引的列
当数据库的某一列被频繁的用于数据库查询时,或者该列用于数据库进行排序时可以创建成索引

 

5.不适合创建索引的列
如果列中有几个不同的值,或者表中仅包含几行值,则不推荐为其创建索引。因为索引在搜索数据所花的时间比在表中逐行搜索话的时间更长。

 

 

Ø 视图

1.什么是视图
视图就是一个虚拟的数据表,该数据表中的数据记录是由一条查询语句的查询结果得到的。

 

2.创建视图准则

# 视图名称必须遵循标识符的规则,该名称不得与该架构的表的名称相同
# 你可以对其他视图创建视图。允许嵌套视图,但嵌套不得超过32层。视图最多可以有1024个字段
# 不能将规则和default定义于视图相关联
# 视图的查询不能包含compute子句、compute by子句或into关键字
# 定义视图的查询不能包含order by子句,除非在select语句的选择列表中还有top子句

下列情况必须指定视图中每列的名称:
# 视图中的列都是从算术表达式、内置函数或常量派生而来
# 视图中有两列或多列具有相同名称(通常由于视图定义包含联接,因此来自两个或多个不同的列具有相同的名称)
# 希望视图中的列指定一个与其原列不同的名称(也可以在视图中重命名列)。无论是否重命名,视图列都回继承原列的数据类型

 

3.创建视图

if (exists (select * from sys.objects where name = 'v_stu'))
  drop view v_stu
go
create view v_stu
as
select id, name, age, sex from student;


4.修改视图

alter view v_stu
as
select id, name, sex from student;

alter view v_stu(编号, 名称, 性别)
as
select id, name, sex from student
go
select * from v_stu;

select * from information_schema.views;


5.加密视图

if (exists (select * from sys.objects where name = 'v_student_info'))
drop view v_student_info
go
create view v_student_info
with encryption --加密
as
select id, name, age from student
go
--view_definition is null
select * from information_schema.views
where table_name like 'v_stu';

 

 

 

 

 

 

 

 本文摘自:http://www.cnblogs.com/hoojo/archive/2011/07/18/2109291.html

 

 

 

 

 

 

 

 

posted on 2015-06-29 09:16  alex_cool  阅读(150)  评论(0编辑  收藏  举报