我一直在做一些测试,试图更好地理解 SQL Server 如何使用直方图来估计与等式谓词以及 < 或 > 谓词匹配的行数
鉴于我正在使用AdventureWorks2016 OLTP 数据库
如果能够理解SQL Server对=和>谓词的估计过程:
/* update stats with fullscan first */
UPDATE STATISTICS Production.TransactionHistory WITH FULLSCAN
Run Code Online (Sandbox Code Playgroud)
然后我可以看到该列的直方图TransactionHistory.Quantity
DBCC SHOW_STATISTICS (
'Production.TransactionHistory',
'Quantity')
Run Code Online (Sandbox Code Playgroud)
下面的屏幕截图是我运行测试的直方图的顶端:
以下查询将估计 6 行,因为谓词中的值是 RANGE_HI_KEY,因此对该存储桶使用 EQ_ROWS:
SELECT *
FROM Production.TransactionHistory
WHERE Quantity = 2863
Run Code Online (Sandbox Code Playgroud)
以下将估计 1.36 行,因为它不是 RANGE_HI_KEY,因此使用 AVG_RANGE_ROWS 作为它所属的存储桶:
SELECT *
FROM Production.TransactionHistory
WHERE Quantity = 2862
Run Code Online (Sandbox Code Playgroud)
以下“大于”查询将估计 130 行,这似乎是 RANGE_HI_KEY > 2863 的所有存储桶的 RANGE_ROWS 和 EQ_ROWS 之和
SELECT *
FROM Production.TransactionHistory
WHERE Quantity > 2863 …Run Code Online (Sandbox Code Playgroud) statistics database-internals sql-server-2016 cardinality-estimates
我正在阅读检查宽表是否为空的问题,我想知道是否有可能以某种方式直接访问一行的NULL 位图以快速检查一行是否包含 NULL 值。那会是一种可靠的技术吗?
(根据我的阅读,自 SQL Server 2008 以来新引入的 SPARSE 列可能存在问题,但不能确定。)
如果我有一个包含许多索引的表,并且我运行了一个将行插入到表中的语句,SQL Server 是一次插入一个行,还是使用并行性插入行?
我想估计使用 B-tree 方法需要多少次读取 PostgreSQL 的部分索引,因为我无法直接更改块大小。PostgreSQL 手册关于这里的索引和这里关于块大小的信息,对于 aux 来说是 100,所以有 3 次读取。
块大小占用的默认内存为 8 KB,即通常为 1 个块,但我不确定这是否可行,因为它log_1(2)是无穷大。我的想法是动态计算的读取次数也可能在PostgreSQL的这里考虑的B树块尺寸决定读取次数。我想知道块大小log_b n中b有多少:块大小在哪里n,事件数在哪里。我认为它在数学上不可能是一个。我认为 Postgres B-tree 是按照 Wiki 页面中描述的标准方式实现的,也由 Cormen 等人描述。
基于此答案,B 树索引仅包含 PostgreSQL 中的键。然后数据再次位于作为逻辑堆的表中。索引的重点是存储密钥。数据位于表中,表是基于here 的逻辑堆。我对 PostgresSQL 如何创建名为 B-tree 的实体感兴趣。基于此处,B 树索引和表的物理存储使用相同的数据页,并且页面布局几乎相同。但是,我对这个实体如何协同工作很感兴趣。索引和数据的功能大概可以这样描述:
B 树从根生长,而不是从叶子生长。
但更准确地说,来自 Sumathi 关于关系数据库管理系统的基础知识(计算智能研究):
在 B 树中,非叶节点比叶节点大。指向数据记录的指针存在于树的所有级别。
在 B+tree 中,指针只存在于叶子上。你如何评估 B 树的指针系统?您如何描述 PostgreSQL B 树占用的大 O 空间?Postgres 是如何制作 B 树索引的?
我只是想知道:
两者都是聚簇表(不是堆)。
我有一个查询应用程序使用文本字段扫描整个表格。
该查询正在执行以下多次读取:
扫描计数 1、逻辑读取 170586、物理读取 3、预读读取 174716、lob 逻辑读取 7902578、lob 物理读取 8743、lob 预读读取 0。
如果我从选择中删除文本字段,则读数将变为以下内容:
扫描计数 1、逻辑读取 170588、物理读取 0、预读读取 0、lob 逻辑读取 0、lob 物理读取 0、lob 预读读取 0。
我不明白的是 lob 读取是如何工作的:
如果我用 lob 逻辑读取来总结逻辑读取,我总共得到8.073.164 逻辑读取,如果我是正确的,大约是 64GB。
但整个数据库只有7GB!
我可能遗漏了一些有关添加逻辑读取和 lob 逻辑读取的信息。
lob 逻辑读取数实际代表什么?
我有一个具有三个叶级别的三列 ( int, smallint, smallint) 复合聚集索引。我的问题是 SQL Server 如何以及何时为同一索引创建多个叶级别 (index_level 0)。
我遇到了性能问题,并且不能avg_page_space_used_in_percent超过 70%(叶页数 1200,填充因子 80)。
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64)
Apr 22 2011 19:23:43
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7600: )
Run Code Online (Sandbox Code Playgroud) 我正在阅读关于如何根据 m_indexId 计算分配单元 ID的文章http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-how-are-allocation-unit-ids-calculated/和 m_objID。然后我通过执行以下命令在我的数据库之一上尝试:
DBCC TRACEON(3604);
DBCC PAGE (UFDATA_008_2013, 1, 73057, 3);
GO
Run Code Online (Sandbox Code Playgroud)
输出结果是:
PAGE HEADER:
Page @0x10008000
m_pageId = (1:73057) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 1913890731 m_indexId (AllocUnitId.idInd) = 0
Metadata: AllocUnitId = 406903719657472 Metadata: PartitionId = 406903719657472
Metadata: IndexId = 1 Metadata: ObjectId = 1913890731 m_prevPage = (1:92774)
m_nextPage = (0:0) pminlen = 11 m_slotCnt = 61
m_freeCnt = 3241 m_freeData = …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下为什么以下内容没有被缓存
use AdventureWorks2014
go
DECLARE @id INT=43865
SELECT
sp.[BusinessEntityID]
, so.salesorderid
FROM sales.salesorderheader so JOIN sales.salesperson sp
ON sp.[BusinessEntityID] = so.salespersonid
WHERE so.salesorderid = @id
Run Code Online (Sandbox Code Playgroud)
每次我使用不同的参数执行上述查询时,它都会在计划缓存中创建一个条目
顺便说一下,优化临时工作负载已设置
谢谢
撇开笑话不谈,什么是“混淆密钥”?我只是要离开文档。
sys.sysclsobjs存在于每个数据库中。每个分类实体包含一行,这些实体共享相同的公共属性,包括以下内容:...
混淆密钥。
这似乎涉及
Content/binn/sqllang.dllContent/binn/sqlmin.dll我想知道密钥的作用和被混淆的内容,以及是否可供用户使用。