• 数据库.Sqlserver.重建索引


    什么情况下需要重建索引

    都和碎片有关系,总结就是一高(高于20%)一低(低于75%),高不成低不就
    1.碎片总计过高
    参考值→碎片.碎片总计 > 20%

    2.碎片填充度过低
    参考值→碎片.页填充度 < 75%
    导致页填充度过低的可能原因:

    [
    	"1.有删除",
    	"2.有分区表",
    	"3.聚集索引不是数字",
    	"4.数据比较少(百万以内)"
    ]
    

    [注意.缺少一张图]

    重建索引

    ALTER INDEX <name of index> ON <table or view name> 
    REBUILD WITH (ONLINE = ON,MAXDOP = 4)
    
    {
    	"ONLINE":
    	{
    		"描述":"是否在线执行",
    		"ON":"在线执行,减少重建过程中的锁(执行时间延长)",
    		"OFF":"离线执行"
    	},
    	"MAXDOP":
    	{
    		"描述":"手动配置用于运行索引语句的最大处理器数",
    		"0":"指定服务器根据当前系统工作负荷确定所使用的 CPU 数目.这是默认值,还是推荐设置",
    		"1":"取消生成并行计划,操作将以串行方式执行",
    		"2~64":"将处理器的数量限制为指定的值.根据当前工作负荷,可能使用较少的处理器.如果指定的值大于可用的CPU数量,将使用实际可用的CPU数量"
    	}
    }
    
    
    --查找碎片率大于40
    SELECT 
    	object_name(object_id),
    	index_type_desc,
    	alloc_unit_type_desc,
    	avg_fragmentation_in_percent,
    	fragment_count,
    	avg_fragment_size_in_pages,
    	page_count,
    	record_count,
    	avg_page_space_used_in_percent
    FROM sys.dm_db_index_physical_stats(DB_ID('DBNAME'),OBJECT_ID(''),NULL,NULL,'Sampled')  
    WHERE avg_fragmentation_in_percent>40
    
    

    Sqlserver数据库的好多设置我们都忽略了,
    我们日常只是更多的在写SQL语句,
    我们可以考虑下升级我们的Sqlserver数据库版本,
    优化我们的SQL语句,
    深挖在这些SQL语句深处的一些低层知识.

    扩展:

    第一个阶段为新索引简单够造一颗空B+树...
    第二阶段包括由扫描表来获得每行的索引列,对行排序并将它们插入新的B+树中...
    最后阶段涉及更新目录以示索引创建已经完成,且索引对查询是可用的.

    • ...

    各个情况

    • 在线创建索引Vs离线创建索引
    • 创建索引的时候.表已经存在数据Vs表还没有数据

    参考文档

  • 相关阅读:
    避免使用HttpClient的系统代理
    C#使用ILGenerator动态生成函数
    leveldb和fork的初始化顺序
    模拟阻尼运动
    [c++]printf的编译器静态检测
    Git Submodule管理项目子模块
    redis 读写分离主从服务类借鉴
    git pull 冲突
    git log 查看提交记录
    自带单例模式的redis类
  • 原文地址:https://www.cnblogs.com/love-zf/p/13556601.html
Copyright © 2020-2023  润新知