索引需要占用物理内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引需要占用物理内存?相关的知识,希望对你有一定的参考价值。

占用的
经常看见有人问,MSSQL 占用了太多的内存,而且还不断的增长;或者说已经
最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得
你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给
清掉。所以一般我们在看statistics io 的时候,看到的physics read 都是0。
其次就是查询的开销,一般地说,hash join 是会带来比较大的内存开销的,
而merge join 和nested loop 的开销比较小,还有排序和中间表、游标也是会
有比较大的开销的。
所以用于关联和排序的列上一般需要有索引。
再其次就是对执行计划、系统数据的存储,这些都是比较小的。
我们先来看数据缓存对性能的影响,如果系统中没有其它应用程序来争夺内
存,数据缓存一般是越多越好,甚至有些时候我们会强行把一些数据pin 在高速
缓存中。但是如果有其它应用程序,虽然在需要的时候MSSQL 会释放内存,但是
线程切换、IO 等待这些工作也是需要时间的,所以就会造成性能的降低。这样
我们就必须设置MSSQL 的最大内存使用。可以在SQL Server 属性(内存选项卡)
中找到配置最大使用内存的地方,或者也可以使用sp_configure 来完成。如果
没有其它应用程序,那么就不要限制MSSQL 对内存的使用。
然后来看查询的开销,这个开销显然是越低越好,因为我们不能从中得到好
处,相反,使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免
中间表和游标的使用,在经常作关联和排序的列上建立索引。
参考技术A 计算机中的任何程序 数据 ,在发挥作用时 都是需要物理内存的。无论使用虚拟内存技术与否,真正的程序运行 数据发挥意义 都是需要通过物理内存来操作完成的。

物理内存管理

分区表:记录分区的位置,大小和使用标志

 

分区存储管理:

  单一区存储管理(不分区存储管理):

    定义:用户区不分区,完全被一个程序占用。例如DOS

    优点:简单,不需要复杂

    缺点:程序运行占用整个内存,

       内存浪费,效率低

  分区存储管理:把用户区内存划分为若干大小不等的分区

         适合单用户单任务系统

    固定分区:把内存固定地划分为若干个大小不等的分区

         每个分区的大小和位置都固定,系统运行期间不再重新划分

      使用特点:

        1.在程序装入之前,内存已被分区,不再改变

        2.每个分区大小不同,适应不同大小的程序

        3.系统要维护分区表

      缺点:

        1.浪费内存

        2.大程序可能无法运行

      建议:

        根据分区表安排程序装入顺序

        当程序的大小,个数,装入顺序都固定时内存使用效率高。

    动态分区:在程序装入时创建分区,使分区的大小刚好与程序大小相等。

      特点:

        分区动态建立

        分区的大小和个数都可以改变

        存在内存碎片

      问题:

        分区的分配,选择,回收和如何解决内存碎片问题。

 

分区放置策略:

  空闲区表:描述内存空闲区的

  分区的分配:

    分配过程(假定需要空间大小为S)

      1.从空闲区表第一个区开始寻找≥S的空闲区

      2.找到后从分区中分割出大小为S的部分给用户使用

      3.分割后的剩余部分作为空闲区依然登记再空闲区表中

      //分割空闲区的时候从底部分割,这样只是大小改变但是区的地址不变。

  放置策略:

    1按照空闲区首地址递增排序:首次适应算法

    2.按照空闲区首地址递减排序

    3.按照空闲区大小的递增排序:最佳适应算法

    4.按照空闲区大小的递减排序:最坏适应算法

    

    首次适应算法:尽可能使用低地址空间

          当需要较大分区时再高地址的空间有满足可能性

    最坏适应法:

      优点:大空闲区分割后剩下部分还是可以装下较大的程序

      特点:只需要一次查找就可以找到需要的分区

    分区的回收:

      功能:回收程序释放分区,登记到空闲区表中,以便再使用

      收回算法:

        1.考虑释放区与现有空闲区是否相邻   

        2.若释放区与现有空闲区不相邻,则直接插入空闲区表

        3.若释放区与现有空闲区相邻,则与空闲区合并后更新空闲区表

 

内存覆盖技术:

  覆盖——Overlay

  目的:在较小的内存空间中运行较大的程序

  内存分区:

    常驻区:被某段单独且固定地占用,可划分多个

    覆盖区:能被多段共用(覆盖),可划分多个

  缺点:

    编程复杂:程序员划分程序模块并确定覆盖关系

    程序执行时间长:从外存装入内存耗时

 

内存交换技术:Swapping

  原理:内存不够时把进程写进磁盘(换出/Swap Out)

     当进程要运行时重新写回内存(换入/Swap In)

  优点:

    增加进程并发数

    不考虑程序结构

  缺点: 

    换入和换出增加CPU开销

    交换单位太大

  问题:

    减少交换传输的信息量

    外存交换空间的管理方法

    程序换入时的地址重定位

 

内存碎片:

  过小的空闲区,难利用

  内存碎片会降低内存有效利用率

  碎片问题:

    动态分区的缺点:

      容易产生内存碎片:内存反复分配和分割

      最佳适应法最容易产生内存碎片

    解决办法1:规定门限值

      分割空闲区时,若剩余部分小于门限值,则不分割,全部给用户

    解决办法2:内存拼接技术

      将所有空闲区集中一起构成一个大的空闲区

      拼接的时机:

       1.释放区回收的时候

        拼接频率过大,系统开销大

       2.系统找不到足够大的空闲区时

        空闲区的管理复杂

       3.定期:

        空闲区的管理复杂

      拼接技术的缺点:

        消耗系统资源

        离线拼接//需要整个系统停止运作来拼接

        重新定义作业

     解决办法3:解除程序占用连续内存才能运行的限制

        把程序拆分成多个部分装入不同分区,充分利用碎片

      

以上是关于索引需要占用物理内存?的主要内容,如果未能解决你的问题,请参考以下文章

关于查看进程所占用物理内存的问题

linux占用物理内存高的问题

物理内存管理

物理内存管理

物理内存管理

总的物理内存和可用物理内存啥意思