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' 重建所有的统计信息
select 'update statistics GSCLOUDMSS.' + name + ' with fullscan' 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. 重要的数据库必须有专业的数据库专家进行定期的指标收集与分析. 避免小问题累积成大问题导致宕机卡顿等.

SQLServer性能优化之二的更多相关文章

  1. 02.SQLServer性能优化之---牛逼的OSQL----大数据导入

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 上一篇:01.SQLServer性能优化之----强大的文件组----分盘存储 http ...

  2. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  3. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  4. SQLServer性能优化专题

    SQLServer性能优化专题 01.SQLServer性能优化之----强大的文件组----分盘存储(水平分库) http://www.cnblogs.com/dunitian/p/5276431. ...

  5. SQLServer性能优化之---数据库级日记监控

    上节回顾:https://www.cnblogs.com/dotnetcrazy/p/11029323.html 4.6.6.SQLServer监控 脚本示意:https://github.com/l ...

  6. js-jQuery性能优化(二)

    5.数组方式使用jQuery对象 使用jQuery选择器获取结果是一个jQuery对象.然而,jQuery类库会让你感觉正在使用一个定义了索引和长度的数组.在性能方面,建议使用简单的for或者whil ...

  7. 详解MySQL性能优化(二)

    http://www.jb51.net/article/70530.htm 七.MySQL数据库Schema设计的性能优化高效的模型设计 适度冗余-让Query尽两减少Join 大字段垂直分拆-sum ...

  8. 浅谈前端性能优化(二)——对HTTP传输进行压缩

    1.前端性能优化的一点: 对js.css.图片等进行压缩,尽可能减小文件的大小,减少文件下载的时间,从而减少网页响应的时间. 2.前端性能优化的另一点: 对HTTP传输进行压缩,即在js,css.图片 ...

  9. 云时代架构阅读笔记二——Java性能优化(二)

    承接上文Java性能优化(一)https://www.cnblogs.com/guo-xu/p/11019267.html 4)尽量确定StringBuffer的容量 在说和这个标题相关之前,先说一下 ...

  10. 高并发&性能优化(二)------系统监控工具使用

    上一篇主要从总体介绍了高并发&性能优化的相关思路和方法,本篇主要介绍系统监控工具. [CPU查看工具] ------top命令(性能) 进入top命令后,按1即可看到每核CPU的运行指标与详细 ...

随机推荐

  1. Ef Core花里胡哨系列(10) 动态起来的 DbContext

    Ef Core花里胡哨系列(10) 动态起来的 DbContext 我们知道,DbContext有两种托管方式,一种是AddDbContext和AddDbContextFactory,但是呢他们各有优 ...

  2. Python——第五章:logging模块

    logging 模块是 Python 中用于记录日志的官方模块.通过 logging 模块,你可以配置和管理日志的生成.处理和存储. logging.basicConfig()用法 filename: ...

  3. CTFHub XSS DOM反射 WriteUp

    前言:本文需要注册一个xss平台,以接收xss反弹回来的数据,请自己在互联网上寻找合适的xss平台 1. 构造闭合语句 根据题目提示,判断网站存在DOM xss漏洞 查看页面源代码,发现关键位置,其中 ...

  4. UDP与KCP详解

    UDP 以及TCP是什么.我们知道传输层中有TCP和UDP两种网络协议,这节就讲UDP是什么. Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagr ...

  5. 2023-08-28:用go语言编写。给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries。 第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。

    2023-08-28:用go语言编写.给你一个正整数数组nums, 同时给你一个长度为 m 的整数数组 queries. 第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] . ...

  6. 新一代云原生可观测平台之CCE服务监控篇

    本文分享自华为云社区<新一代云原生可观测平台之CCE服务监控篇>,作者: 云容器大未来. 在云原生容器化浪潮的当下,监控是确保业务稳定性最受关注的问题之一.那么,华为云CCE容器服务又是如 ...

  7. 从标准到开发,解读基于MOF的应用模型管理

    摘要:为了打破技术与业务的壁垒,搭建技术与业务的桥梁,因此基于如下流程实现应用业务模型管理 ROMA ABM. 在数字经济时代,数据正在成为企业极其重要的战略性资产.在政府方面,数据第一次作为新型生产 ...

  8. 云图说|数据仓库服务 GaussDB(DWS) 的“千里眼、顺风耳”—数据库智能运维

    摘要:数据库智能运维(DMS)是GaussDB(DWS) 为客户数据库快速.稳定运行提供保驾护航的能力,对业务数据库所使用磁盘.网络.OS指标数据,集群运行关键性能指标进行收集.监控.分析.通过综合收 ...

  9. 【“互联网+”大赛华为云赛道】API命题攻略:厘清三步解题思路,用好开发工具

    摘要:结合华为云API开放平台API Exploer实现照片分类系统. API能为我们带来什么? 有了 API,可以创建管理云服务器.云容器.云硬盘,提高工作效率:可以接入图像识别.情感分析.内容审核 ...

  10. GaussDB(for Influx)与开源企业版性能对比

    摘要:相比于企业版InfluxDB,GaussDB(for Influx)能为客户提供更高的写入能力.更稳定的查询能力.更高的数据压缩率,高效满足各大时序应用场景需求. 本文分享自华为云社区<华 ...