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

复制
相关文章
无法在此iPhone上激活Touch ID,怎么解决?
Touch ID是苹果公司的指纹识别功能,允许用户解锁iPhone或iPad、在苹果商店购物,以及在应用程序中验证Apple Pay等等。
莉莉的碎碎念
2021/09/10
6.1K0
无法在此iPhone上激活Touch ID,怎么解决?
适当愉悦,自建 Minecraft 服务器
本文主要介绍自建 Minecraft 服务器的方法,可以使用提供的公有云服务,Minecraft 对虚拟机配置需求如下:
宋天伦
2020/07/16
7.1K1
适当愉悦,自建 Minecraft 服务器
Python 数组操作_python中数组的表示形式
在python中本身有着列表等数据结构,但是列表只是一种数据的存储容器,不具备任何计算能力。
全栈程序员站长
2022/09/22
3K0
Python 数组操作_python中数组的表示形式
【平面解析几何】直线方程的表示形式
表示与 轴、 轴相交,且与 轴截距为 、与 轴截距为 的直线
攻城狮杰森
2022/06/03
1.8K0
springboot的资源请求验证
基于SpringBoot的资源请求验证(Aspectj和Interceptor两方式实现)附JWT验证token 前言 ​ 在项目中,我们需要对前端请求的资源进行验证,判断是否具有相应的权限。比如某写资源只有在登录之后才有请求权限。本章以请求之前是否登录为权限。
崔笑颜
2020/06/08
8570
VS2010 \...\bin\rcdll.dll 无法找到资源编译器
版权声明:本文为博主原创文章,未经博主允许不得
acoolgiser
2019/01/16
1.3K0
用文字云的形式表示什么款式最畅销
前一文我们讲述了两种在Power BI中展示Top款的方式,我们有时候其实不需要具体的数字,只需直观感受,例如如下这种:
wujunmin
2021/09/07
8810
用文字云的形式表示什么款式最畅销
图解计算机中数据的表示形式
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2021/02/05
3K0
图解计算机中数据的表示形式
VirtualBox克隆后无法找到网卡的问题
Virtualbox现在更新到了4.1.6版本,我记得在之前的版本中,镜像的克隆只能通过命令行的方式来进行,现在已经可以通过界面来进行克隆了,可以说非常的方便。
大江小浪
2018/07/25
1.3K0
VirtualBox克隆后无法找到网卡的问题
skywalking根据文本信息找到对应的请求
在定位问题的时候,有时候需要找到导致问题出现的那个请求,比如下单。但是只有订单号,怎么去找呢? 目前我们一般是根据下单时间,然后再根据时间去找对应的请求,但是请求很多,需要一个一个打开请求内容去定位该订单的下单请求。 本文使用脚本的方式方便快速定位到对应的请求 根据时间和接口名称获取批量请求 获取批量请求 curl 'http://sky.fy.qq.com/graphql' \ -H 'Content-Type: application/json;charset=UTF-8' \ --dat
十毛
2021/11/24
6070
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
 原因:命令行执行策略,默认设置为Restricted不加载配置文件或运行脚本。需变更设置为RemoteSigned
超级小的大杯柠檬水
2023/05/06
1.4K0
VSCode 无法加载文件 ······,因为在此系统上禁止运行脚本
C++核心准则E.19:如果无法选择适当的资源句柄,使用final_action表现清除处理​
finally is less verbose and harder to get wrong than try/catch.
面向对象思考
2020/08/10
5570
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
执行命令行set-ExecutionPolicy RemoteSigned 选y 即可
kirin
2021/02/26
7.1K0
解决 cnpm : 无法加载文件 因为在此系统上禁止运行脚本
如何找到自己的服务器
4.点击自己云服务器的实例id后,就可以看见服务器的基本信息、弹性网卡、安全组等等。
逸轩
2021/09/16
6.9K0
无法转换为内部表示
系统查询表记录时出现“java.sql.SQLException: 无法转换为内部表示”异常,抛出的异常信息如下:
程序新视界
2022/11/30
7040
修复WebView资源未找到导致的崩溃问题
近期 应用新增了很多的崩溃,分析特征,发现崩溃集中在5.0-5.1.1系统上,崩溃的日志如下
技术小黑屋
2020/11/10
2.5K0
linux上找到可用的网络接口
在 Linux 中查找可用的网络接口 我们可以通过几种方式找到可用的网卡。在本指南中,我们将讨论列出 Linux 中网络接口卡的 10 种方法。 1. 使用 ifconfig 命令列出网络接口 使用ifconfig命令查找网络接口详细信息的最常用方法。我相信一些 Linux 用户可能仍在使用它。 $ ifconfig -a enp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 24:b6:fd:37:8b:29 txqueuelen 1000 (Eth
入门笔记
2022/06/02
2.4K0
无法为 WSDD 操作找到匹配的 Java 操作
我发现了错误。 只需要把“AndrQues”改成“andrQues”,程序就可以正常运行了。
matinal
2023/10/13
1960
Ajax请求($.ajax())中data属性传参数的形式
实现Ajax提交数据进行请求,其中data属性设置传参的方法有好几种形式,如下: //第一种写法(把参数拼接在URL中,data属性设为空{ })
PM吃瓜
2019/08/12
3.9K0
点击加载更多

相似问题

而网络报废这个错误显示是不可接受的!无法在此服务器上找到所请求资源的适当表示形式。

19

无法接受在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的

116

在此服务器上找不到所请求资源的适当表示形式。此错误是由Mod_Security生成的。

33

Django -未找到在此服务器上找不到请求的资源

146

获取此错误:源服务器未找到目标资源的当前表示形式,或不愿透露存在此表示形式。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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