Sql Server之旅——第二站 理解讨厌的表扫描

很久以前我们在写sql的时候,最怕的一件事情就是sql莫名奇妙的超级慢,慢的是几根烟抽完,那个小球还在一直转。。。这个着急也只有当事人才明白,后来听说有个什么“评估执行计划“,后来的后来才明白应该避免表扫描。。。

一:表扫描

1.现象

”表扫描“听起来很简单,不就是一行一行的扫嘛,你要说”执行计划”的话,我也会玩,为了更可观,我build一个表,再插入三行数据,如下图:

上面的Person我是一个索引都没建,然后where一下,看看表扫描是啥样的???

果然是看到了讨厌的“表扫描”三个字,既然是讨厌的东西,我们一定要深刻了解下,然后我们才可以怎么去想办法避免它。。。所以我们一定要理解到本质,那问题来了,它到底是怎么扫的呢???怎么破呢?这个还必须得从数据页说起。。。

二:深刻理解表扫描

1:数据页

这个学sqlserver的没有理由说不知道,我们的记录都是以数据页形式存储的,而且还应该知道数据页的大小是8k。。。。那数据页在哪里?我可以让你眼见为实。

乍一看我画了好多,千万不要怕,不要以为画的多,就以为高深了。。。我简单的剖析下。

<1>:dbcc ind 命令

你要是想看数据页的相关情况,sqlserver还真提供了专用命令dbcc满足你,你可能会问sqlserver中有提供ind命令的参数吗?告诉你吧,还真有的,不过这个要开启2588跟踪,就像下面这样。

<2>:PageFID,PagePID,IAMFID

刚才也说了,数据页有很多种,默认说的都是表数据页,其实还有IAM数据页,没什么稀奇的,IAM就是用来跟踪表数据页的,所以上面的图中,IAMFID字段为Null的记录就是IAM页,下面的PagePID=78的,就是表数据页。

2.查看数据页

为避免大家糊涂了,我先还是说说数据页内部结构大概是个什么样子,好让大家有个整体印象。

从图中可以看到,在数据页的尾部是有很多槽位的,这些槽位指向了Data区域中一条条实际记录的地址,所以说表扫描,其实就是扫这些Slot槽位,还是拿上面的Person表中的三条记录来说,他们都是保存在78号数据页中,现在出于好奇心把78号数据页导出来,说干就干。。。。很简单,你需要做两件事情:

<1>开启3604跟踪:dbcc traceon(3604)

<2>使用dbcc page 命令导出1号文件下面的78号数据页(pageFID:pagePID)=(1:78),就像下面这样。。。

数据页头(PAGE HEADER):

数据内容(Page Data):

数据槽位(Page Slot):

有没有看到上面(0,1,2)三个槽位,并且都有相应的偏移地址(0x7e,0x92,0xba),这个地址就指向了Data区域实际记录的偏移地址。

好了,到此为止吧。


网页版请参见博客园:https://www.cnblogs.com/huangxincheng/p/4227483.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA JFrame画图基础和事件监听

JFrame画图基础和事件监听 消息框 JOptionPane.showMessageDialog(mine.this, "删除不成功!");画图 class MyJPanel extends JPanel //继承面板类 {public void paint(Graphics g) //覆盖父类的方法,paint相当于画图{g.drawOval(30, 30, 80, 80); //画圆g.drawLi…

[C++11]final关键字的使用

C中增加了final关键字来限制某个类不能被继承&#xff0c;或者或个虚函数不能被重写&#xff0c;和java的final关键字的功能是类似的。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且要把final关键字放到类或者函数的后面。 1.如果使用final修饰函数&#…

Sql Server之旅——第一站 那些给我们带来福利的系统视图

本来想这个系列写点什么好呢&#xff0c;后来想想大家作为程序员&#xff0c;用的最多的莫过于数据库了&#xff0c;但是事实上很多像我这样工作在一线的码农&#xff0c;对sql 都一知半解&#xff0c;别谈优化和对数据库底层的认识了&#xff0c;我也是这样。。。一&#xff1…

c语言case怎么输入字母,如何使用switch case语句将字母转换为数字

我正在制作黑色插口游戏&#xff0c;并且需要使用switch case语句将A转换为11&#xff0c;将T&#xff0c;Q&#xff0c;J和K转换为10&#xff0c;但是我不确定如何执行代码。有人会帮助我解决这个问题吗&#xff1f;如何使用switch case语句将字母转换为数字到目前为止&#x…

JAVA JDBC连接mysql编程

JDBC连接mysql编程 基本操作 package jdbc;import java.sql.Statement; import java.util.Scanner; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet;public class test {public static void main(String[] args) throws Exception {…

[C++11]继承构造函数

C11中提供的继承构造函数可以让派生类直接使用基类的构造函数&#xff0c;而无需自己再写构造函数&#xff0c;尤其是在基类有很多构造函数的情况下&#xff0c;可以极大地简化派生类构造函数的编写。 先来看没有继承构造函数之前的处理方式: 代码如下: #include <iostrea…

.NET 程序员的 Playground :LINQPad

如果想执行一个简单的 C# 语句并获得运行结果&#xff0c;通常我们需要做几个步骤才能达成&#xff1a;打开 Visual Studio 并新建一个控制台项目。在 Program.cs 中编写代码并保存。点击运行按钮或者 F5 运行程序并查看结果。通常来说这并不会产生问题。但如果你和笔者一样为 …

c语言表达式5 gt 3 gt 1,C语言题目谁会做?

1.为表示关系X>y>z&#xff0c;应使用C语言表达式________2.选择题&#xff1a;C语言中&#xff0c;函数返回值的类型是&#xff1a;_____A。return语句中的表达式的类型。B。主调函数中指定的类型。C。定义函数时所指定的函数类型。D。函数调用时系统随机指定的类型3.1.…

JAVA 点菜系统数据库课程设计

点菜系统数据库课程设计 效果图 数据库建表 CREATE TABLE OrderDish (orderid int not null,money int,primary key(orderid) );CREATE TABLE Dish (id varchar(20) not null,name nchar(10),price int,type nchar(10),primary key(id) ); insert into Dish values(zhushi0,水…

[C++11]委托构造函数

委托构造函数允许使用同一个类中的一个构造函数调用其他的构造函数&#xff0c;从而简化相关变量的初始化。 注意点: 1.这种链式的构造函数调用不能形成一个闭环(死循环)&#xff0c;否则会在运行期抛异常。 2.如果要进行多层构造函数的链式调用&#xff0c;建议将构造函数的…

基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目

首先&#xff0c;默认咱们已经有了.net core 3.1的开发环境&#xff0c;如果你没有&#xff0c;快去下载... https://dotnet.microsoft.com/download由于项目是基于abp vNext开发的&#xff0c;所以开发之前建议去撸一遍abp官方文档&#xff0c;https://docs.abp.io/en/abp/lat…

c语言常见错误代码释义,C语言常见错误代码释义解析.doc

C语言常见错误代码释义解析C语言常见错误代码释义错误代码及错误信息 错误释义error 1: Out of memory 内存溢出error 2: Identifier expected 缺标识符error 3: Unknown identifier 未定义的标识符error 4: Duplicate identifier 重复定义的标识符error 5: Syntax error 语法错…

JAVA Java多线程与并发库

Java多线程与并发库 同步方式 import javax.xml.stream.events.StartDocument;public class TestSynchronized {public static void main(String[] args) {// TODO Auto-generated method stubTestSynchronized test new TestSynchronized();test.init();}void init() {fina…

[C++11]统一的数据初始化方式 - 初始化列表

关于C中的变量&#xff0c;数组&#xff0c;对象等都有不同的初始化方法&#xff0c;在这些繁琐的初始化方法中没有任何一种方式适用于所有的情况。为了统一初始化方式&#xff0c;并且让初始化行为具有确定的效果&#xff0c;在C11中提出了列表初始化的概念。 代码如下: #in…

ffmpeg为何用c语言编译,如何使用ffmpeg的c语言sdk实现对文件夹的操作

重要函数打开文件夹&#xff1a;avio_open_dir()读取文件夹&#xff1a;avio_read_dir()关闭文件夹&#xff1a;avio_close_dir()结构体, 操作目录的上下文&#xff1a;AVIODirContext()目录项&#xff0c;用于存放文件名&#xff0c;文件大小等信息&#xff1a;AVIODirEntry()…

Sql Server之旅——第三站 解惑那些背了多年聚集索引的人

说到聚集索引&#xff0c;我想每个码农都明白&#xff0c;但是也有很多像我这样的伪程序员&#xff0c;只能用死记硬背来解决这个问题&#xff0c;什么表中只能建一个聚集索引&#xff0c;然后又扯到了目录查找来帮助读者记忆。。。。问题就在这里&#xff0c;我们不是学文科&a…

C#相关基础知识点总结+基础代码

C#基础知识 同一命名空间下的两个类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace HelloWorld {class A{private int a;public A(int x) { a x; }public void show() { Console.WriteL…

[PAT乙级]1038 统计同成绩学生

本题要求读入 N 名学生的成绩&#xff0c;将获得某一给定分数的学生人数输出。 输入格式&#xff1a; 输入在第 1 行给出不超过 10​5​​ 的正整数 N&#xff0c;即学生总人数。随后一行给出 N 名学生的百分制整数成绩&#xff0c;中间以空格分隔。最后一行给出要查询的分数个…

懂「互联网语」的程序员,是个狠人。

借用一下时下很火的「互联网语」做程序员的乐趣是只有进场的人才能获得的红利与程序员相处绝对是令人WOW的用户体验但是别真信那些个程序员说的话哪怕有无数江湖传言为他背书不然你良久建立的心智模型会在瞬间就崩塌毕竟头部程序员和腰腿部程序员之间的壁垒打通不了也许你暂时还…

综合知识点+计算机

综合知识点 多态性有哪些&#xff1f;&#xff08;静态和动态&#xff0c;分别叙述了一下虚函数和函数重载&#xff09; { 分为静态多态性和动态多态性&#xff0c;静态就是在编译时就已经确定了&#xff0c;动态是在程序运行时 才能确定。像函数重载&#xff0c;就是多个函数…