SQLSERVER数据存储内幕

保存文件到sqlserver数据库 C# 保存文件到数据库字段 attach new BusAttach ; FileInfo fi new FileInfo txtAttach Text Trim ; attach Fix fi Extension Substring 1 ToLower Trim ; FileStream fs fi OpenRead ; byte[] bytes new byte[fs Length]; fs Read bytes 0 Convert ToInt32 fs Length ; fs Close ; attach Attach bytes;">C# 保存文件到数据库字段 attach new BusAttach ; FileInfo fi new FileInfo txtAttach Text Trim ; attach Fix fi Extension Substring 1 ToLower Trim ; FileStream fs fi OpenRead ; byte[] bytes new byte[fs Length]; fs Read bytes 0 Convert ToInt32 fs Length ; fs Close ; attach [更多] 立即下载
  SQLSERVER 数据库中数据如何存储是SQLSERVER数据库核心的知识,同时网络上相关的参考资料也比较少!近段时间通过学习相关知识,将自己对SQLSERVER数据库在数据存储方面的理解整理下来,一方面希望能加深自己的印象,另一方面也希望能给其他的朋友提供相关的参考!

一:存储文件类型

   
 SQLSERVER有两种数据存储文件,分别是数据文件和日志文件。
  其中:数据文件是以8K(=8192Byte)的页面(Page)作为存储单元的。
  而日志文件是以日志记录作为存储单元。
  本文只讨论数据文件的存储方式,不涉及到日志文件存储方式。
数据文件以页面做为存储单元存储数据,要理解数据文件的存储方式,必须了解SQLSERVER中定义的页面类型种类。

二:页面类型
   SQLSERVER
中页面类型有8种,具体每种类型的详细说明,见下图:
  
用户的数据一般存放在数据页面中,由上图可以看出,数据页包含数据行中除 text、ntext和 image 数据外的所有数据,text、ntext和 image 数据存储在单独的页中。那么在一个数据页面中,数据是如何存放,SQLSERVER又是根据什么来定位页面与页面上的数据呢。要回答这个问题,有必要先了解数据页面的具体结构。
 
三:数据页面结构
  在数据页上,数据行紧接着页首按顺序放置。在页尾有一个行偏移表。在行偏移表中,页上的每一行都有一个条目,每个条目记录那一行的第一个字节与页首的距离。行偏移表中的条目序列与页中行的序列相反。数据页面结构如下图所示,下面将详细解释
其中:数据页面页首:96个字节,保存着页面的系统信息,如页的类型、页的可用空间量、拥有页的对象的对象 ID 以及该页面所属于哪个物理文件。
          
数据区:对应于上图中所有数据行的总区域,存放真正的数据,是以Slot为单位。一个Slot就是对应于一条数据记录行,从0开始编号,以16进制反序保存,Slot0,  Slot1....。
         
行偏移数组:用于记录该数据页面中每个Slot在数据页面所处的相对位置,便于定位和检索每个Slot在数据页面中的位置,数组中每个记录占两个字节。
 
四:存储分配单位:盘区(扩展 Extend)
     
虽然SQLSERVER中数据文件存储单位是页面(Page),但实际SQLSERVE并不是为页面为单位给数据分配空间,SQLSERVER默认的存储分配单位是盘区。这样做的主要原因是为了提高性能。为了避免频繁的读写IO,在表或其它对象分配存储空间,不是直接分配一个8K的页面,而是以一个盘区(Extend)为存储分配单位,一个盘区为8个页面(=8*8K=64K)。
但是这样做虽然减少了频繁的IO读写,提高的数据库性能,但却导致出一个新问题,那就是在存储那些只有少量数据,不足8K的对象,如果也是分配给一个盘区,就会存在存储空间上的浪费,降低了空间分配效率。
为解决上述问题,SQLSERVER提供了一种解决方案,定义了两种盘区类型,统一盘区和混合盘区。
      
其中:统一盘区只能存放同一个对象,该对象拥有这个盘区的所有页面         
           
混合盘区:由多个对象共同拥有该盘区。

      
在实际为对象分配存储盘区时,为了提高空间利用率,默认的情况下,如果一个对象一开始大小小于8个页面,就尽量放在混合盘区中,如果该对象大小增加到8个页面后,SQLSERVER会为这个对象重新分配一个统一盘区。
为了能够通过上述策略来实现为对象分配存储盘区,SQLSERVER提供了GAM/SGAM机制来管理和维护数据文件的盘区信息。
其中:
  • 全局分配映射表 (GAM)
GAM 页记录已分配的盘区,包括统一盘区和混合盘区。每个GAM包含 64,000 个盘区,将近 4 GB 的数据。GAM 对所涵盖区间内的每个盘区都有一位。如果这个位是 1,则盘区未分配(可用);如果这个位是 0,则盘区已分配。
  • 共享全局分配映射表 (SGAM)
SGAM 页只记录混合盘区,这些盘区当前用作混合盘区而且至少有一个未使用的页。每个 SGAM包含 64,000 个扩展盘区,将近 4 GB 的数据。SGAM 对所涵盖区间内的每个扩展盘区都有一位。如果这个位是 1,则该扩展盘区就用作混合扩展盘区且有可用的页;如果这个位是 0,则该扩展盘区不用作混合扩展盘区,或者虽然用作混合扩展盘区但其所有页都正在使用中。
 
根据扩展盘区的当前使用情况,每个扩展盘区在 GAM和 SGAM中有以下位模式设置。
          
     
     通过这样的策略简化了盘区管理算法。若要分配统一盘区,SQL Server在 GAM中搜索是 1的位,然后将它设成 0。若要查找有可用页的混合盘区,SQL Server在 SGAM中搜索是 1的位。若要分配混合盘区,SQL Server在 GAM中搜索是 1的位,并将它设置为 0,然后将 SGAM中相应的位也设置为 1。若要释放盘区,SQL Server应确保 GAM位设置为 1而且 SGAM位设置为 0。SQL Server内部实际使用的算法比这里叙述的算法要复杂(SQL Server在数据库中均匀分布数据),,但道理大致如此。
 
 
五:查看实际的数据页面信息
 数据存储相关的知识大致如上所述,理论性较强,但我们可以通过未公开的DBCC命令,直接查看某个数据页面的内容,得到直观上的数据存储信息。
     
具体是通过使用DBCC命令: DBCC PAGE.
     
简单的使用例子如下:

   //
查看数据页面的内容的方法
   
--打开查看数据页面的开关
    dbcc traceon(3604) //
打开跟踪标记
    dbcc Page(northwind,1,100,1) //
打开northwind数据库,第101个页面的信息
 
至于如何通过DBCC PAGE命令查看某个页面信息,以及页面信息如何查看,请参考以下链接:
[url]http://boyi55.blog.51cto.com/4345/26959[/url]

本文出自 “我儿子真帅!” 博客,请务必保留此出处http://alligator.blog.51cto.com/36993/79685

sqlserver2008技术内幕 描述sqlserver2008技术内幕,有别于sqlserver2005,里面讲述了各种sqlserver数据库内幕 立即下载

相关推荐

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统,记录配置过程

Jack的小窝 5942

sqlserver数据库的物理存储格式和逻辑存储格式

物理存储结构:   数据库文件在磁盘上的存储形式:   主数据文件:*.mdf。用来存储数据库的启动信息、存储部分或全部的数据。整个的数据库只能有一个主数据文件   辅助数据文件:*.ndf。用于存储主数据文件未能存储的剩余数据和一些数据库对象   日志文件:*.ldf。存储数据库更新的事务日志信息。数据库的插入、删除、更新等操作都会记录在日志文件中,因为他们影响到了数据库的记录,会显示影...

weixin_30410119的博客 1072

在Jetson orin NX上安装部署Yolov8

1、环境准备与依赖安装2、安装PyTorch和Torchvision:从NVIDIA官方论坛或开发者下载中心获取与你的JetPack版本兼容的PyTorch wheel文件。例如,对于JetPack 5.1.2,可以安装PyTorch v2.1.0 8。:需要编译安装与PyTorch版本匹配的Torchvision。这里自己编译没有成功,下载了一个现成的可以用torchvision-0.16.2+c6f3977-cp38-cp38-linux_aarch64.whl。

xxxcccvvvbbb的博客 777

SQL Server中数据库文件的存放方式,文件和文件组

     写在前面:上次我关于索引的文章有几个园友发站内信问我如何将索引和表存储在不同的硬盘上。我觉的需要专门写一篇文章来讲述一下文件和文件组应该更容易理解. 简介     在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文件组的概念对...

weixin_34007020的博客 733

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3705

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 978

了解SQL Server事务日志备份和完整备份的日志序列号

This article explores the SQL Server Transaction log backups and log sequence number (LSN) in combination with the Full backups. 本文探讨了SQL Server事务日志备份和日志序列号(LSN)与完整备份的组合。 SQL Server备份简介 (SQL S...

culuo4781的博客 2254

时间序列分析:ARCH、GARCH、TGARCH与DCC-GARCH波动率模型(含代码)

关注TGARCH模型和DCC-GARCH的应用,通过在沪深300和中证500指数上应用TGARCH和DCC-GARCH模型,揭示这两个指数之间的条件异方差及动态相关性的变化规律。

celiaweiwei的博客 1万+

TICK回测二:数据如何存储

一、概述   前一节讲了如何用极星每日批量获取TICK数据,并存到CSV文件,存储格式是:   【合约编号,时间戳,最新价】   比如:ZCE|F|AP|112,20211102145321750,8035.0   交易日11月2日,跑了ZCE全部198个合约,得到了676569条记录,CSV文件25M   交易日11月3日,跑了ZCE全部198个合约,得到了755613条记录,CSV文件28M   如果以此类推,一年约需要6600M的空间,3家交易所就是19.8G/年。想想其实也还好,但是不压

布兰姥爷的博客 1473

CSP-J 初赛模拟卷1 题解

只有一棵子树有后继,其他的都是叶结点才能保证树的深度最大,此时还剩(n-5)个结点,最后加上2,得到(n-3),即为答案。题解:先修改p的指针域,让它的左指针域指向q,然后再让q的右指针域赋值给p的右指针域,再然后修改q的右指针域使其指向p,最后需要改变的指针域就是原先q结点的后继节点的左指针域内容。设n个元素的入栈序列是1,2,3,...,n,出栈序列为p1,p2,...,pn,若p1=n,则pi(1≤i≤n)的值为(1)输入的三个数中,第二个数应是[0,11]上的整数,否则会出现数组越界的问题。

Sat77GryHp_Pro的博客 2805

基于FPGA的64点fft变换verilog开发

这精度的损失在10bits看来对最后的误差的影响是存在是不可忽略的。此后,在这思想基础上又开发了高基和分裂基等快速算法,随着数字技术的高速发展,1976年出现建立在数论和多项式理论基础上的维诺格勒傅里叶变换算法(WFTA)和素因子傅里叶变换算法。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显著。

FPGA/MATLAB学习教程/源码/项目合作开发 1977

老汉写的--SQLSERVER数据存储内幕

SQLSERVER数据库中数据如何存储是SQLSERVER数据库核心的知识,同时网络上相关的参考资料也比较少!近段时间通过学习相关知识,将自己对SQLSERVER数据库在数据存储方面的理解整理下来,一方面希望能加深自己的印象,另一方面也希望能给其他的朋友提供相关的参考!一:存储文件类型    SQLSERVER有两种数据存储文件,分别

老汉--小庙和尚 3172

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 653

[转]SQLSERVER数据存储内幕

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://alligator.blog.51cto.com/36993/79685 SQLSERVER数据库中数据如何存储是SQLSERVER数据库核心的知识,同时网络上相关的参考资料也比较少!近段时间通过学习相关知识,将自己对SQLSERVER数据库在数据存储方面的理解整理...

weixin_30410999的博客 111

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python爬虫如何将数据存储到SQLServer数据库中

Python如何将爬取数据存储到数据库中 第一步 :导入第三方模块pymssql 安装命令:python -m pip install pymssql 安装地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/ 注:MySQL 使用pymysql库 第二步 :不说太多,直接上代码 注意:需要提前写好数据库 只需要修改红框部分,修改后看进行传值进行调试 import requests import re import pymssql headers={ '

weixin_46278707的博客 4931

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

node-red 读取OPCUA数据存储到SQLServer中

首先,您需要安装node-red-contrib-opcua和node-red-contrib-mssql-plus节点,以便使用OPC UA Client获取OPC变量值,连接SQLServer。把获得的OPC UA 的值传送到 function(数据处理flow)中,把变量和值,成对的存放到flow中的数组变量中。这是就能在数据库中看到已经创建了新的表,表名是变量地址,每个变量一个表,表中已经有了插入的数据。然后,您可以使用Inject节点(OPC采集)作为触发器,用于定期采集OPC变量值。

sunly_8081的博客 1976

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mysql与mssql_MYSQL与MSSQL的区别及优劣比较?

MySQL可以说是MSSQL的简化版本。理念相同,但MySQL的实现比MSSQL的需求低。MySQL是一个免费的、开放源代码的SQL数据库,所以免费的MYSQL很受欢迎,php+mysql,MySQL数据库专用于PHP网站的,一般用在PHP的网页上的,他和PHP可以说是黄金搭档(都是开源免费的东西)。对于不是特别大流量的网站,特别胜任,效率最高,MYSQL适合小、中型网站。mysql 是个开源的数...

weixin_31354669的博客 7304

docker安装mssql

我们首先安装和配置了Docker,并下载了MSSQL的Docker镜像。然后,我们创建了一个新的Docker容器,并在其中启动了MSSQL服务。在上述命令中,我们设置了几个环境变量,包括接受MSSQL使用条款的标志(ACCEPT_EULA)和SA用户的密码(SA_PASSWORD)。我们将学习如何在Docker容器中安装和配置MSSQL,以及如何使用Docker命令来管理数据库的生命周期。通过这些命令,我们可以方便地管理Docker中的MSSQL数据库容器,包括启动、停止、重启和查看日志等操作。

u012285295的博客 1412

msSQL和MySQL的区别?

msSQL和MySQL都是流行的关系型数据库管理系统,具有相似的核心功能如数据存储、查询和处理,都使用SQL语言,支持事务处理和访问控制。但它们在体积、资源占用、平台兼容性、授权费用、设计特点、性能和管理工具方面有明显的差异。选择哪种数据库主要取决于具体需求、预算和技术环境。

专注IT技术免费指导以及想、项目分享 2353

mssql和mysql那个好_mssql与mysql的有什么区别?哪个更好用?

mssql与mysql的有什么区别?哪个更好用?MySQL可以说是MSSQL的简化版本。理念相同,但MySQL的实现比MSSQL的需求低。MySQL是一个免费的、开放源代码的SQL数据库,所以免费的MYSQL很受欢迎,php+mysql,MySQL数据库专用于PHP网站的,一般用在PHP的网页上的,他和PHP可以说是黄金搭档(都是开源免费的东西)。对于不是特别大流量的网站,特别胜任,效率最高,MY...

weixin_42395985的博客 3234

MSSQL 清理日志

MSSQL日志文件过大时,可先分离数据库,然后删除日志文件,新建日志文件,最后附加数据库即可。 具体步骤如下: 1)分离数据库 打开Microsoft SQL Server Management Studio ,选取待分离的数据库。 鼠标右键,点击 “任务” -> “分离”。 点击 “确定”即可。 2)删除日志文件 进入数据库文件存放目录,如:D:\Mic...

漂石的手艺(技术)活儿 1584

MYSQL与MSSQL的区别及优劣比较

MySQL可以说是MSSQL的简化版本。理念相同,但MySQL的实现比MSSQL的需求低。MySQL是一个免费的、开放源代码的SQL数据库,所以免费的MYSQL很受欢迎,php+mysql,MySQL数据库专用于PHP网站的,一般用在PHP的网页上的,他和PHP可以说是黄金搭档(都是开源免费的东西)。对于不是特别大流量的网站,特别胜任,效率最高,MYSQL适合小、中型网站。

cao919的专栏Net 2510

mssql和mysql区别

  最近在做mssql转换成mysql的工作,总结了点经验,跟大家分享一下。 同时这些也会在不断更新。也希望大家补充。   1 mysql支持enum,和set类型,sql server不支持 2 mysql不支持nchar,nvarchar,ntext类型 3 mysql的递增语句是AUTO_INCREMENT,而mssql是identity(1,1) 4 msms默认...

weixin_34123613的博客 6740

sqlserver 2008 技术内幕下载_SQLSERVER 安装

SQLSERVER 安装1 下载安装软件1下载sqlserver安装工具可以选择一件安装,也可以仅下载软件然后自己手动安装2仅下载安装介质2手动安装sqlserver1 在下载 路径下找到安装包SQLServer2017-x64-ENU-Dev2 双击setup进行安装3 选择installation 中的 New SQL Server stand-alone installation…4 添加l...

weixin_39585070的博客 106
上一篇: 简述Windows系统名称解析过程
下一篇: 配置远程客户机使用命名管道协议访问SQL服务器
SuperITPro
博客等级 码龄15年 12粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值