百万级sql server数据库优化案例分享

这篇具有很好参考价值的文章主要介绍了百万级sql server数据库优化案例分享。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在我们的IT职业生涯中,能有一次百万级的数据库的优化经历是很难得的,如果你遇到了恭喜你,你的职业生涯将会更加完美,如果你遇到并解决了,那么一定足够你炫耀很多年。

        这里我将要分享一次完美的百万级数据库优化经历,希望能给在IT行业的小伙伴一点启发和帮助。本篇分三步走:1、遇到问题;2、分析问题;3、解决问题;

1、遇到问题

        我负责一个web项目,数据主表差不多500w的历史数据,最近老是听运营部门反馈系统卡顿,甚至发生过站点宕机的情况。

        这里省略一万字,经历了各种排查,最终定性为db性能问题,进入下一步。

2、分析问题

        面对上面的问题,经过了各种常规慢查询、sql跟踪查询分析、连接数查询,始终无法解决问题,后来通过各种渠道的打听,得到了以下解决方法。

        第一步,获取数据库表阻塞sql信息:

select * from (
		 SELECT   spid,
		 blocked,
		 DB_NAME(sp.dbid) AS DBName,
		 program_name,
		 waitresource,
		 lastwaittype,
		 sp.loginame,
		 sp.hostname,
		 a.[Text] AS [TextData],
		 SUBSTRING(A.text, sp.stmt_start / 2,
		 (CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end
		 END - sp.stmt_start) / 2) AS [current_cmd]
		 FROM     sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
) a join (select blocked as blocked2
			from (select * from sys.sysprocesses where blocked>0 ) a
			where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b
where a.blocked=spid)) b on a.blocked=b.blocked2

        第二步,获取当前执行所有sql信息:

SELECT  SPID = er.session_id,Status = ses.status,[Login] = ses.login_name,Host = ses.host_name,BlkBy = er.blocking_session_id,
        DBName = DB_Name(er.database_id),CommandType = er.command,SQLStatement = st.text,ObjectName = OBJECT_NAME(st.objectid),
        ElapsedMS = er.total_elapsed_time,CPUTime = er.cpu_time,IOReads = er.logical_reads + er.reads,IOWrites = er.writes,
        LastWaitType = er.last_wait_type,StartTime = er.start_time,Protocol = con.net_transport,ConnectionWrites = con.num_writes,
        ConnectionReads = con.num_reads,ClientAddress = con.client_net_address,Authentication = con.auth_scheme  
        FROM sys.dm_exec_requests er  OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st  
                                      LEFT JOIN sys.dm_exec_sessions ses  ON ses.session_id = er.session_id  
                                      LEFT JOIN sys.dm_exec_connections con  ON con.session_id = ses.session_id  
        WHERE er.session_id > 50  ORDER BY  er.blocking_session_id DESC,er.session_id

      第三步,添加自动监控程序,每隔10s查询需要监控的数据库信息,然后把表阻塞和所有执行sql情况进行入库分析。

private void Process()
        {
            //获取itom监控数据
            string strBlock = @"select * from (
                                 SELECT   spid,
                                 blocked,
                                 DB_NAME(sp.dbid) AS DBName,
                                 program_name,
                                 waitresource,
                                 lastwaittype,
                                 sp.loginame,
                                 sp.hostname,
                                 a.[Text] AS [TextData],
                                 SUBSTRING(A.text, sp.stmt_start / 2,
                                 (CASE WHEN sp.stmt_end = -1 THEN DATALENGTH(A.text) ELSE sp.stmt_end
                                 END - sp.stmt_start) / 2) AS [current_cmd]
                                 FROM     sys.sysprocesses AS sp OUTER APPLY sys.dm_exec_sql_text (sp.sql_handle) AS A
                        ) a join (select blocked as blocked2
			                        from (select * from sys.sysprocesses where blocked>0 ) a
			                        where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b
                        where a.blocked=spid)) b on a.blocked=b.blocked2";
            string strBlockInfo = @"SELECT  SPID = er.session_id,Status = ses.status,[Login] = ses.login_name,Host = ses.host_name,BlkBy = er.blocking_session_id,
                                    DBName = DB_Name(er.database_id),CommandType = er.command,SQLStatement = st.text,ObjectName = OBJECT_NAME(st.objectid),
                                    ElapsedMS = er.total_elapsed_time,CPUTime = er.cpu_time,IOReads = er.logical_reads + er.reads,IOWrites = er.writes,
                                    LastWaitType = er.last_wait_type,StartTime = er.start_time,Protocol = con.net_transport,ConnectionWrites = con.num_writes,
                                    ConnectionReads = con.num_reads,ClientAddress = con.client_net_address,Authentication = con.auth_scheme  
                                    FROM sys.dm_exec_requests er  OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st  
                                                                  LEFT JOIN sys.dm_exec_sessions ses  ON ses.session_id = er.session_id  
                                                                  LEFT JOIN sys.dm_exec_connections con  ON con.session_id = ses.session_id  
                                    WHERE er.session_id > 50  ORDER BY  er.blocking_session_id DESC,er.session_id";
            DataTable dtBlock = SqlHelper.ExecuteDataTable(connectionTTItom, CommandType.Text, strBlock);
            DataTable dtSqlInfo = SqlHelper.ExecuteDataTable(connectionTTItom, CommandType.Text, strBlockInfo);

            //数据入库
            if (dtBlock != null && dtBlock.Rows.Count > 0)
            {
                foreach (DataRow dr in dtBlock.Rows)
                {
                    try
                    {
                        Insert_BlockedInfo(dr, "itom");
                    }
                    catch (Exception ex)
                    {
                        _logger.Info("Insert_BlockedInfo方法异常,"+ex.ToString());
                    }
                    
                }
            }

            if (dtSqlInfo != null && dtSqlInfo.Rows.Count > 0)
            {
                foreach (DataRow dr in dtSqlInfo.Rows)
                {
                    try
                    {
                        Insert_SqlInfo(dr, "itom");
                    }
                    catch (Exception ex)
                    {
                        _logger.Info("Insert_SqlInfo方法异常," + ex.ToString());
                    }
                    
                }
            }
        }

3、解决问题

        有了以上的准备工作,有了所有的db执行情况数据,我们就很容易对db进行分析了。当业务反馈访问异常的时候,我们只需要打开监控数据,根据监控时间范围就能很容易得看到导致表阻塞的语句。

select top 200 * from dbo.Monitor_BlockedInfo where createtime>'xxxx' and createtime<'xxxx' order by id desc 

        除了查看当前阻塞语句,我们还可以根据当前时间点的并行sql数量来监控数据库高负载时间段,具体情况如下:

-- 先检查时间段内sql堆积数量
select convert(char(19),createtime,120),COUNT(1)
from dbo.Monitor_SqlInfo 
where createtime>'2023-07-17 08:00:00' --and createtime<'2023-06-21 08:59:00'
group by convert(char(19),createtime,120)
order by COUNT(1) desc

百万级sql server数据库优化案例分享,数据库,大数据,sql 

         最后,我们根据高负载时间点,查询当前时间点的所有sql执行情况,有了上面的数据,db的运行情况就被拿捏的稳稳的了。文章来源地址https://www.toymoban.com/news/detail-583569.html

到了这里,关于百万级sql server数据库优化案例分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server数据库使用SQL Server代理实现数据库自动备份

    在现实中,为了保证数据的安全和完整,防止人为错误和硬件故障等造成的数据丢失和损坏,就需要用到数据库的备份,不同的数据库方法有所差别,我这边主讲SQL Server数据库的备份和使用SQL Server代理作业实现数据库的定时备份。 目录 一、开启SQL Server代理 1、找到SQL Serv

    2024年02月09日
    浏览(82)
  • SQL Server数据库——创建数据库

    目录 一、界面方式创建数据库 1.1创建数据库xscj,数据文件和日志文件的属性按默认值设置  1.2在xscj数据库中增加文件xcsj1,其属性均取系统默认值  1.3在数据库xscj中增加一个名为myGroup的文件组。 1.4数据库的重命名  1.5数据库的删除  二、命令方式创建数据库 以创建学生管

    2024年02月01日
    浏览(67)
  • SQL Server 数据库安装教程SQL Server 2017

    官网: SQL Server 下载 | Microsoft  软件版本看你自己需求啦,反正我是下了SQL Server 2017 评估版(试用180天,秘钥自己百度)  下载后,软件有点小,不是实际的安装包,只是安装导向包,在安装过程才下载实际的安装包:      要保持有网络,直接双击安装,选基本即可:  选好

    2024年02月05日
    浏览(92)
  • sql server数据库跟踪——SQL Server Profiler解析

    工具 : SQL Server Profiler这个工具是SQL Server数据库自带的语句执行跟踪工具,常使用于分析软件修改数据库时所执行的语句,适合用来研究软件运行数据库的原理。 打开方式: 本机安装了SQL server的话,都是自带的。直接去直接在【开始】-【程序】-搜索Profiler可找到【SQL Ser

    2024年04月16日
    浏览(139)
  • SQL Server2008数据库升级至SQL Server2012

    今天接到了一个需求,服务器上的数据库需要从SQL Server2008升级到2012。根据之前的经验,感觉是一个非常有意思的过程(事实上也是。这个过程也给了我一些触动与启发,因此,便记录了自己的踩坑过程以及解决方案,还有安装过程的体会。 启动SQL Server2012的安装引导程序,

    2024年02月05日
    浏览(89)
  • SQL Server数据库使用

    SQL Server 2008 R2的安装和使用 安装前的准备 安装过程 1)安装所选功能 2)安装的类型:默认或命名实例 3)服务账户 4)身份验证模式 5)排序规则设置 6)开始安装 7)完成安装 验证数据库安装成功 【开始】|【程序】中可以看到Microsoft SQL Server 2008的程序组 启动和停止数据库

    2024年02月11日
    浏览(77)
  • SQL Server数据库管理

    数据库登录——使用两种方式均可登录数据库:windows和sqlserver身份验证方式两种。  数据库的使用和管理 步骤一:创建数据库 1)新建数据库,数据库名为book,初始大小都配置为3,自动增长与路径都为默认,点击确定   步骤二:查看主数据与日志文件(查看C:Program Files

    2024年02月13日
    浏览(69)
  • Sql server数据库安装

    以sql server2014数据库为例 sql server数据库安装需要注意两点: 1.不使用从镜像中拷贝出的压缩包安装会报错,提示缺少trin_aide.cab和vs_shell.cab文件 2.sql server2014数据库安装前需要安装.net Framework 3.5 各个版本sql server数据库情况: 1.sql server2008 R2数据库提示需要.net Framework 3.5。但不

    2024年02月09日
    浏览(60)
  • SQL数据库案例1——创建商店数据库

    创建商店数据库Commodities_Management 创建商品表、供应商表、进货表、销售表 各表分别输入数据 库名:Commodities_Management 字符集:utf16 表一:商品表 字段名 类型 长度 约束 商品编号 varchar 10 外键(参照进货表) 商品名 varchar 30 — 规格 varchar 20 — 供应商编号 varchar 10 非空 表二:

    2024年02月12日
    浏览(48)
  • 《数据库系统概论》SQL Server 数据库导出、导入教程

    在SQL Server的使用过程中,大家难免遇到数据库表的导出、导入,从而实现用其它电脑打开数据库。 如果是使用学校实验室(机房)电脑做实验的同学,一定要掌握本技能!!! 1、右键点击数据库,“任务”,“生成脚本”,如下图 2、选择对象操作如图,“选择具体的数据

    2024年02月10日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包