关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »在SQL Server中使用索引的技巧

    在SQL Server中使用索引的技巧

    2015-11-17 00:00:00 出处:ITJS
    分享

    在SQL Server中,为了查询性能的优化,有时我们就需要对数据表通过建立索引的方式,目的主要是根据查询要求,迅速缩小查询范围,避免全表扫描。

    索引有两种类型,分别是聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。

    聚集索引在一个表中只能有一个,默认情况下在主键建立的时候创建,它是规定数据在表中的物理存储顺序,我们也可以取消主键的聚集索引,所以必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型,对其最常用的一个字段或者多个字段建立聚集索引或者组合的聚集索引,它就是SQL Server会在物理上按升序(默认)或者降序重排数据列,这样就可以迅速的找到被查询的数据。

    非聚集索主要是数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。可以在一个表格中使用高达249个非聚集的索引,在查询的过程中先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。这使非聚集索引成为精确匹配查询的最佳方法,因为索引包含描述查询所搜索的数据值在表中的精确位置的条目。

    所以我们在选择创建聚集索引的时候要注意以下几个方面:

    1) 对表建立主键时,就会为主键自动添加了聚集索引,如自动编号字段,而我们没有必要把聚集索引浪费在主键上,除非你只按主键查询,所以会把聚集索引设置在按条件查询频率最高的那个字段或者组合的字段。

    2) 索引的建立要根据实际应用的需求来进行,并非是在任何字段上建立索引就能提高查询速度。聚集索引建立遵循下面几个原则:

    包含大量非重复值的列。

    使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。

    被连续访问的列。

    返回大型结果集的查询。

    经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。

    OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。

    举例来说,银行交易日志中对交易日期建立聚合索引,数据物理上按顺序存于数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。而假如我们对员工的基本信息表中性别的字段列上建立聚集索引,就完全没有必要,因为内容里只涉及到 “男”与“女”两个不同值。

    3) 在聚集索引中按常用的组合字段建立索引,形成复合索引,一般在为表建立多个主键的时候就会产生,假如一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引,这样能形成索引覆盖,提高where语句的查询效率。

    4)索引对查询有一这的优化,但由于改变一个表的内容,将会引起索引的变化。频繁的对数据操作如insert,update,delete语句将导致系统花费较大的代价进行索引更新,引起整体性能的下降。一般来讲,在对查询性能的要求高于对数据维护性能要求时,应该尽量使用索引,有时在这种操作数据库比较频繁的某些极端情况下,可先删除索引,再对数据库表更新大量数据,最后再重建索引,新建立的索引总是比较好用。

    索引在使用了长久的时候,就会产生很多的碎片,查询的性能就会受到影响,这时候有两种方法解决,一是利用DBCC INDEXDEFRAG整理索引碎片,还有就是利用DBCC DBREINDEX重建索引。

    DBCC INDEXDEFRAG 命令是联机操作,所以索引只有在该命令正在运行时才可用。而且可以在不丢失已完成工作的情况下中断该操作。这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效。

    重新创建聚集索引将对数据进行重新组织,其结果是使数据页填满。填满程度可以使用 FILLFACTOR 选项进行配置。这种方法的缺点是索引在除去/重新创建周期内为脱机状态,并且操作属原子级。假如中断索引创建,则不会重新创建该索引。

    我们来看看索引重建使用的方法:

    语法 DBCC DBREINDEX ( [ ‘TableName’ [ , index_name [ , fillfactor ] ] ] )

    参数 ‘TableName’

    是要重建其指定的索引的表名。数据库、所有者和表名必须符合标识符的规则。有关更多信息,请参见使用标识符。假如提供 database 或 owner 部分,则必须使用单引号 (‘)

    将整个 database.owner.table_name 括起来。假如只指定 table_name,则不需要单引号。

    index_name 是要重建的索引名。索引名必须符合标识符的规则。假如未指定 index_name 或指定为 ‘ ‘,就要对表的所有索引进行重建。

    fillfactor 是创建索引时每个索引页上要用于存储数据的空间百分比。fillfactor

    替换起始填充因子以作为索引或任何其它重建的非聚集索引(因为已重建聚集索引)的新默

    认值。假如 fillfactor 为 0,DBCC DBREINDEX 在创建索引时将使用指定的起始fillfactor。

    我们在查询分析器中输入如下的命令:

    DBCC DBREINDEX (‘MyTable,’’,80)

    这样就会索引重建了。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。