首页 > 数据库 >SQLServer性能优化之二

SQLServer性能优化之二

时间:2023-12-02 18:12:44浏览次数:30  
标签:count index SQLServer 之二 sys 索引 avg 优化 id

SQLServer性能优化之二


背景

优化了机器的硬件配置之后性能好了很多
但是偶尔还是会出现阻塞.
SQL总是奇奇怪怪的. 
其实第一天时就感觉可能是索引存在问题. 
但是dbcc 重建所有数据库的索引太慢了. 
所以作罢了, 从HDD传输到SSD后大部分功能已经可以用了
以为问题就此解决, 但是跟踪发现还是存在风险.
所以继续跟踪一下, 怀疑跟索引的碎片率太高有关系. 

SQLServer索引碎片的判断方法

SQLServer 判断索引碎片的方法
# 查看索引大小, 以及碎片情况
SELECT OBJECT_NAME(sys.indexes.OBJECT_ID) AS tableName,
 sys.indexes.name,   
 page_count,
 (page_count*8.0/1024)AS 'IndexSizeMB',
 avg_page_space_used_in_percent,
 avg_fragmentation_in_percent,
 record_count,avg_record_size_in_bytes,
index_type_desc,
fragment_count 
from sys.dm_db_index_physical_stats(db_id('dbname'),object_id('tablename'), null,null,'sampled') 
 JOIN sys.indexes  ON   sys.indexes.index_id = sys.dm_db_index_physical_stats.index_id
 AND sys.indexes.object_id = sys.dm_db_index_physical_stats.object_id order by IndexSizeMB desc 

# 查看索引碎片率高于90%的表和索引情况
 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('Yourschema'), 
OBJECT_ID(''),NULL,NULL,'Sampled')  
WHERE avg_fragmentation_in_percent>90  order by avg_fragmentation_in_percent desc 

# 查看具体表的索引碎片情况
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('Yourschema'), 
OBJECT_ID(''),NULL,NULL,'Sampled')  
WHERE object_name(object_id) = 'tmjsdata'

比较简单的重建索引的办法

Oracle重新获取统计信息
exec dbms_stats.gather_schema_stats(ownname =>'username',options => 'GATHER',estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size repeat', degree => 4)

Oracle 还可以这样:
select 'alter index '||index_name|| ' rebuild;' from user_indexes

----------------------------------------------------------------

SQLSERVER重新新建所有表的索引.
EXEC SP_MSFOREACHTABLE 'dbcc DBreindex("?")'

SQLSERVER重新新建所有表的索引.
EXEC SP_UPDATESTATS;

对单表进行索引重建

 ALTER INDEX ALL  ON Yourschema.xxxx  REBUILD  
 WITH(FILLFACTOR=80, SORT_IN_TEMPDB=ON ,STATISTICS_NORECOMPUTE = ON )

 使用SQL实现对所有表的索引重建
 select 'ALTER INDEX ALL  ON Yourschema.' + name +  ' REBUILD' from sys.objects where schema_id = 5 AND type = 'U'

注意,需要先将自己的架构对应的id获取到.

关于性能的思考

前几天学习了 Oracle 高低水位线对性能的影响
今天在查看SQLServer的资料时感觉两者其实是相似的

大量的插入,删除表中的记录对数据库表性能会造成很大的影响
会对OLTP或者是OLAP产生很大的性能压力
并且会造成较多的磁盘随机读写的损耗, 导致性能下降.

但是Oracle的expdp/exp的备份 可以选择不导出统计信息,导入之后由系统任务自动进行统计信息的获取与更新

但是今天进行了SQLServer数据库的备份恢复验证, 发现SQLSERVER的备份恢复并不会导致数据库的索引碎片下降. 
所以这一块SQLServer 必须等在一定的停机窗口进行相关的处理. 

关于重建索引的性能

在应用不停,并且产品有计划任务的情况, 对一个四百万记录的单表执行索引重建. 

表一共四个索引, 涉及五个列, 但是耗费了 六个小时都没有成功.
我终止了服务, 重启了数据库后执行全局的 索引重建
耗时 20分钟就处理完成 
重建了大约 1.3万个索引信息. 

所以重建索引时建议是在停机窗口, 避免有对表的增删改查时进行表索引的重建.
不然会导致非常严重的卡顿, 对业务对产品都非常不好. 

另外 重建索引之前数据文件100G, 能够所以到 90G左右, 重建了所有的索引, 数据库表可以收缩到50G左右
磁盘空间也得到了巨大的释放. 

一个简单的总结

1. 重建索引的成本其实很高, 但并不是不可接受. 
2. 重建索引建议在停机维护的阶段进行, 并且要关闭对表的增删改长的大量处理, 便于提高效率.
3. 对插入删除大量的表建议使用分区表的模式进行, 并且设置好分区模式. 这样可以减少分区碎片对产品性能的性能. 
4. 感觉数据库出现阻塞时比较难以根除. 理论上应该采用逻辑删除而不是物理删除, 并且定期清理归档历史数据的方式为最优. 
5. Oracle可以通过备份恢复对数据库表的相对位置进行更改, 但是SQLSERVER的备份恢复模式没有此类的效果(但是速度快)
6. 重要的数据库必须有专业的数据库专家进行定期的指标收集与分析. 避免小问题累积成大问题导致宕机卡顿等. 

标签:count,index,SQLServer,之二,sys,索引,avg,优化,id
From: https://www.cnblogs.com/jinanxiaolaohu/p/17871953.html

相关文章

  • [VBA] 实现SQLserver数据库的增删改查
    [VBA]实现SQLserver数据库的增删改查问题背景用于库存管理的简单Excel系统实现,能够让库管员录入每日出入库信息并进能够按日期查询导出数据,生成简要报表,以及数据修改与删除。非科班且对VB语言和数据库语言未系统学习,有一点C语言与Python基础,有不足之处还请指教。实现过程数......
  • 300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦
    随着数字化进程的加快,全球数据量呈指数级增长,对数据库系统的性能提出了巨大的挑战。优化器作为数据库管理系统中的关键技术,对数据库性能和效率具有重要影响,它通过对用户的查询请求进行解析和优化来生成高效的执行计划,进而快速返回查询结果。然而,同一条SQL语句在不同的优化决策下......
  • 使用Navicat For MSSQL连接绿色版SQLServer2008R2问题解决
    问题1、创建连接时出现错误:[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0)Navicat来连接SQLserver,这里确实有点麻烦,出现错误[IM002][Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序(0),解决方法:进入Navicat的安装......
  • 「拓数派(OpenPie)2022发布会实录 」PieCloudDB Database优化器
    10月24日程序员节,拓数派(Openpie)发布了云原生数据库PieCloudDB。PieCloudDB以云计算架构为设计基础,实现云上存算分离,打造了“元数据-计算-存储”分离三层架构。在计算层,PieCloudDB设计了高效的查询优化器和执行器,实现了预计算、聚集下推等多种查询优化策略,保证查询的高效运行,减......
  • TiDB 在京东云丨TiDB SQL 优化最佳实践
    本文作者:赵玉龙京东云与PingCAP深度合作,联合推出了一款云上分布式数据库产品,向京东云用户提供云上的TiDB服务。它可以同时支持OLTP和OLAP混合负载场景,实现了自动水平伸缩,强一致性的分布式事务,部署简单,在线异步变更表结构不影响业务。由于TiDB兼容MySQL5.7协议、MySQL......
  • 袋鼠云产品功能更新报告08期|近百项全新功能和优化,你要的都在这里!
    欢迎来到袋鼠云08期产品功能更新报告!在瞬息万变的市场环境中,我们深知客户的需求与期待,因此,我们及时推出袋鼠云最新产品更新及优化,包括数据治理中心、HiveSQL性能优化、新插件等,助力企业在数字世界中勇往直前。以下为袋鼠云产品功能更新报告08期内容,更多探索,请继续阅读。离线开发......
  • 线段树优化建图
    问题:CF786B给定一个\(n\)个点,\(m\)次连边的有向图,有三种连边(均有边权)方式:1.\(u\tov\),一条\(u\)指向\(v\)的连边。2.\(u\to[l,r]\),\(u\)向在区间\([l,r]\)的点分别连一条边。3.\([l,r]\tov\),在区间\([l,r]\)的点向\(v\)分别连一条边。问从\(1\)点出发,到各个点的最短路。......
  • # yyds干货盘点 # input()这个有没有什么优化的办法可以记住前面的数据?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python数据输入的问题,一起来看看吧。问题描述:大佬们 在咨询一个问题 就是这个input 涉及多个 然后可能敲到最后一个数据敲错了又得重新敲一遍这个有没有什么优化的办法可以记住前面的数......
  • vue3+vite项目优化静态资源使用云存储
    项目中的问题1.当我们在维护自己的博客或者自己的网站的时候没有特别好的服务器就会响应特别的慢2.当我们项目特别大的时候也会首屏加载特别慢而且vue项目打包后的js文件特别的庞大还要加载各种资源就会特别的卡顿3.当我们项目中用到了一些3D效果各种3D资源部特别的大的时......
  • 案例解析关于ArkUI框架中ForEach的潜在陷阱与性能优化
    本文分享自华为云社区《深入解析ForEach的潜在陷阱与性能优化:错误用法与性能下降的案例分析》,作者:柠檬味拥抱。在ArkUI框架中,ForEach接口是基于数组类型数据进行循环渲染的强大工具。它需要与容器组件搭配使用,并能够根据数据源动态生成相应的子组件。以下是对ForEach接口的详细......