首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
||
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语 |
||
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
||
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平 驾驶员 | 网络编辑 |
||
卫生资格 | 执业医师 | 执业药师 | 执业护士 | ||
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
||
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 |
||
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
文章主要描述的是SQL Server聚集索引的指示(Cluster Index Indications),在实际操作中借助聚集索引来进行搜索行,在一般的情况下会比借助非聚集索引来搜索行快主要有两个原因。原因一是聚集索引只包含了一个指向页的指针而不是指向单个数据行的指针;
所以,一个聚集索引比非聚集索引更紧凑。因为SQL Server聚集索引更小并且不需要额外的书签查找来发现匹配的行,而且比相似定义的非聚集索引可通过更少的页的读操作来发现行。
第二个原因是聚集索引的表中的数据物理上就是按照聚集键来存放,搜索重复值或者聚集键的一个范围值更快;行之间相互邻接并且SQL Server能简单定位第一个满足条件的行然后顺序搜索直到发现最后一个满足条件的行。然而,每个表上只能创建一个聚集索引,你必须明智地选择在哪个列或哪些列上来定义聚集索引。
如果你要求在一个表上只创建一个单独的索引,那创建SQL Server聚集索引有很大优势;则结果就是在修改、插入和删除时的负担将比创建非聚集索引的负担要小的多。
默认情况下,表中的主键将被定义为聚集的唯一索引。在大多数应用中,表上的主键列总是以单行查找的方式来检索。对于单行查找,一个非聚集索引通常比一个相似的聚集索引花费更少的I/O代价。你或者你的用户真正注意过读三页去检索单个数据行和四到六页去检索单个数据行之间的区别吗?不一定。然而,如果你执行一个范围检索,比如查找last name,你将会注意到扫描表的10%和使用全表扫描来发现行之间的区别吗?一定会的。
根据这种思想,你可能想为你的主键创建一个唯一的非聚集索引,并选择其他候选列做为你的聚集索引。下面就是一些指南,可以帮助你来选择SQL Server聚集索引的潜在的候选者:
一些频繁搜索的具有许多重复值的列,比如, where last_name = 'Smith' 因为数据物理上是有序的,所有的重复值将聚集在一起。任何一个对该键值的查询将会用最小的I/O来发现所有的值。SQL Server 定位第一个满足SARG的行,然后按顺序扫描数据直到找到最后一个满足SARG的行。
经常被ORDER BY子句指定的列。
因为数据已经是有序的,如果ORDER BY 是关于聚集索引的,那SQL Server将避免重新排序。记住:即使对一个表扫描,数据也将会按照聚集键值的顺序检索,因为数据表上的数据是按照聚集键值排序。
经常按照一个范围值进行查询的列,例如,Where price between ¥10 and ¥20 使用聚集索引首先定位第一个满足范围条件的行。因为表中的行按顺序排列,SQL Server能简单按顺序扫描数据页直到最后个满足范围的条件的行。当满足条件的结果集非常大,从执行的逻辑I/O来讲,SQL Server聚集索引扫描将比借助非聚集索引重复进行书签查找更有效。
除了主键外,频繁使用在join子句中的列。聚集索引趋向于比非聚集索引更小;每个查找需要页的I/O一般来讲比非聚集索引更少。当join许多记录时这种区别将是巨大的。一两个额外的读页操作好像对一个单行检索来说不多,但是把这些额外的对100,000join迭代的读页操作相加,你会看到总共100,000到200,00读页操作。
选择聚集索引键时应满足四个特点:
Narrow(窄,即长度短)
Unique(唯一性)
Unchanging(不变化)
Ever increasing(不断增长)
当你考虑聚集索引列时,你可能想尝试在相对静态的列上创建SQL Server聚集索引,来最小化由于索引列的修改而引起的数据行重新排序。任何时间当聚集索引的键值改变了,所有把聚集索引作为书签的非聚集索引都需要被修改。
尽量避免在以单调形式插入的顺序的键字段上创建聚集索引,比如一个标识列(identity column)。这会在表的末尾创建一个"热点"(hot spot),结果会在表和索引的的末尾导致锁竞争和死锁。另外,聚集索引也不会重用以前数据页中的空间,因为所有新的行都排在数据表的末尾。这种情况造成了空间的浪费和你的表的增长会比预期的要大。一般的建议是,尽量在一个有某种随机分布的数据值上建立索引。尽量选择一个使得插入和修改活动散布在整个表的聚集键。一些能够使得数据随机化的候选聚集索引包括下列:出生日期、Last name first name、邮编
一个随机hash key(通常只当没有其他实际列可以作为好的候选的SQL Server聚集索引时才使用)
在整个表上散布你的数据有助于最小化页竞争,同时也提供了更有效的空间利用。如果序列键是你的主键,你仍能用一个唯一、非聚集索引来提供一个访问路径并维护主键的唯一性。
因为你只能以一种方式对表上的数据进行物理排序,你只能有一个聚集索引。你想索引的其它列只能被定义为非聚集索引。
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |