首页 > 数据库 >SQL Server【提高】碎片

SQL Server【提高】碎片

时间:2023-01-08 22:47:04浏览次数:40  
标签:name sum Server id 索引 SQL 碎片 pages

碎片

当对索引所在的基础数据表进行增删改时,若存储的数据进行了不适当的跨页(SQL Server中存储的最小单位是页,页是不可再分的),就会导致索引碎片的产生。

  • 外部碎片

    插入的数据使页与页之间造成断续,比如,插入的数据正好在页中最后一行,被挤出到别的页的数据,与原来的页之间没有了连续,这后果就严重了,这种情况就是外部的碎片。

  • 内部碎片

    当索引页没有用到最大量时就产生了内部碎片。

碎片处理

  1. 查看表空间碎片化的一些统计信息 dbcc showcontig
use ${数据库名}
dbcc showcontig with all_indexes 
--查看指定表的所有索引的碎片信息
dbcc showcontig (${表名}) with all_indexes   
--查看指定表、指定索引的碎片信息
dbcc showcontig (${表名},${索引名})

统计脚本

select 
   db_name() as dbname,
    t.name as tablename,
    s.name as schemaname,
    p.rows as rowcounts,
    sum(a.total_pages) * 8 as totalspacekb, 
    cast(round(((sum(a.total_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as 总共占用空间mb,
    sum(a.used_pages) * 8 as 总使用空间kb, 
    cast(round(((sum(a.used_pages) * 8) / 1024.00), 2) as numeric(36, 2)) as 总使用空间mb, 
    (sum(a.total_pages) - sum(a.used_pages)) * 8 as 碎片化空间kb,
    cast(round(((sum(a.total_pages) - sum(a.used_pages)) * 8) / 1024.00, 2) as numeric(36, 2)) as 碎片化空间mb
from 
    sys.tables t
inner join      
    sys.indexes i on t.object_id = i.object_id
inner join 
    sys.partitions p on i.object_id = p.object_id and i.index_id = p.index_id
inner join 
    sys.allocation_units a on p.partition_id = a.container_id
left outer join 
    sys.schemas s on t.schema_id = s.schema_id
where 
    t.is_ms_shipped = 0
    and i.object_id > 0
group by 
    t.name, s.name, p.rows
order by 
    总共占用空间mb desc
  1. 删除索引并重建

  2. 使用DROP_EXISTING语句重建索引

  3. 使用ALTER INDEX REBUILD重新生成索引。(推荐)

  4. 使用ALTER INDEX REORGANIZE重新组织索引。(推荐)

重建索引

REBUILD和Reorganize区别

Rebuild 是重新创建,将Index之前占用的空间释放,重新申请空间来创建index

Reorganize 是重新组织,将index的叶子节点进行重新组织

标签:name,sum,Server,id,索引,SQL,碎片,pages
From: https://www.cnblogs.com/thomerson/p/17035609.html

相关文章

  • mysql
    mysqlMySQL上篇:基础篇】【第1子篇:数据库概述与MySQL安装篇】p01-p11学习建议:零基础同学必看,涉及理解和Windows系统下MySQL安装【第2子篇:SQL之SELECT使用篇】p12-p48......
  • 登录他人mysql
    //登录参数:mysql-u用户名-p密码-h要连接的mysql服务器的ip地址(默认127.0.0.1)-P端口号(默认3306)  ......
  • 2.Mysql的角色管理
    1.Mysql角色Mysql从8.0开始就支持roles,这个在Oracle可是一直存在的,然后Mysql终于在8.0上开始支持了。2.什么是Mysql的roles?Mysql的roles说直白就是一堆权限的集......
  • ubuntu20下mysql5.7数据库修改密码
    --找到mysql配置文件修改/etc/mysql/mysql.conf.d/mysqld.cnf#加上下面的可以不要密码登录#skip-grant-tables#skip-networking然后重启mysql服务servicemysqlr......
  • mysql定时事件设置
    //查看事件调度器是否开启SHOWVARIABLESLIKE'event_scheduler';//开启事件调度器SETGLOBALevent_scheduler=ON;//创建定时事件DELIMITER$$CREATEEVENTIFNOTE......
  • MSSQL攻击面探索
    xp_cmdshell开启id=1'EXECsp_configure'showadvancedoptions',1;RECONFIGURE;execSP_CONFIGURE'xp_cmdshell',1;RECONFIGURE;--+命令执行id=1'execm......
  • sql注入学习笔记
    一.基础sql语法知识SELECT查询信息SELECT*FROMTABLES查询表中所有列SELECTCOLUMN1,COLUMN2FROMTABLES查询表中具体的列SELECTDISTINCTCOLUMN1FROMTABLES......
  • MySQL8免安装版下载安装与配置(linux)
    一、前言基于Linux平台的MySQL安装文件有三个版本,分别是RPM软件、GenericBinaries软件包、源码包,具体介绍如下:①RPM软件包是一种Linux平台下的安装文件,通过相关命令可以......
  • mysql5.7配置文件
    [client]port =3306socket =/data/mysql/mysql.sock[mysql]prompt="\u@mysqldb\R:\m:\s[\d]>"no-auto-rehash[mysqld]server-id={{server_id}}gtid-mode=onenforce......
  • sqlops新增pt-osc功能,研发可以在网页里执行大表Alter更改表结构操作。
    sqlops新增pt-osc功能,触发条件:1)当行记录小于150万行,研发可以直接在网页里执行Altertable操作。2)当行记录大于150万行并且小于3000行,平台将调用pt-online-schema-change开源......