2011.11.1好日子,今天博客访问量超过1000了。 2012.01.29,访问量突破2000了. 2012.02.01,访问量突破3000了.继续进步

SQL自我培训-(SQL server索引,游标学习笔记)

上一篇 / 下一篇  2012-02-01 02:10:24 / 个人分类:SQL测试

由于此部分是我实际运用较少的部分和学习量较多的部分,所以把一些自己的以学习笔记方式把比较好的部分写出来,后续总结学习经验的时候会更加理清楚.

索引:是关系型数据库的一个基本概念。索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针,SQL server 2000中,有唯一索引和聚集索引。唯一索引要求该索引的主键是唯一的。而在聚集索引中,表中各行的物理顺序与索引键值的逻辑顺序相通。聚集索引是加快UPDATE和DELETE的操作速度。
建索引一般情况会提升查询效率,但会降低增删改的效率, 要不要建索引,首先要看你的数据量如何,如果数据量不大,就没有必要建立索引了,因为作用不大,还增加了索引的维护工作


索引类型:
唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个


唯一索引:
唯一索引不允许两行具有相同的索引值。
如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。
提示:创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束。
主键索引:在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。


聚集索引(clustered index)
在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。


非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引

索引的优缺点
优点:快访问速度,强行的唯一性
缺点:索引的表在数据库中需要更多的存储空间,纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新

创建索引的指导原则:按照下列标准选择建立索引的列。
该列用于频繁搜索;列用于对数据进行排序
请不要使用下面的列创建索引:
列中仅包含几个不同的值。表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长

游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。

对比游标与SQL语句:
游标:可以部分处理,也就是对游标中的记录可以部分处理成功,部分处理失败,处理失败的可以以另外一种方式记载下来,这种方式在很多场合很有用,提供了更大的灵活性,可以撰写很复杂的逻辑,而且从某种程度上来说更加自然些,但是在SQL和PL/SQL中转换,效率较低些。
SQL:在数据量较大时效率高些(数据量较少时没有优势),但是一个块中的一条语句出错,后面的DML语句都不会被执行,前面执行成功的就成功了,不会被自动ROLLBACK,而且可能某些条件会写两遍


对比游标,索引,事务的作用:
索引可以看成是你数据表的目录,主要是方便查询而使用的,在对表中数据进行查找和排序的时候效果明显.事务是指作为单个逻辑工作单元执行的一系列操作。使用事务主要是为了确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。游标主要由两部分组成:游标位置和结果集。主要是用来操作查询结果集的。


一个完整的游标由5部分组成,并且这5个部分应符合下面的顺序。
声明游标,打开游标,一个游标中查找信息, 关闭游标,释放游标.
创建游标变量
SQL语句如下:
USE pubs
DECLARE MyCursor_001 Cursor FOR    --创建游标
SELECT * FROM Jobs
OPEN MyCursor_001    --打开游标DECLARE @CursorVar Cursor    --创建游标变量
SET @CursorVar = MyCursor_001    --为游标变量赋值
FETCH NEXT FROM @CursorVar    --读取游标变量中的值    
CLOSE MyCursor_001    --关闭游标
DEALLOCATE MyCursor_001    --释放游标

静态游标
静态游标的完整结果集在游标打开时建立在tempdb中。静态游标总是按照游标打开时的原样显示结果集。静态游标在滚动期间很少或根本检测不到变化,虽然它在tempdb中存储了整个游标,但消耗的资源很少。尽管动态游标使用tempdb的程度最低,在滚动期间它能够检测到所有变化,但消耗的资源也更多。键集驱动游标介于二者之间,它能检测到大部分的变化,但比动态游标消耗更少的资源。


动态游标
动态游标与静态游标相对。当滚动游标时,动态游标反映结果集中所做的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会改变。所有用户做的全部UPDATE、INSERT和DELETE语句均通过游标可见。


只进游标
只进游标不支持滚动,它只支持游标从头到尾顺序提取。只在从数据库中提取出来后才能行检索。对所有由当前用户发出或由其他用户提交、并影响结果集中的行的INSERT、UPDATE和DELETE语句,其效果在这些行从游标中提取时是可见的。


键集驱动游标
打开游标时,键集驱动游标中的成员和行顺序是固定的。键集驱动游标由一套被称为键集的惟一标识符(键)控制。键由以惟一方式在结果集中标识行的列构成。键集是游标打开时来自所有适合SELECT语句的行中的一系列键值。键集驱动游标的键集在游标打开时建立在tempdb中。


TAG:

 

评分:0

我来说两句

acbennn

acbennn

站在云端看浮云,晕. CSDN的博客:http://blog.csdn.net/bullswu/article/details/6798437

日历

« 2024-04-28  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 60171
  • 日志数: 44
  • 建立时间: 2011-09-18
  • 更新时间: 2013-09-22

RSS订阅

Open Toolbar