一:背景 1.讲故事 前些天有位朋友找到我,说他们的程序有内存泄露,跟着我的错题集也没找出是什么原因,刚好手头上有一个7G+的dump,让我帮忙看下是怎么回事,既然找到我了那就给他看看吧,不过他的微信头像有点像二道贩子,不管到我这里是不是三道,该分析的还得要分析呀。😄😄😄 二:WinDbg分析 1.到底是哪里的泄露 这个非常简单,对用户态内存段做一个分组处理就明白了,可以用windbg的!address-summary观察便知。 0:000>!address-summary --UsageSummary---------------RgnCount----------TotalS...

  eN9dsiqvgeuP   2023年11月01日   35   0   0 .NET

一:背景 1.讲故事 今天本来想写一篇非托管泄露的生产事故分析,但想着昨天就上了一篇非托管文章,连着写也没什么意思,换个口味吧,刚好前些天有位朋友也找到我,说他们的拍摄监控软件卡死了,让我帮忙分析下为什么会卡死,听到这种软件,让我不禁想起了前些天在程序员桌子上安装监控的新闻,参考如下: 我在想我这不是尼玛作恶吗...😂😂😂和朋友确认了下还好不是干这个事的。 二:WinDbg分析 1.为什么会卡死 因为这种监控软件是窗体程序,所以它的卡死理应看主线程的调用栈即可,在windbg中有一个k命令。 0:000:x86>kb8 ChildEBPRetAddrArgstoChild 00...

  eN9dsiqvgeuP   2023年11月01日   32   0   0 .NET

一:背景 1.讲故事 最近给一位朋友做SQL慢语句优化,花了些时间调优,遗憾的是SQLSERVER非源码公开,玩起来不是那么顺利,不过从这次经历中我觉得明年的一个重大任务就是好好研究一下它,争取在SQLSERVER性能优化上做一些成绩,哈哈!个人觉得要想深入研究SQLSERVER,得从它的存储引擎说起,说到存储引擎又得从核心的数据页说起,毕竟mdf就是由数据页拼出来的,当然理解的不对大家可以指出来。 二:理解数据页 1.什么是数据页 一般来说,对大块资源或者数据进行高效管理都会按照一定粒度来划分的,比如说Windows对内存的管理就是按照内存页(4k)来进行划分,言外之意就是SQLSERVER...

  eN9dsiqvgeuP   2023年11月01日   47   0   0 SQL Server

一:背景 1.讲故事 相信有很多朋友在学习SQLSERVER的时候都听说过这句话,但大多都是记忆为主,最近在研究SQLSERVER,所以我们从底层存储的角度来深入理解下。 二:理解数据页 1.数据页的组织 在前面的文章中我也说过,一个数据页是8k大小,那这8k是如何组织的呢?为了更好的表述,我先来画一张图,大概像下面这样。 从图中可以看到,一个数据页大概分为三部分: 页头 这一块相当于数据页的元数据区,标记着这个数据页类型和各种统计信息。 数据存储区 这里存放的就是表的每条记录以及记录的相关元数据,这个元数据统计着诸如定长,变长字段个数,记录类型等等。 记录槽位列表 slot槽位...

  eN9dsiqvgeuP   2023年11月01日   68   0   0 SQL Server

一:背景 1.讲故事 上一篇写完了之后,马上就有朋友留言对记录行的8060byte限制的疑惑,因为他的表记录存储了大量的文章,存储文章的字段类型用的是nvarchar(max),长度很显然是超过8060byte的,请问这个底层是怎么破掉8060byte的限制的? 说实话这是一个好问题,本质上来说8060byte的限制肯定是不能破掉的,如果让我处理的话肯定是将文章的数据分摊在多个数据页上,那是不是如我所想呢?我们观察一下就好。 二:观察大字段数据的布局 1.对nvarchar(max)的理解 玩过sqlserver的朋友都知道,新一代的sqlserver版本已经用varchar(max)和nva...

  eN9dsiqvgeuP   2023年11月01日   42   0   0 SQL Server

一:背景 1.讲故事 前些天看到一个奇怪的Function函数,调用的是C链接库中的一个UserLogin方法,参考代码如下: CREATEFUNCTIONdbo.clr_UserLogin ( @name ASNVARCHAR(100), @passwordASNVARCHAR(100) ) RETURNSINT AS EXTERNALNAMEasmXXX.[xxx.CLRFunctions].UserLogin; GO 这就让我产生了很大的兴趣,众所周知SQLSERVER是C写的,那这里的C怎么和C打通呢?而且C是一门托管语言,需要JIT将其native化,这个JIT又在哪里呢?带着...

  eN9dsiqvgeuP   2023年11月01日   74   0   0 SQL Server

一:背景 1.讲故事 最近在看SQLSERVER2008查询性能优化,书中说当一个表创建了聚集索引,那么表中的行会按照主键索引的顺序物理排列,这里有一个关键词叫:物理排列,如果不了解底层原理,真的会被忽悠过去,其实仔细想一想不可能实现严格的物理排列,那对性能是非常大的损害,本篇我们就从底层出发聊一聊到底是怎么回事。 二:原理探究 1.我认为的物理排列 如果用C代码来演示严格的物理排列,大概是这样的。 staticvoidMain(string[]args) { List<int>list=newList<int>(){1,2,4,5}; list.Insert(2,...

  eN9dsiqvgeuP   2023年11月01日   89   0   0 SQL Server

一:背景 1.讲故事 在SQLSERVER中有非常多的索引,比如:聚集索引,非聚集索引,唯一索引,复合索引,Include索引,交叉索引,连接索引,奇葩索引等等,当索引多了之后很容易傻傻的分不清,比如:复合索引和Include索引,但又在真实场景中用的特别多,本篇我们就从底层数据页层面厘清一下。 二:到底有什么区别 1.这些索引解决了什么问题 说区别之前,一定要知道它们大概解决了什么问题?这里我就从索引覆盖角度来展开吧,为了方便讲述,先上一个测试sql: IF(OBJECT_ID('t')ISNOTNULL)DROPTABLEt; CREATETABLEt(aINTIDENTITY,bCH...

  eN9dsiqvgeuP   2023年11月01日   312   0   0 SQL Server

一:背景 1.讲故事 大家都知道数据库应用程序它天生需要围绕着数据文件打转,诸如包含数据的.mdf,事务日志的.ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能理解一半了,关于.mdf的合成前面的文章已经有所介绍,这篇我们来聊一下.ldf的一些内部知识,比如LSN。 二:对LSN的理解 1.什么是LSN 如果大家玩过SQLSERVER的发布订阅或者AlwaysOn或多或少都见过LSN,比如下面的格式:00000030:00018090:0002,这一串编号到底是什么意思呢?本质上指示的是.ldf文件的某一个物理位置上的偏移,画个图大概如下: 从图中可以看到其实是由虚拟文件号:...

  eN9dsiqvgeuP   2023年11月01日   243   0   0 SQL Server

一:背景 1.讲故事 相信绝大部分用SQLSERVER作为底层存储的程序员都知道nolock关键词,即使当时不知道也会在踩过若干阻塞坑之后果断的加上nolock,但这玩意有什么注意事项呢?这就需要了解它的底层原理了。 二:nolock的原理 1.sql阻塞还原 为了方便讲述,先创建一个post表,插个6条记录,参考代码如下: CREATETABLEpost(idINTIDENTITY,contentchar(4000)) GO INSERTINTOdbo.postVALUES('aaa') INSERTINTOdbo.postVALUES('bbb') INSERTINTOdbo.post...

  eN9dsiqvgeuP   2023年11月01日   26   0   0 SQL Server

一:背景 1.讲故事 在有关SQLSERVER的各种参考资料中,经常会看到如下四种事务隔离级别。 READUNCOMMITTED READCOMMITTED SERIALIZABLE REPEATABLEREAD 随之而来的是大量的文字解释,还会附带各种脏读,幻读,不可重复读常常会把初学者弄得晕头转向,其实事务的本质就是隔离,落地就需要锁机制,理解这四种隔离方式的花式加锁,应该就可以入门了,那如何可视化的观察锁过程呢?这里借助SQLProfile工具。 二:四种事务隔离方式 1.测试数据准备 还是用上一篇创建的post表,脚本如下: CREATETABLEpost(idINTIDENTI...

  eN9dsiqvgeuP   2023年11月01日   24   0   0 SQL Server

一:背景 1.讲故事 上一篇写完SQLSERVER的四个事务隔离级别到底怎么理解?之后,有朋友留言问什么时候可以把snapshot隔离级别给补上,这篇就来安排,快照隔离级别看起来很魔法,不过在修车之前,得先看下怎么开车。 二:snapshot隔离详解 1.snapshot之前的困境 在了解snapshot之前先看看没有它会存在什么样的困境?还是用上一篇的post表做案例,参考sql如下。 CREATETABLEpost(idINTIDENTITY,contentchar(3)) GO INSERTINTOdbo.postVALUES('aaa') INSERTINTOdbo.postVALU...

  eN9dsiqvgeuP   2023年11月01日   28   0   0 SQL Server

一:背景 1.讲故事 在SQLSERVER的众多阻塞场景中,有不小的一部分是由于PFS页上的闩锁等待造成的,毕竟写页操作一定是要串行化的,在面对闩锁(PAGELATCH_X)等待问题上,一定要搞明白PFS页到底是什么?这篇就来好好聊一聊。 二:PFS详解 1.什么是PFS页 我们知道数据库是由海量的数据页组成,表记录会写入到数据页上,那海量的数据页如何管理呢?SQLSERVER想到了一个办法,从海量的数据页中按一定规则择取一些作为管理页使用,比如: GAM跟踪区分配情况 SGAM跟踪共享区分配情况 PFS跟踪数据页的空间使用情况 这里我简述一下吧,GAM数据页中一个bit跟踪一个64k的空...

  eN9dsiqvgeuP   2023年11月01日   115   0   0 SQL Server

一:背景 1.讲故事 在面试中我相信有很多朋友会被问到truncate和delete有什么区别,这是一个很有意思的话题,本篇我就试着来回答一下,如果下次大家遇到这类问题,我的答案应该可以帮你成功度过吧。 二:区别详解 1.思考 从宏观角度来说,delete是DML语句,truncate是DDL语句,这些对数据库产生破坏类的语句肯定是要被sqlserver跟踪的,言外之意就是在某些场景下可以被回滚的,既然可以被回滚,那自然就会产生事务日志,所以从事务日志的角度入手会是一个好的办法。 为了方便测试,还是用上一篇的post表,创建好之后插入10条记录,参考sql如下: DROPTABLEdbo.p...

  eN9dsiqvgeuP   2023年11月01日   291   0   0 SQL Server

一:背景 1.讲故事 今天和大家聊一套面试中经常被问到的高频题,对,就是临时表和表变量这俩玩意,如果有朋友在面试中回答的不好,可以尝试看下这篇能不能帮你成功迈过。 二:到底有什么区别 1.前置思考 不管是临时表还是表变量都带了表这个词,既然提到了表,按推理自然会落到某一个数据库中,如果真在一个数据库中,那自然就有它的存储文件.mdf和.ldf,那是不是如我推理的那样呢?查阅MSDN的官方文档可以发现,临时表和表变量确实都会使用tempdb这个临时存储数据库,而且tempdb也有自己的mdf,ndf,ldf文件,截图如下: 有了这个大思想之后,接下来就可以进行验证了。 2.如何验证都存储在te...

  eN9dsiqvgeuP   2023年11月01日   43   0   0 SQL Server

一:背景 1.讲故事 相信大家在使用SQLSERVER的过程中经常会遇到阻塞和死锁,尤其是死锁,比如下面的输出: (1rowaffected) Msg1205,Level13,State51,Line5 Transaction(ProcessID62)wasdeadlockedonlockresourceswithanotherprocessandhasbeenchosenasthedeadlockvictim.Rerunthetransaction. 要解决死锁问题,个人感觉需要非常熟知各种隔离级别,尤其是可提交读模式下的CURD加解锁过程,这一篇我们就来好好聊一聊。 二:死锁简析 1...

  eN9dsiqvgeuP   2023年11月01日   51   0   0 SQL Server
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~