SqlServer——索引
索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表。在数据库系统中建立索引主要有以下作用:
聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致。SQL Server 是按B树(BTREE)方式组织聚集索引的,B树方式构建为包含了多个节点的一棵树。顶部的节点构成了索引的开始点,叫做根。每个节点中含有索引列的几个值,一个节点中的每个值又都指向另一个节点或者指向表中的一行,一个节点中的值必须是有序排列的。指向一行的一个节点叫做叶子页。叶子页本身也是相互连接的,一个叶子页有一个指针指向下一组。这样,表中的每一行都会在索引中有一个对应值。查询的时候就可以根据索引值直接找到所在的行。
非聚集索引完全独立于数据行的结构。SQL Server 也是按B树方式组织非聚集索引的,与聚集索引的不同之处在于:非聚集索引B树的叶节点不存放数据页信息,而是存放非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。
在非聚集索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。只有在表上创建聚集索引时,表内的行才按特定顺序存储,这些行按聚集索引键顺序存储。如果一个表只有非聚集索引,则它的数据行将按无序的堆集方式存储。
在PXSCJ数据库中,经常要对XSB、KCB、CJB三个表进行查询和更新。为了提高查询和更新速度,可以考虑对三个表建立如下索引:
(1)对于XSB表,按学号建立唯一索引组织方式为聚集索引。
(2)对于KCB表,按课程号建立主键索引,组织方式为聚集索引。
(3)对于KCB表,按课程名建立唯一索引(UNIQUE约束),组织方式为非聚集索引。
(4)对于CJB表,按学号+课程号建立唯一索引,组织方式为聚集索引。
在SQL Server Management Studio中,既可利用界面方式创建上述索引,也可以利用T-SQL命令通过查询分析器建立索引。
启动“SQL Server Management Studio”,在对象资源管理器中展开“数据库”,选择“表”中的“dbo.XSB”,右击其中的“索引”项,在弹出的快捷菜单上选择“新建索引(N)…”菜单项。
这时,用户可以在弹出的“新建索引”窗口中输入索引名称(索引名在表中必须唯一),如PX_XSB,选择索引类型为“聚集”,勾选“唯一”复选框,单击新建索引窗口的“添加”按钮,在弹出的“选择要添加到索引键的表列”窗口中选择要添加的列,添加完毕后,单击“确定”按钮,在主界面中为索引键列设置相关的属性,单击“确定”按钮,即完成索引的创建工作。
在“表设计器”窗口创建索引的方法如下。
第1步:右击PXSCJ数据库中的“dbo.XSB”表,在弹出的快捷菜单中选择“设计”菜单项,打开“表设计器”窗口。
第2步:在“表设计器”窗口中,选择“学号”属性列,右击鼠标,在弹出的快捷菜单中选择“索引/键”菜单项。在打开的“索引/键”窗口中单击“添加”按钮,并在右边的“标识”属性区域的“名称”一栏中确定新索引的名称(用系统默认的名或重新取名)。在右边的常规属性区域中的“列”一栏后面单击“ ”按钮,可以修改要创建索引的列。如果将“是唯一的”一栏设定为“是”则表示索引是唯一索引。在“表设计器”栏下的“创建为聚集的”选项中,可以设置是否创建为聚集索引,由于XSB表中已经存在聚集索引,所以这里的这个选项不可修改。
第3步:最后关闭该窗口,单击面板上的“保存”按钮,在弹出的对话框中单击“是”按钮,索引创建即完成。
索引创建完后,只需返回SSMS主窗口,在对象资源管理器中展开“dbo.XSB”表中的“索引”项,就可以查看已建立的索引。其他索引的创建方法与之类似。
使用CREATE INDEX语句可以为表创建索引。
语法格式:
CREATE [ UNIQUE ] /*指定索引是否唯一*/
[ CLUSTERED | NONCLUSTERED ] /*索引的组织方式*/
INDEX index_name /*索引名称*/
ON {[ database_name. [ schema_name ] . | schema_name. ] table_or_view_name}
( column [ ASC | DESC ] [ ,...n ] ) /*索引定义的依据*/
eg:
/*为KCB表的“课程名”列创建索引*/
create index kc_name_ind
on KC(Cname)
go
Result:picture2
eg:
/*根据KCB表的“课程号”列创建唯一聚集索引,因为指定了CLUSTERED,所以该索引将对磁盘上的数据进行物理排序。*/
create unique clustered index xs_id_ind
on XS(Sname)
Result:
picture3
eg:
/*创建复合索引。*/
create index cj_ind
on XS(Sage,Sno1)
Result:
p4
eg:
/*根据XSB表中的“总学分”列创建索引*/
CREATE NONCLUSTERED INDEX score_ind
ON XS(Sno1)
eg:
/*根据XSB表中“学号”列创建唯一聚集索引。如果输入了重复的键,将忽略该INSERT或UPDATE语句。*/
CREATE UNIQUE CLUSTERED INDEX xs_ind
ON XS(Sno)
创建索引有如下几点要说明:
(1)在计算列上创建索引。对于UNIQUE或PRIMARY KEY索引,只要满足索引条件,就可以包含计算列,但计算列必须具有确定性,必须精确。若计算列中带有函数,则使用该函数时有相同的参数输入,输出的结果也一定相同时,该计算列是确定的。而有些函数,如getdate(),每次调用时都输出不同的结果,这时就不能在计算列上定义索引。
计算列为text、ntext或image列时也不能在该列上创建索引。
(2)在视图上创建索引。可以在视图上定义索引。索引视图是一种在数据库中存储视图结果集的方法,可减少动态生成结果集的开销。索引视图还能自动反映出创建索引后对基表数据所做的修改。
eg:
/*定义视图,在以下例子中使用了WITH SCHEMABINDING子句,因此定义视图时,SELECT子句中表名必须为“架构名.表名”的形式*/
CREATE VIEW View_stu WITH SCHEMABINDING
AS
SELECT Sno,Sname
FROM dbo.XS
GO /*在视图上创建索引*/
CREATE UNIQUE CLUSTERED INDEX Inx1
ON View_stu(Sno)
GO
Result:
p5.1,p5.2
通过图形界面方式删除索引的主要步骤如下:
启动SQL Server Management Studio,在对象资源管理器中展开数据库“PXSCJ→表→dbo.XSB→索引”,选择其中要删除的索引,单击鼠标右键,在弹出的快捷菜单上选择“删除”菜单项。在打开的“删除对象”窗口中单击“确定”按钮即可。
从当前数据库中删除一个或多个索引。
语法格式:
DROP INDEX
{ index_name ON table_or_view_name [ ,...n ]
| table_or_view_name.index_name [ ,...n ]
}
DROP INDEX语句可以一次删除一个或多个索引。这个语句不适合删除通过定义PRIMARY KEY或UNIQUE约束创建的索引。若要删除PRIMARY KEY或UNIQUE约束创建的索引,必须通过删除约束实现。
另外,在系统表的索引上不能进行DROP INDEX操作。
eg:
/*删除PXSCJ数据库中表KCB的一个索引名为kc_name_ind的索引。*/
IF EXISTS (SELECT name FROM sysindexes WHERE name = 'kc_name_ind')
DROP INDEX KC.kc_name_ind
SqlServer——索引的更多相关文章
- SQLServer索引
SQLServer索引1.聚集和非聚集索引聚集索引:根据聚集索引进行排序,非聚集索引因为不根据索引键排序,所以聚集索引比非聚集索引快(一个表只有一个聚集索引)2.唯一索引和非唯一索引唯一索引时值不能重 ...
- mssql sqlserver 索引专题
摘要: 下文将详细讲述sql server 索引的相关知识,如下所示: 实验环境: sql server 2008 R2 sqlserver索引简介: mssql sqlsever 索引分类简介 ms ...
- sqlserver 索引的结构及其存储,索引内容
sqlserver 索引的结构及其存储,sql server索引内容 文章转载,原文地址: http://www.cnblogs.com/panchunting/p/SQLServer_IndexSt ...
- sqlserver 索引优化 CPU占用过高 执行分析 服务器检查
原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚 ...
- 技术分享会(二):SQLSERVER索引介绍
SQLSERVER索引介绍 一.SQLSERVER索引类型? 1.聚集索引: 2.非聚集索引: 3.包含索引: 4.列存储索引: 5.无索引(堆表): 二.如何创建索引? 索引示例: 建表 creat ...
- sqlserver索引维护(重新组织生成索引)
sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = par ...
- SqlServer索引的原理与应用(转载)
SqlServer索引的原理与应用 索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类 ...
- SQLServer索引的四个高级特性
一Index Building Filter索引创建时过滤 二Index Include Column索引包含列 三聚集索引Cluster Index 四VIEW INDEX视图索引 SQLSer ...
- SqlServer索引的原理与应用
索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...
- sqlserver索引小结
1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书 ...
随机推荐
- 常见企业IT支撑【1、办公网络IP地址规划】
规划思路如下,可灵活变化
- PES包格式
PES是Packetized Elementary Stream的简称,是将原始ES流打包后形成的,再将PES经过不同的打包方式可以组成MPEG program stream 和 MPEG trans ...
- DS02--线性表
一.PTA实验作业 题目1:线性表元素的区间删除 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 1. 设计思 ...
- 推动FPGA发展箭在弦上,国内厂商须走差异化之路
7月25日,由中国电子报与深圳投资推广署共同举办的“第六届(2018)中国FPGA产业发展论坛”在深圳召开. 作为四大通用集成电路芯片之一,FPGA(现场可编程门阵列)的重要性与CPU.存储器.DSP ...
- Django模板输出Dict所有Value的效率问题
一次跑偏之旅! 对于一个惯用C++的人来说,使用Python这种语言的一大障碍就是许多集合类型的操作效率并不如传统的经典数据结构那样直观可见,以及许多实际上涉及到内存分配.对象复制之类的耗时操作被 ...
- (转)Inno Setup入门(十九)——Inno Setup类参考(5)
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17251019 单选按钮 单选按钮在安装中也很常见,例如同一个程序可以 ...
- java代码---indexOf()方法
总结:indexOf(String str,int index)方法.从参数指定位置开始,如果index值超过了字符串长度,则返回-1 package com.a.b; import java.io. ...
- jaxp使用笔记
XML文件的解析技术有DOM和SAX方式,在Android中还有pull解析方式,这里不再讨论 DOM解析的方式和js中的DOM操作是一致的,DOM解析一次将文档加载入内存建立树型模型,但是如果XML ...
- cookie加密
Cookie中的数据以文本的形式存在客户端计算机,考虑它的安全性,最好在将数据存入Cookie之前对其进行加密. 加密的方法很多,比较简单一点的有:Base64,md5,sha等,而相对比较复杂一点的 ...
- 0CTF题中的神奇宝贝WP
前言: 今天被尘少拉去做题 然后做到一个脑洞打开的题..... 神奇宝贝!?!? 正文: 一开始来到这=-= 弱密码猜测:admin admin 验证码用calc去算 然后成功进入 第一次去做神奇宝贝 ...