08 2015 档案
摘要:对于MS SQL server 数据库,有几个容易让人产生误解的问题,对于这几个问题,即使很多 SQL server DBA 都有错误认识或者认识不充分,所以我想撰文几篇,把这些容易理解错误的问题前前后后深入阐述一下,也希望纠正一下网上对这几个问题的讹传(我也可能有认识不对的地方,欢迎批评指正)。 ...
阅读全文
摘要:一:delete操作 现在我们已经知道,索引都是以B树的形式存在的,既然是B树,我们就要看看他们的叶子节点和分支结点,先准备点测试数据,如下图:按 Ctrl+C 复制代码按 Ctrl+C 复制代码 叶子结点的变化 从上面的图中大概可以看到,当我插入完毕后,现在有4个索引数据页,其中PID=200...
阅读全文
摘要:1.查询表中的RIDRID=RowID=(fileID:pageID:slotID)SELECT sys.fn_PhysLocFormatter(%%physloc%%) AS rid,* FROM person2.开启DBCC命令语法--开启DBCC TRACEON(2588)--帮助命令DBCC...
阅读全文
摘要:一:现象1:无索引的情况 还是老规矩,看个例子感受下,首先我有一个Product表,里面没有任何索引,如下图:从上图中,我悲剧的看到了,物理读是9次,也就说明走了9次硬盘,你也可以想到,走硬盘的目的是为了拿数据,逻辑读有1636次,要注意的是这里的”次“是“页”的意思,也就是在内存中走了1636个...
阅读全文
摘要:一:表扫描1.现象 ”表扫描“听起来很简单,不就是一行一行的扫嘛,你要说”执行计划”的话,我也会玩,为了更可观,我build一个表,再插入三行数据,如下图:上面的Person我是一个索引都没建,然后where一下,看看表扫描是啥样的???果然是看到了万恶的“表扫描”三个字,既然是万恶的东西,我们一...
阅读全文
摘要:说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无比强大的系统,我们平时做系统的时候都会加上缓存,我想如果没有缓存,就不会有什么大网站能跑的起来,而且大公司一般会在一个东西上做的比较用心,比较细,sqlserver同样也使用了缓存,其中就包括Data cache 和Plan cache两...
阅读全文
摘要:一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图:1. 分析过程 这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行这个sql的权限,对不对。。。这样我们就走完了执行计...
阅读全文
摘要:一: 当select遇到性能低下的update会怎么样?1. 还是使用原始的person表,插入6条数据,由于是4000字节,所以两条数据就是一个数据页,如下图:1 DROP TABLE dbo.Person2 CREATE TABLE Person(ID INT IDENTITY,NAME CHA...
阅读全文
摘要:一:到底都有哪些锁 学习锁之前,必须要知道锁大概有几种???通常情况下作为码农我们只需知道如下几个锁即可。。。1.S(Share)锁 为了方便理解,我们可以直接这么认为,当在select的时候在表,数据页,记录上加上共享锁。2.X(Exclusive) 锁 我们在delete数据的时候会在记录...
阅读全文
摘要:1、NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。2、HOLDLOCK(保持锁) 此选项被选中时,SQL...
阅读全文
摘要:概念介绍开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种。它等同于 READUNCOMMITTED 。 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读。不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事...
阅读全文
摘要:I used to see my senior developers use WITH (NOLOCK) when querying in SQL Server and wonder why they use. Now i explored it and found thatit's useful ...
阅读全文
摘要:六、各种事务隔离级别发生的影响修改数据的用户会影响同时读取或修改相同数据的其他用户。即这些用户可以并发访问数据。如果数据存储系统没有并发控制,则用户可能会看到以下负面影响:·未提交的依赖关系(脏读)·不一致的分析(不可重复读)·幻读(一)脏读:例:张某正在执行某项业务,如下:begin tranin...
阅读全文
摘要:五、锁与事务隔离级别事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。SQLServer数据库引擎支持所有这些隔离级别:·未提交读(隔离事务的最低级别,只能保证不读取物理上...
阅读全文
摘要:二、完整的锁兼容性矩阵(见下图)对上图的是代码说明:见下图。三、下表列出了数据库引擎可以锁定的资源。名称资源缩写编码呈现锁定时,描述该资源的方式说明数据行RIDRID9文件编号:分页编号:Slot编号用于锁定堆中的单个行的行标识符。索引键KEYKEY76字节哈希值索引中用于保护可序列化事务中的键范围...
阅读全文
摘要:锁定:通俗的讲就是加锁。锁定是MicrosoftSQLServer数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制。定义:当有事务操作时,数据库引擎会要求不同类型的锁定,如相关数据行、数据页或是整个数据表,当锁定运行时,会阻止其他事务对已经锁定的数据行、数据页或数据表进行操作。只有在当前...
阅读全文
摘要:在上一篇中忘记了一个细节。Range T-K 到底代表了什么?Range T-K Lock 代表了在 SERIALIZABLE 隔离级别中,为了保护范围内的数据不被并发的事务影响而使用的一类锁模式(避免幻读)。它由两个部分构成:第一个部分代表了他锁定了一个索引范围,在这个范围内,所有索引使用 T 锁...
阅读全文
摘要:在这篇随笔中,我们的主要关注点在 Key-Range Lock。Key-Range Lock有 S-S、S-U、I-N、X-X几种情况。我们一个一个来说,力求明白。遗憾的是,这里可能会比较冗长,那么死锁分析只好依次顺延了。Range S-S锁的获取规则MSDN 对 Range 锁的规则有部分描述,但...
阅读全文
摘要:SQL Server 的事务和锁(一)最近在项目中进行压力测试遇到了数据库的死锁问题,简言之,如下的代码在 SERIALIZABLE 隔离级别造成了死锁:1234567891011121314SELECT@findCount=COUNT(id) FROMMyTableWHERE[fk_related...
阅读全文
摘要:一.本文所涉及的内容(Contents)本文所涉及的内容(Contents)背景(Contexts)架构原理(Architecture)测试环境(Environment)安装Moebius(Install)Moebius测试(Testing)负载均衡测试(Load Balancing Testing...
阅读全文