Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Server中单调递增值的B树节点分割策略

Server中单调递增值的B树节点分割策略
EN

Database Administration用户
提问于 2011-04-29 12:43:38
回答 1查看 1.4K关注 0票数 9

考虑一个值的B树索引,它总是单调地增加,例如一个类型标识的列。对于传统的B树实现,每当节点已满时,它将被分割为50%/50%,我们最终会得到一个B树,其中(几乎)所有节点都将只满50%。

我知道Oracle会发现值不断增加,而在这些情况下,Oracle执行90%/10%的拆分。这样,(几乎)所有节点都将满90%,对于这些非常常见的情况,可以获得更好的页面利用率。

我无法在Server中找到类似特性的文档。但是,我做了两个实验,分别在索引中插入了N个随机整数和N个连续整数。前者使用的页面要多得多,后者则要多得多。

Server是否提供了类似的功能?如果是这样的话:你能告诉我一些关于这个特性的文档吗?

更新:根据下面提供的实验,叶节点保持不分裂,内部节点被分割50%/50%。这使得增加键的B树比随机键更紧凑.然而,Oracle的90%/10%的方法甚至更好,我仍然寻找一些官方文档来验证在实验中看到的行为。

EN

回答 1

Database Administration用户

发布于 2011-04-29 13:00:02

如果在索引末尾添加一行,则只为该行分配一个新页,而不是拆分当前的结束页。这方面的实验证据如下(使用需要Server 2008的%%physloc%%函数)。也见这里的讨论。

代码语言:javascript
运行
AI代码解释
复制
CREATE TABLE T
(
id int identity(1,1) PRIMARY KEY,
filler char(1000)
)
GO

INSERT INTO T
DEFAULT VALUES
GO 7

GO
SELECT sys.fn_PhysLocFormatter(%%physloc%%)
FROM T

GO

INSERT INTO T
DEFAULT VALUES

GO

SELECT sys.fn_PhysLocFormatter(%%physloc%%)
FROM T
GO

DROP TABLE T

返回(您的结果将有所不同)

代码语言:javascript
运行
AI代码解释
复制
(1:173:0) /*File:Page:Slot*/
(1:173:1)
(1:173:2)
(1:173:3)
(1:173:4)
(1:173:5)
(1:173:6)
(1:110:0) /*Final insert is on a new page*/

不过,这似乎只适用于叶节点。通过运行下面的代码并调整TOP值就可以看出这一点。对我来说,622/623是需要一个和两个第一级页面之间的断点(如果启用了快照隔离,那么可能会有所不同)。它以平衡的方式分割页面,导致在这个级别上浪费空间。

代码语言:javascript
运行
AI代码解释
复制
USE tempdb;

CREATE TABLE T2
(
id int identity(1,1) PRIMARY KEY CLUSTERED,
filler char(8000)
)

INSERT INTO T2(filler)
SELECT TOP 622 'A'
FROM master..spt_values v1,  master..spt_values v2

DECLARE @index_info  TABLE
(PageFID  VARCHAR(10), 
  PagePID VARCHAR(10),   
  IAMFID   tinyint, 
  IAMPID  int, 
  ObjectID  int,
  IndexID  tinyint,
  PartitionNumber tinyint,
  PartitionID bigint,
  iam_chain_type  varchar(30),    
  PageType  tinyint, 
  IndexLevel  tinyint,
  NextPageFID  tinyint,
  NextPagePID  int,
  PrevPageFID  tinyint,
  PrevPagePID int, 
  Primary Key (PageFID, PagePID));

INSERT INTO @index_info 
    EXEC ('DBCC IND ( tempdb, T2, -1)'  ); 

DECLARE @DynSQL nvarchar(max) = 'DBCC TRACEON (3604);'
SELECT @DynSQL = @DynSQL + '
DBCC PAGE(tempdb, ' + PageFID + ', ' + PagePID + ', 3); '
FROM @index_info     
WHERE IndexLevel = 1

SET @DynSQL = @DynSQL + '
DBCC TRACEOFF(3604); '

EXEC(@DynSQL)


DROP TABLE T2
票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/9963

复制
相关文章
git命令中带有特殊符号如@
使用带用户密码clone的方式: git clone https://username:password@remote 当username和password中含有特殊符号会导致出错, 因为为http的请求,所以需要将特殊符号encode成url格式的 java使用: String c = java.net.URLEncoder.encode(".","utf-8"); System.out.println(c); 源文档 <http://blog.csdn.net/qq1142003960/article/
千往
2018/01/24
2.1K0
攻击本地主机漏洞(中)
Windows无人参与安装在初始安装期间使用应答文件进行处理。您可以使用应答文件在安装过程中自动执行任务,例如配置桌面背景、设置本地审核、配置驱动器分区或设置本地管理员账户密码。应答文件是使用Windows系统映像管理器创建的,它是Windows评估和部署工具包(ADK:Assessment and Deployment Kit)的一部分,可以从以下站点免费下载https://www.microsoft.com.映像管理器将允许您保存unattended.xml文件,并允许您使用新的应答文件重新打包安装映像(用于安装Windows)。在渗透式测试期间,您可能会在网络文件共享或本地管理员工作站上遇到应答文件,这些文件可能有助于进一步利用环境。如果攻击者遇到这些文件,以及对生成映像的主机的本地管理员访问权限,则攻击者可以更新应答文件以在系统上创建新的本地账户或服务,并重新打包安装文件,以便将来使用映像时,新系统可以受到远程攻击。
顾翔
2022/09/23
1.4K0
攻击本地主机漏洞(中)
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/08/03
9960
如何在 Linux 中创建带有特殊字符的文件?
如何在 Linux 中创建带有特殊字符的文件?
在 Linux 系统中,创建文件是进行各种操作的基础。有时候,我们需要创建带有特殊字符的文件,例如包含空格、特殊符号或非ASCII字符的文件。本文将详细介绍在 Linux 中如何创建带有特殊字符的文件,以便您能够轻松地完成这样的任务。
网络技术联盟站
2023/07/14
9310
如何在 Linux 中创建带有特殊字符的文件?
如何在网络中追踪入侵者(三):主机追踪
在之前的文章中,我们专注于追踪和分析从网络中得到的数据。但事实上,在网络中追踪不是唯一的选项。在企业的主机和服务器上有大量的数据集来发掘未知的恶意行为,包括运行的进程,活动的网络连接,监听端口,文件系统遗留,用户日志,自动运行等等。 而这些数据,难点只在于决定关注哪些点来开始你的追踪进程。一旦你决定关注的领域,你可以收集数据,查找可疑的异常,然后做进一步调查。 在这个系列的最后一部分,我们将会描述利用免费工具在主机上进行追踪的一些要点。这些技术首先会帮你发现主机上恶意行为的一些线索——不管你有没有签名或者I
FB客服
2018/02/08
1.2K0
如何在网络中追踪入侵者(三):主机追踪
Web浏览器中的JavaScript
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
7050
如何在 Linux 中设置主机名
设置主机名,设置主机名成功后,不要忘记也要在 hosts 文件中配置下 127.0.0.1.
HoneyMoose
2020/05/19
3.7K0
如何在 Linux 中设置主机名
如何在 Linux 中更改主机名?
在 Linux 系统中,主机名是用于标识和区分网络上的不同计算机的名称。默认情况下,Linux 发行版会分配一个主机名给您的计算机,但是有时候您可能需要根据自己的需求更改主机名。在本文中,我们将详细介绍如何在 Linux 中更改主机名,以及更改主机名后可能涉及到的其他配置。
网络技术联盟站
2023/06/09
9K0
如何在 Linux 中更改主机名?
如何在主机上调试容器、在容器中操作主机
老板有个奇怪的需求,通过一个 kubeconfig 文件,获取主机的各种状态信息,比如进程列表、进程状态等。
陈少文
2021/01/13
2.5K1
如何在主机上调试容器、在容器中操作主机
如何在浏览器中快速将网络资源传至 COS ?
COSBrowser Uploader 是一款浏览器的扩展程序,目前只支持 Chrome 浏览器。
wonders
2021/03/25
2.9K1
如何在浏览器中快速将网络资源传至 COS ?
如何在小程序中调用本地接口
如何在小程序中调用本地接口 背景: 随着微信小程序开始公测,我司也拿到了AppID,所以开始了微信小程序的趟坑之旅。 由于现在网上已经有很多的《微信小程序从精通到入门》的教程了,所以就不再重复那些,只是讲一下,在开发的过程中,如何使用本地(开发环境)的接口。 因为小程序的开发文档中写到了,wx.request 中的URL只能是一个https请求,本地一般来讲是不会有https的-.- 所以我们使用Charles代理来实现需求。 前提: 本人认为你现在已经具备以下几个条件: 具有微
贾顺名
2018/04/12
2.9K0
如何在小程序中调用本地接口
[教程]在带有vnc的kvm主机上重装windows原版系统
配置随意,系统需要为Windows,如果为linux请先DD为windows再进行继续操作
繁花云
2018/07/31
2.6K0
[教程]在带有vnc的kvm主机上重装windows原版系统
阶段六:浏览器中的网络
HTTP/1.0 关键词:多种类型文件、请求头和响应头、状态码、Cache 机制、用户代理
六个周
2022/10/28
3460
如何在Ubuntu 18.04上安装带有LEMP的WordPress
WordPress是互联网上最受欢迎的CMS(内容管理系统)。它允许您使用PHP处理在MySQL后端之上轻松设置博客和网站。WordPress已经看到了令人难以置信的运用,是一个快速启动和运行网站的绝佳选择。设置完成后,几乎所有管理都可以通过Web前端完成。
所有的酒都不如你
2018/10/10
1.2K0
如何在Ubuntu 18.04上安装带有LAMP的WordPress
WordPress是互联网上最受欢迎的CMS(内容管理系统)。它允许您使用PHP在MySQL后端上设置博客和网站。WordPress已经被大量采用,是一个快速启动和运行网站的绝佳选择。设置完成后,几乎所有管理都可以通过Web前端完成。
无敌小笼包
2018/07/26
2.6K0
如何在Ubuntu 18.04上安装带有LAMP的WordPress
如何在Chrome浏览器中运行Selenium?
测试系统是一项艰巨的任务,您需要一个可以在此过程中为您提供帮助的工具。Selenium就是这样一种工具,主要用于网站测试。在本文中,我将告诉您如何在Chrome浏览器中运行Selenium。
用户8460142
2023/07/07
6640
如何在Chrome浏览器中运行Selenium?
攻击本地主机漏洞(上)
翻译“CompTIA PenTest Certification All-in-One Exam Guide Exam2019.pdf” 第十章
顾翔
2022/09/23
1.2K0
攻击本地主机漏洞(上)
如何在CentOS 7上安装带有Caddy的WordPress
WordPress是受欢迎的内容管理系统(CMS)。 它可以用于快速,轻松地设置博客和网站,几乎所有的管理都可以通过Web界面进行。
子润先生
2021/06/15
1.9K0
点击加载更多

相似问题

通过sphinx搜索散列标签

10

如何在散列的散列中搜索某些键?

10

Twitter:散列标签搜索查询

34

散列标签、查询字符串和Ajaxified搜索结果

12

如何通过散列值在散列内的散列数组中进行搜索?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档