zoukankan      html  css  js  c++  java
  • SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题

         以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下

    下面这个表格是摘自:http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.html

    动作描述    使用聚集索引 使用非聚集索引
    外键列   应 
    主键列 
    列经常被分组排序(order by)   应
    返回某范围内的数据 不应
    小数目的不同值 不应
    大数目的不同值  不应
    频繁更新的列   不应
    频繁修改索引列 不应
    一个或极少不同值 不应 不应

         首先看看索引是怎么创建的,我比较菜,喜欢用管理工具

    创建聚焦索引

    image         

    选择为那个字段创建索引是通过选择的

    image

    非聚焦索引只需要改一下类型即可

    创建了两个一个聚焦索引一个非聚焦索引

    image               

    书上是这么解释聚焦索引和非聚焦索引的区别

    表有两种组织形式,堆或B树

    当在一个表上创建聚集索引时,表组织为一个B树(平衡树),否则组织为一个堆

    还有sqlserver的存储单位

    页:是sqlserver存储数据的最小单位,大小为8kb

    区:是由8个物理上连续的页组织成的单位

    页sqlserver最小的i/o读写单位,而i/o读写中开销最大的部分是磁盘臂(disk arm)的移动,

    也就是说某个查询如果需要频繁的移动磁盘臂,那查询效率就低了,

    什么原因会导致磁盘臂的移动?书商还没总结完。。。。。

    书还没看完,感觉索引的碎片是会触发磁盘臂移动的一个关键因素

         不同于分配顺序扫描(非聚焦索引),索引有序扫描(聚焦索引)的性能取决于索引的碎片级别,如果没有任何碎片,索引的顺序扫描的性能非常接近分配顺序扫描的性能

    分配顺序扫描是按照文件进行扫描,不受逻辑碎片的影响

         任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,这些操作的开销可能非常高。

    碎片,什么是碎片?书翻N页后发现了

          碎片是指逻辑扫描碎片、平均碎片百分比或外部碎片,这类碎片表示索引中无序页所占的百分比,无序页是根据页的物理顺序和页在索引链表中的逻辑顺序来确定的,碎片对索引有序扫描影响非常严重

    有一些sql语句可以查看当前数据库中每个表包含碎片的百分比,常用与索引优化

    如果需要修复碎片,就需要重建索引

    所以我的理解是

    任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,从而产生碎片

         对与聚焦索引和非聚焦索引的区别使用

    动作描述    使用聚集索引 使用非聚集索引
    外键列   应 
    主键列 
    列经常被分组排序(order by)
    返回某范围内的数据 不应
    小数目的不同值 不应
    大数目的不同值  不应 
    频繁更新的列   不应
    频繁修改索引列 不应
    一个或极少不同值 不应 不应

    不应使用聚焦索引的两种情况(红色部分),就是因为产生了大量的碎片

    那绿色的是为什么呢?我又查了一下

    sqlserver 查询优化器里面

    如果该查询的【选择性】足够高,优化器会会使用这个索引。

    选择性是指返回行数占表总行数的百分比,高选择性是指地百分比,低选择性是指搞百分比

    所以我猜绿色部分和这个【选择性】密切相关,可能低选择性会导致整表扫描

    关乎非聚焦索引 在粗体字那几个环境下,为什么不建议使用,还没找到原因

    尤其是一个或极少不同值 两个索引都不让用表示非常费解,那该用啥呢?用户id不就是这种情况

    test
  • 相关阅读:
    问题记录_Idea2021.2.3版本,Windows11版本,注册无法跳转Google浏览器
    问题记录_在IDEA中使用Git操作缓慢
    百页 PPT BPF 技术全览 深入浅出 BPF 技术
    揭秘 BPF map 前生今世
    一道双哈希题,但是为什么TLE??2021山东icpc省赛 F题 Birthday Cake
    oracle游标使用的几个场景
    MySQL 锁问题(脏读、锁阻塞、死锁)
    oracle存储过程中的变量
    tableau学习
    Power BI学习
  • 原文地址:https://www.cnblogs.com/qqloving/p/2300882.html
Copyright © 2011-2022 走看看