当前位置: 首页 > news >正文

Sql Server索引的创建及优化

一、什么是索引

  SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 。

聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。

二、索引原理

SQL Server中的索引是一种数据结构,用于提高数据检索效率。索引的存储结构通常是基于B树(Balanced Tree),它是一种平衡多叉树,用于快速查找、插入和删除操作。B树的设计初衷是为了减少对磁盘的扫描次数,通过将B树的根节点存入内存,经过几次查找就可以定位到数据所在的页,从而提高性能。

聚集索引(Clustered Index)决定了表中数据的物理存储顺序,类似于书本的目录,它允许每张表只能有一个。非聚集索引(Nonclustered Index)则类似于书的索引页,它不重新组织表中的数据,而是在索引结构中为每一行存储索引列值,并用一个指针指向数据所在的页面。一个表可以拥有多个非聚集索引。

三、索引的存储机制

首先,无索引的表,查询时,是按照顺序存续的方法扫描每个记录来查找符合条件的记录,这样效率十分低下,举个例子,如果我们将字典的汉字随即打乱,没有前面的按照拼音或者部首查询,那么我们想找一个字,按照顺序的方式去一页页的找,这样效率有多底,大家可以想象。

聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引。

四、索引创建

        1、创建聚集索引: 聚集索引决定了表中数据的物理存储顺序。一个表只能有一个聚集索引。

CREATE CLUSTERED INDEX idx_name ON table_name (column1, column2, ...);

        2、创建非聚集索引: 非聚集索引不改变表中数据的物理存储顺序,一个表可以有多个非聚集索引。

CREATE NONCLUSTERED INDEX idx_name ON table_name (column1, column2, ...);

        3、创建唯一索引: 唯一索引保证了在索引列中没有重复的值。

CREATE UNIQUE INDEX idx_name ON table_name (column1, column2, ...);

        4、创建索引时包含额外列: 使用 INCLUDE 子句可以在索引中包含额外的列,这些列不需要是索引键的一部分。

CREATE INDEX idx_name ON table_name (column1)
INCLUDE (column2, column3, ...);

        5、使用填充因子: 填充因子可以指定索引页的填充程度,以减少未来的页分裂。

CREATE INDEX idx_name ON table_name (column1)
WITH FILLFACTOR = 80;

        6、创建索引时忽略重复键: 使用 IGNORE_DUP_KEY 选项可以在插入重复键时不抛出错误。

CREATE UNIQUE INDEX idx_name ON table_name (column1)
WITH IGNORE_DUP_KEY;

五、索引使用

  1. 确保查询使用索引: 通过查看查询计划(SET SHOWPLAN_XML ON),确认查询是否使用了预期的索引。

  2. 避免全表扫描: 尽量设计查询语句,使其能够利用索引,避免不必要的全表扫描。

  3. 使用索引列作为查询条件: 在 WHEREJOINORDER BYGROUP BY 子句中使用索引列。

  4. 考虑索引的选择性: 选择性高的索引(即不同值较多的列)通常更有效。

  5. 使用索引覆盖: 如果一个查询只需要从索引中检索数据,而不是表数据,那么可以使用索引覆盖来提高性能。

  6. 定期维护索引: 使用 DBCC CHECKDB 检查索引的完整性,使用 DBCC INDEXDEFRAGDBCC SHOWCONTIG 检查索引的碎片化,并适时重建或重组索引。

  7. 删除不必要的索引: 如果索引不再被查询使用,或者其维护成本高于其带来的性能提升,考虑删除它们。

  8. 使用数据库引擎优化顾问: 数据库引擎优化顾问(DEOA)可以分析查询并推荐索引操作。

  9. 自动化索引维护: 使用 SQL Server Agent 作业自动执行索引维护任务。

六、索引优化

1、索引覆盖:创建只包含查询所需的列的索引,这样可以避免回表操作,提高查询效率。

2、包含列:在索引中包含额外的列,以避免额外的I/O操作,这在查询中需要多列但只有部分列在索引中时特别有用。

3、索引压缩:使用ALTER INDEX命令重建索引,并通过设置PAD_INDEXSORT_IN_TEMPDB等选项来减少索引的大小,提高索引性能。

4、索引重组与重建:定期对索引进行重组(ALTER INDEX REORGANIZE)和重建(ALTER INDEX REBUILD),以减少索引碎片化,提高查询性能。

5、监控索引碎片化:使用系统视图查询索引碎片化信息,并根据需要进行优化。

6、删除无用索引:删除那些不再使用或很少使用的索引,释放资源并提高性能。

7、更新统计信息:定期更新统计信息,确保查询优化器能够选择最佳查询计划。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多模态:Seed-story故事生成
  • 七、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制和JS颜色选择器改变灯珠颜色
  • 记一次 .NET某智慧出行系统 CPU爆高分析
  • 童装商城小程序的设计
  • 【数据结构】哈希应用-海量数据处理
  • MySQL进阶-MySQL管理
  • 【极客日常】Go语言学习干货——从零单排Golang系列合集
  • SSH服务高级配置:强制使用客户端指定的用户登录
  • django学习-数据表操作
  • Linux设置临时环境变量
  • 【vulnhub】Hack the 21LTR: Scene 1 靶机
  • C语言-函数
  • k8s—ingress应用
  • 通过提示词越狱解锁学习提示词的新姿势
  • MySQL 迁移 OceanBase 的 Oracle模式中,实现自增主键的方法
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • “大数据应用场景”之隔壁老王(连载四)
  • 03Go 类型总结
  • Intervention/image 图片处理扩展包的安装和使用
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java小白进阶笔记(3)-初级面向对象
  • mysql 数据库四种事务隔离级别
  • underscore源码剖析之整体架构
  • vagrant 添加本地 box 安装 laravel homestead
  • Vue官网教程学习过程中值得记录的一些事情
  • 构造函数(constructor)与原型链(prototype)关系
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 简单基于spring的redis配置(单机和集群模式)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 容器服务kubernetes弹性伸缩高级用法
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 学习ES6 变量的解构赋值
  • 用 Swift 编写面向协议的视图
  • 【云吞铺子】性能抖动剖析(二)
  • MPAndroidChart 教程:Y轴 YAxis
  • 仓管云——企业云erp功能有哪些?
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #if 1...#endif
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (算法)前K大的和
  • (五)activiti-modeler 编辑器初步优化
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (自适应手机端)行业协会机构网站模板
  • .net 受管制代码
  • .NetCore 如何动态路由
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • ??在JSP中,java和JavaScript如何交互?
  • @EnableWebMvc介绍和使用详细demo