zoukankan      html  css  js  c++  java
  • 表扫描

    一:表扫描

    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区域实际记录的偏移地址。

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/Yongzhouunknown/p/4772224.html
Copyright © 2011-2022 走看看