SQL Server系统oracle获取索引建议创建的建议,该如何处理

SQL Server索引选择的引用与建议
13:00:00 IT专家网
  此文章主要讲述的是SQL Server索引选择(Index Selection),当决定在表中创建哪些索引时,我们要对应用中查询做一仔细分析。其具体包括,检查查询子句中包括了哪些列;了解数据的分布情况来决定索引的用途;对执行的查询按照重要性和频繁性进行排序。
  你须注意的是,在创建索引时,不要为了考虑单个的查询而忽略了该表上的其他查询(顾此失彼)。你应该提出一组索引服务于你的表中最有代表性的查询。
  引用建议:
  SQL Profiler是一个用来帮助你来识别频繁执行和关键的查询的有用的工具。我发现,当你着手处理一个新客户的网站或识别需要调优的应用中有问题查询时,SQL Profiler简直是一个无价之宝。SQL Profiler允许你跟踪SQL Server中正在执行的进程和查询,也可以捕捉 runtime, reads and writes, execution plans,和其他进程信息。这些信息能帮助你识别哪些查询的性能低下,哪些查询经常执行,哪些索引经常被查询用到等等。
  你能手工来分析这些信息,也可以保存下来,用索引调优向导(Index Tuning Wizard)进行分析。
  因为不可能为所有的列都创建索引,所以,索引首先要满足你的应用中最关键或者是被很多用户频繁执行的查询。如果你有一个查询每月只运行一次,值得创建一个索引来支持该查询吗?并且在该月的其他时间还需要进行维护它。该月中,系统在此索引上花费的时间毫无疑问超过了满足该查询的表扫描花费时间。
  如果,因为处理的需要,你必须在该查询运行时需要索引,可以考虑在运行查询时创建一个索引,而在运行结束之后删除该索引。只要创建索引的时间加上有索引的查询执行时间不超过无索引查询执行的时间,那么这也是一种可行的方法。
  以上的相关内容就是对SQL Server索引选择(Index Selection)的介绍,望你能有所收获。
&&& 编辑推荐:
CTOCIO.com.cn 渝B2-
手机IT专家网 m.ctocio.com.cn当前位置: →
→ 数据库多少时间重建一次索引比较好解决方法
数据库多少时间重建一次索引比较好解决方法
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: 数据库多少时间重建一次索引比较好?数据库最大的表记录超过3000万,每日写入10万,多久重建一次索引比较好?因为重建一次需要...
"数据库多少时间重建一次索引比较好解决方法"::
多少时间重建一次索引比较好?最大的表记录超过3000万,每日写入10万,多久重建一次索引比较好?因为重建一次需要花2个小时,所以不想太频繁,各位意见如何?------解决方案--------------------表数据量过大,建议分表。
------解决方案--------------------每年一个库,每个月一张表,建立适当的索引。
------解决方案--------------------每月建一个表不大合适,经常有跨月查询,处理就麻烦了,比如4月10日要差3月20到4月5日之间的数据就不是很方便了。
-----------------------------------------------
对大表按时间分区,建立分区视图,检索视图即可。
------解决方案--------------------对大表按时间分区,建立分区视图,检索视图即可。
------解决方案--------------------多少时间重建一次索引比较好?
-----------------------------------
具體問題具體分析,若索引建立合理,就不用重建了
所謂合理就是該建主鍵的必須建主鍵,其次要看經常被用來搜索的字段中出現頻率最高的,
且建立了索引后更新、插入操作所受的影響能夠接受 搜索此文相关文章:多少时间重建一次索引比较好解决方法此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
数据库多少时间重建一次索引比较好解决方法_sql server相关文章
sql server_总排行榜
sql server_最新
sql server_月排行榜
sql server_周排行榜
sql server_日排行榜
马开东博客专栏
企业软件/开发
硬件/嵌入开发
马开东博客专栏
应用服务器
软件工程/管理/测试
马开东博客专栏
Linux/Unix
马开东博客专栏
开发语言/框架
专题开发/技术/项目
马开东博客专栏
高性能开发
马开东博客专栏SQL Server查询性能优化——创建索引原则(一)
索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以。但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。索引建少了,用WHERE子句找数据效率低,不利于查找数据。索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL&SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。因此要建得恰到好处,这就需要经验了。
一:索引的基本目的
索引的基本目的是在大量数据中找寻少量数据。你可以想像一下,若一本书有700页,就像数据表有700个数据页,而索引却有600个索引页,你会想用索引来查询书籍的内容吗?
索引字段的值重复性越低越好,假设书籍中如&的&了这些在文章中重复性极高的字,每页都有一大堆,你会先翻索引页某个位置有&的,翻回该页读取了&的之后,再索引看下一个&的,结果是在先前同一页的不同位置,又翻回书籍原页查看下一个&的。
那么怎么理解索引是从大量数据中寻找少量数据呢?下面我们举个例子来说明。
如果一个数据表的记录平均长度为400字节,则100万条记录需要5万个数据页,其计算公式如下:
  1000000/()=50000
  如果该数据表建立聚集索引,键值为4个字节长度,而ID的数据长度为13个字节,因此索引结构每条记录为20个字节。
  4(聚集索引键值)+13(ID键值)+3(管理信息)=20
  以ID字段所建立的索引,100%填充率,则总分页数约为2482页,其计算方式如下:
  60/20)
  即使是使用80%的填充率来计算也只有3106页。其计算方式如下:
  1000000/(()/20)
  从上面可以看出如果是第一种情况,则索引页只占到总数据页的5%:
  =0.04964&
  即使考虑取每页只填充80%的索引数据,第二种情况,索引页也只是占总数据页的6%:
  =0.06212&
  再说如果查询条件中的字段建立索引,则由于索引键值数据都是以B-Tree有顺序的摆放,所以可采用二分查找找数据。也就是2的N次方大于记录数,就可以找到该条数据。而2的20次方大于100万,因此最多找寻20次就可以找到该条记录。由于比较次数少,数据结构也小,节省访问硬盘与内在的资源,索引将大幅提升找寻数据的效率。SQL&SERVER为提高访问与查找对比的效率,用来作索引的数据域键值愈小愈好,也就是要让分页尽量存更多的键值记录。
  如果未使用&UNIQUE&属性创建聚集索引,引擎将向表自动添加一个&4&字节的&uniqueifier&列。必要时,数据库引擎将向行自动添加一个&uniqueifier&值以使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
二:什么是索引
  在&SQL&Server&中,索引是按&B&树结构进行组织的。如下图。
  您也可以把索引理解为一种特殊的目录。微软的SQL&SERVER提供了两种索引:聚集索引(clustered&index,也称聚类索引、簇集索引)和非聚集索引(nonclustered&index,也称非聚类索引、非簇集索引)。下面,举例来说明一下聚集索引和非聚集索引的区别:
  其实,新华字典的正文本身就是一个聚集索引。比如,我们要查&按字,就会很自然地翻开字典的前几页,因为&按的拼音是&an,而按照拼音排序的新华字典是以英文字母&a开头并以&z结尾的,那么&按字就自然地排在字典的前部。如果您翻完了所有以&a开头的部分仍然找不到这个字,那么就说明新华字典中没有这个字;同样的,如果查&招字,那也会将新华字典翻到最后部分,因为&招的拼音是&zhao。也就是说,新华字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。我们把这种正文内容本身就是一种按照一定规则排列的目录称为&聚集索引。
  如果您碰到一个不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据&偏旁部首查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合&部首目录和&检字表而查到的字的排序并不是真正的正文的排序方法,比如您查&张字,我们可以看到在查部首之后的检字表中&张的页码是672页,检字表中&张的上面是&驰字,但页码却是63&页,&张的下面是&弩字,页面是390页。
很显然,这些字并不是真正的分别位于&张字的上下方,现在您看到的连续的&驰、张、弩三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后&再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为&非聚集索引。
通过以上例子,我们可以理解到什么是&聚集索引和&非聚集索引。进一步引申一下。
  聚集索引指的是数据表本身就是索引的一部分,就是指数据表本身就是聚集索引的子叶层,整个数据表的摆放顺序是按照你选定的键值由小到大排序,SQL&SERVER2000&之后的版本可指定数据由大到小排序。
  整个数据表按照键值字段由小到大排序,再搭配由键值字段加上指针的上层索引结构,也就是根节点和非子叶层级,形成整个聚集索引。因为数据表内实际摆放数据的方式只能遵循一种顺序,所以一个数据表只能有一个聚集索引。在指定聚集索引时,数据域本身并不需要唯一,或指定为唯一的聚集索引,SQL&SERVER内部会自动为重复的键值建立4个字节的唯一标识。
  如果你的数据表有一列常常用来排序,另一列常常用来&范围查询,还有一列重复性非常高,则该用哪一列来做聚集索引。正确答案是依据哪个查询最重要,最常被用户执行。例如:你的老板一小时内多次执行某个查询当然比一个月执行一两次的查询来得重要。&
  表(堆)创建聚集索引或删除和重新创建现有聚集索引时,要求数据库具有额外的可用工作区来容纳数据排序结果和原始表或现有聚集索引数据的临时副本。&
  当堆或聚集表具有多个分区时,每个分区都有一个堆或&B&树结构,其中包含该指定分区的行组。例如,如果一个聚集表有&4&个分区,那么将有&4&个&B&树,每个分区一个。
  聚集索引(&Clustered&Index)
  &聚集索引的叶节点就是实际的数据页
  &在数据页中数据按照索引顺序存储
  &行的物理位置和行在索引中的位置是相同的
  &每个表只能有一个聚集索引
  &聚集索引的平均大小大约为表大小的&5%左右
  要使用索引来更有效地排序查询数据,最直接的方式就是在你要排序的字段上建立聚集索引。在建立聚集索引之后,SQL&SERVER会重新组织数据页,让其中的数据行按照聚集索引中键值的顺序存储。SQL&SERVER不需要在硬盘上的数据一定要实际按照聚集索引排序,但在建立聚集索引时,会尝试在逻辑上排序数据的同时,也会在物理上让数据尽可能地排序。在索引子叶层级中的每个数据页都有一个指针指向索引分页的前一页与后一页,形成双向链接串行,在内部的数据表包含了各索引子叶层第一个分页的地址,为了保证数据在逻辑上是依照聚集索引的顺序存放的,SQL&SERVER&只需要由第一个分页开始,并依照其连接串行一个接着一个依序寻找数据即可。如下图。
注:聚集表是有聚集索引的表。
非聚集索引
&  非聚集索引是完全独立于数据表之外的结构,所以不会影响数据行的顺序,其子叶层包含索引行。每个索引行包含非聚集键值、行定位符和任意包含列或非键列。行定位符中存入的数据有两种类型:书签(BOOKMARK)或聚集索引的键值。如果数据表上建立了聚集索引,则行定位符中存入的数据就是聚集索引的键值。如果数据表没有建立聚集索引,则行定位符中存入的数据就是书签,即指向数据表中记录具体位置的ROWID,也就是文档编号、分页编号与页内记录编号(称之为SOLT编号)所组合成的值。通过该ROWID&在数据表内获取数据就称为书签查找&BOOKMARK&LOOKUP。所以,一般通过非聚集索引查找到符合的键值后,还会搭配书签查找。
  当非聚集索引从结构中找到符合的记录时,虽然在子叶层该键值是由小到大排序,因此可能在一个分页上就有全部符合查询条件的键值,但因为数据表中数据行的摆放是没有按顺序的(或是说没有按照该非聚集索引的键值顺序摆放),所以真正符合记录的数据是散布在文档各处的,而SQL&SERVER每次读取数据都是以数据页为单位,因此,找到一条记录所在位置后,要先将存放该条记录的分页读到内存中,再从该页读出记录。
  因为BOOKMARK&LOOKUP是进行随机的I/O操作,当符合查询的记录很多时,通过非聚集索引访问将导致数据页读取非常频繁,就算两条记录在同一个分页,该分页也会被重复读两次,因此或符合的记录有N条,就需要读取数据表内的分页N页,虽然大部分的读取操作都是针对内存中的高速缓存,但记录数过多时一样没有效率,还不如数据表扫描,全部扫描一遍,把符合条件数据找出来。
  虽然&SQL&2005&以后的版本中已经不在提&BOOKMARK&LOOKUP了(但实际上却是换汤不换药),我们的很多搜索都是使用如下的搜索过程:先在非聚集中找,然后再在聚集索引中找。如下图。
  非聚集索引&(&Unclustered&Index)
  &非聚集索引的页,不是数据,而是指向数据页的页。
  &若未指定索引类型,则默认为非聚集索引
  &叶节点页的次序和表的物理存储次序不同
  &每个表最多可以有&249个非聚集索引(一般认为每个表不应该超过10个索引)
  &在非聚集索引创建之前创建聚集索引(否则会引发索引重建)
  聚集索引与非聚集索引使用的情况:
使用聚集索引&
&使用非聚集索引
&列经常被分组排序(order&by)
&返回某范围内的数据
&小数目的不同值
&大数目的不同值
&频繁更新的列
&频繁修改索引列
&一个或极少不同值
  今天就普及一下索引的一些基本知识,明天来说明怎么选择要创建索引的列,条件是什么,方法是什么。SQLServer如何在建表的时候建索引?
[问题点数:40分]
SQLServer如何在建表的时候建索引?
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年10月优秀大版主优秀小版主
2017年1月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|

我要回帖

更多关于 oracle获取索引建议 的文章

 

随机推荐