SQLServer数据库优化学习-总结


背景

各种能力都需要提升.
最近总是遇到SQLServer的问题
趁着周末进行一下学习与提高.

安装与优化

1. 数据库必须安装 64位, 不要安装成32位的版本
2. 数据库的序列号要使用enterprise core 的版本, 不要使用enterprise 的版本, 仅可能使用20个CPU核心.
3. tempdb,要放到性能比较好的硬盘上面,不要将所有的数据库数据文件放到一块硬盘上面. 分散放置,提高性能.
4. 限制SQLServer的内存用量. 专用服务器至少留给服务器10%以上的内存用于系统开销,非专用服务器建议综合考量.
5. 不同业务的数据库实例安装到同一数据库时建议将数据文件分散到不同的磁盘, 避免互相影响.
6. 关闭不必要的软件,尤其是浏览器,不分低效杀毒软件,直播/带广告功能的软件, 避免这些垃圾应用内存泄漏后者是抢占带宽影响性能.

实例级别的优化

1. 修改数据库实例的数据文件增幅, 数据文件默认增幅是1MB次,如果数据库较大,建议至少设置为100MB每次,避免数据库数据量增加较多申请次数.
2. 确认恢复模式, 如果是完整的话 注意磁盘空间的使用. 如果是simple,注意数据库的定时备份与恢复.
3. 确认数据库数据文件的大小与表的数量,表的大小, 如果有表数据量的巨大增幅,需要实时注意, 避免临时表数据量激增.
4. 注意数据库内存和CPU的使用情况, 通过perfmon或者是任务管理器查看服务器的IO资源使用情况, 如果出现瓶颈及时优化.
5. 数据库隔离级别的选用. SQLServer数据库默认是 read_committed隔离级别, 但是读时会添加共享锁. 建议使用 read committed snapshot的方式进行.
如果设置选项READ_COMMITTED_SNAPSHOT为OFF,那么事务在执行读操作时申请共享锁,阻塞其他事务的写操作;
如果设置选项READ_COMMITTED_SNAPSHOT为ON,那么事务在执行读操作时使用Row Versioning,不会申请共享锁,不会阻塞其他事务的写操作;
ALTER DATABASE DATABASE_NAME SET READ_COMMITTED_SNAPSHOT ON;
可以通过 use dataname ; DBCC Useroptions 的方式查看隔离级别.

表与索引级别

1. 要注意核心业务表的大小, 如果表很大,还经常进行大量的插入与删除时尤其需要注意.
2. 注意索引的碎片情况与索引是否有效. 如果缺少特定的索引性能下降会非常严重.
3. 注意数据库的阻塞情况. 如果经常出现阻塞则问题可能会比较严重
4. 适当增加并行度.如果存在大量的大表查询.
5. 定期通过计划任务执行如下处理. 与之前文章一样, 拿过来只要是为了好查询.
6. 可能需要根据数据库表的读写情况设置不一样的 填充因子.
当读写比例大于100:1时,不要设置填充因子,100%填充
当写的次数大于读的次数时,设置50%-70%填充
当读写比例位于两者之间时80%-90%填充 处理方式:
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获取到. 另外博客园某博主对数据库聚集索引和非聚集索引的说法: 非聚集索引和聚集索引不一样,
聚集索引索引页的键值指向数据页的具体行;
而非聚集索引不存在数据页,
非聚集索引的索引页中的记录行指向聚集索引或者堆的具体数据页的数据行然后来获取记录,
如果堆或聚集索引还存在溢出的话,从堆或者聚集索引的数据记录还有指向溢出页面的指针。 在非聚集索引中存在聚集索引与堆的优点,看完上文你会发现非聚集索引的数据页记录的行定位指针分别指向聚集索引或堆的行,
但是指向聚集索引的行定位是逻辑值而指向堆的是实际的rid值,逻辑值的好处就是在聚集索引发生分页的情况下,
逻辑值不用改变也就无需更新非聚集索引的指针。 另外关于索引时重建还是重组有如下的说法 REBUILD 操作会重新构建整个索引。它会创建一个全新的索引,删除旧索引,然后将数据从旧索引移到新索引中。
这个过程可以彻底去除碎片并提高索引的性能,因为索引是全新的。
REBUILD 操作通常需要更多的系统资源,包括磁盘空间和处理器时间。
这是一个更重型的操作,适用于大型碎片化严重的索引或需要完全重建的情况。 REORGANIZE 操作会重组索引,尽量减少碎片,而不需要创建全新的索引。
它不会释放多余的磁盘空间,但可以改善索引的性能,尤其是在碎片较小的情况下。
REORGANIZE 操作通常需要较少的系统资源,因为它不涉及创建新索引。
这是一个轻型的操作,适用于较小碎片化或需要更少系统资源的情况。
来源: https://blog.csdn.net/u012190606/article/details/134308148 金蝶官方有一个SQLServer数据库的定时更新索引和统计信息的介绍网站:
SQL Server数据库有时由于长期未做索引重建,导致SQL执行效率下降,
当表的索引碎片率高于30%时,建议重建索引,以提升索引执行效率。
统计信息更新,是为了优化SQL执行计划,避免统计信息过旧导致执行计划不是最优。
根据数据库的大小进行评估,可以定期执行,比如一个月做一次。 来源:金蝶云社区
原文链接:https://vip.kingdee.com/article/183932?productLineId=8

部分SQL信息

1. 查看没有主键的表以及所有表的大小
SELECT
OBJECT_NAME ( object_id ) AS TableName,
SUM( reserved_page_count * 8 ) AS ReservedKB,
SUM( used_page_count * 8 ) AS UsedKB,
SUM( ROW_COUNT * 8 ) AS RowKB
FROM
sys.dm_db_partition_stats
WHERE
OBJECT_NAME ( object_id ) IN ( SELECT NAME FROM sys.TABLES EXCEPT SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' )
GROUP BY
OBJECT_NAME ( object_id )
ORDER BY
UsedKB DESC # 注意业务数据库一定要有主键, 没有主键数据同步会存在问题. 建议处理.

2. 查看没有索引的表情况
SELECT
( SELECT si.rows FROM sysindexes si WHERE si.id = so.id AND indid = 0 ) rows,
so.NAME
FROM
sysobjects so
WHERE
so.xtype = 'U'
AND OBJECTPROPERTY ( so.id, 'TableHasIndex' ) = 0
ORDER BY
1 DESC # 注意如果业务表很大并且没有索引就是一场灾难

3. 索引碎片情况查看
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

4. 查看索引与数据的占比
DECLARE @T TABLE
(
[name] VARCHAR(max),
[rows] INT,
reserved VARCHAR(max),
data_size VARCHAR(max),
index_size VARCHAR(max),
unused VARCHAR(max)
) --将表占用情况存放到表变量
INSERT INTO @T
EXEC sp_MSforeachtable "exec sp_spaceused '?'" SELECT [name],[rows],reserved,data_size,index_size,unused,
CAST(REPLACE(reserved,'KB','') AS INT)/1024 as reserved_MB,
CAST(REPLACE([data_size],'KB','') AS INT)/1024 as data_size_MB,
CAST(REPLACE([index_size],'KB','') AS INT)/1024 as index_size_MB,
CAST(REPLACE([index_size],'KB','') AS float)/CAST(REPLACE([data_size],'KB','') AS float) as 索引与数据的占比,
CAST(REPLACE([unused],'KB','') AS INT)/1024 as unused_MB
FROM @T
where CAST(REPLACE([data_size],'KB','') AS INT) >0
order by 索引与数据的占比 desc

关于一次索引优化的对比

表行数大约400万, 索引碎片率 99%甚至更高.
xx表 主键索引的碎片率: 99.2084982295355 查询时间验证
select count(1) from xxx. xx
35秒 ALTER INDEX ALL on xxx. xx REBUILD
24min完成 select count(1) from xxx. xx
1秒出结果
重启数据库后 3秒查询出结果 比重建索引之前提升了12倍。

SQLServer数据库优化学习-总结的更多相关文章

  1. 浅谈sqlserver数据库优化(一)----开光篇

    今天暂时无事,风和日丽,万里无云.游山的.玩水的.遛麻雀的都闲的不亦乐乎,也忙的不亦乐乎.在这美好的季节,依旧躲在被窝或是电脑旁绞尽脑汁敲键盘的人们,也别有一番滋味.废话少说,言归正传. 赶上了一个最 ...

  2. mysql数据库优化学习

    目的避免出现页面访问错误慢查询造成页面无法加载阻塞造成数据无法提交优化从sql及索引,数据库结构,系统配置,硬件 日志慢查询日志:   show variables like 'slow_query_ ...

  3. SqlServer数据库优化之添加主键和自增长

    今天需要给有500万条数据的表添加主键和自增长列,其中最大的难度在于如何UPDATE这500万多条数据,开始吧! 1.先给表添加一个字段叫ID,并允许空 2.查询表,我想到了使用其中的时间列排序来创建 ...

  4. SqlServer数据库优化之索引、临时表

    问题:工作是查询一张500万多条数据的表时,查询总是很慢,于是进行优化. --查询表所有索引 use RYTreasureDB EXEC Sp_helpindex [RecordDrawScore] ...

  5. SQLServer数据库优化常用语句

    -- 平均物理读次数最多的SQL语句:select top 50 *, (s.total_physical_reads / s.execution_count) as avephysicalreads ...

  6. 总结sqlserver数据库性能优化相关的注意事项

    一.分析阶段一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性.可用性.可靠性.安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能性需求,必须根据系统的特点 ...

  7. SQLSERVER数据库死锁与优化杂谈

    死锁杂谈 当数据库死锁时,SqlServer会释放一个优先级较低的锁,让另一个事务运行:所以,即时去捕捉数据库死锁,是挺不容易的. 如果,数据库死锁比较长时间,那么死锁是可以被捕捉的. 可以用SqlS ...

  8. python学习--python 连接SQLServer数据库(两种方法)

    1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...

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

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

  10. SqlServer 数据库引擎优化顾问优化数据库

    现在一直在做的项目,数据量相对也不小,开始的时候没有觉得,因为是刚开始,数据量还很小,在程序使用过程中速度还挺快,但是随着数据量的不停的增长,发现程序越来越慢,甚至出现了超时的问题,因此要对程序和数据 ...

随机推荐

  1. BUUCTF 加固题 Ezsql WriteUp

    文章目录 想直接要加固代码的点这里 题目 一.查看 二.进入目标机器加固 修改前的文件: 添加如下代码: 修改后的文件 三.Check 想直接要加固代码的点这里 题目 靶机地址解释: 第一行:目标机器 ...

  2. zabbix_agent配置文件

    agent常用参数 : [root@jqebsdb zabbix]# cat zabbix_agentd.conf  | grep -v ^$ | grep -v ^# PidFile=/var/ru ...

  3. 序列化性能测试:jdk和fastjson

    序列化性能测试:jdk和fastjson 我开发一个认证授权框架时,需要添加数据库存储token或者会话,于是想测试使用jdk的blob存储解析快还是存储string的json序列化解析快,从而选择他 ...

  4. 新一代通信协议 - Socket.D

    一.简介 Socket.D 是一种二进制字节流传输协议,位于 OSI 模型中的5~6层,底层可以依赖 TCP.UDP.KCP.WebSocket 等传输层协议.由 Noear 开发.支持异步流处理.其 ...

  5. vue模板的首次渲染,和重新渲染,有哪些区别?

    搞明白这个,能帮助我们理解开发中出现的很多问题. 一.我们先来回顾一下vue模板的渲染过程: (1)执行render函数,生成虚拟DOM. render函数是根据render.templete.el这 ...

  6. 华为云原生数据仓库GaussDB(DWS)深度技术解读:融、快、大、稳、易

    摘要:云原生数据仓库GaussDB(DWS)架构师应邀为大家解读数仓深度技术. "云原生"在2020年成为备受瞩目的热词,云原生在确保企业数字化转型中资源快速供给.按需使用的同时, ...

  7. 华为云GaussDB(for Influx)揭密第六期:数据分级存储

    摘要:GaussDB(for Influx)通过冷热数据存储分离,在提供海量数据高性能存储的同时可节省85%的存储成本,高效满足时序应用各种场景. 本文分享自华为云社区<华为云GaussDB(f ...

  8. 在springboot中,如何读取配置文件中的属性

    摘要:在比较大型的项目的开发中,比较经常修改的属性我们一般都是不会在代码里面写死的,而是将其定义在配置文件中,之后如果修改的话,我们可以直接去配置文件中修改,那么在springboot的项目中,我们应 ...

  9. head/reset/revert/rebase代码回滚全解:git提交记录的背后原理

    多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,操作有: 回退(reset):reset是彻底回退到指定的commit版本,该commit后 ...

  10. python中的代码运行时间获取方式

    python中的代码运行时间获取方式 ​ 我们知道为了提高代码的运行速度,我们需要对书写的python代码进行性能测试,而代码性能的高低的直接反馈就是电脑运行代码所需要的时间. 使用time模块对代码 ...