如何管理索引?

Yaq*_*mad 6 index oracle sql-server

我试图了解如何为以下常见数据类型管理索引:1- 数字(整数、小数) 2- 字符串(Varchar、Char) 3- 日期时间

我有几个问题:

1-How the indexes are stored for different data types?例如,如果有像 (100, 101, 100, 900, 700) 这样的数字数据和像 (AAA,BBB,CCC,AAA,ABC) 这样的字符串数据,numericcolumn 和 stringcolumn 索引如何将这些数据存储在磁盘上?

2-Is there any different between the retrieval of a Numeric & String indexes?例如,如果我在 numericIndexed 列和 sringIndexes 列上尝试 SELECT 语句,它们是如何检索的?

3- SQL Server 和 Oracle 存储的索引是否不同?或者他们使用相同的逻辑?问候。

gbn*_*gbn 10

对于 SQL Server,除了行标题之外,索引条目的存储方式与普通记录几乎相同。此外,索引和记录条目永远不会在同一页面上

现在,我添加的任何内容都是由比我更聪明的人复制/粘贴的文章,因此我将向您推荐 Paul Randal:存储引擎内部:记录剖析

此外,SQL Server 中的所有索引都是 B-Tree。SQL Server中带有聚集索引的表与Oracle索引组织表相同

至于 SELECT,您必须考虑索引是否通常是“覆盖”的。这意味着整个 SELECT 只能从索引中得到满足。否则它可能不会被使用或生成密钥查找。有关更多信息,请参阅


Nia*_*eld 8

在不同的数据库系统中有许多不同的索引类型,出于本回复的目的,尽管我主要会向您介绍有关B 树索引的维基百科讨论,因为这几乎可以肯定是您所指的索引类型。(请注意评论者我知道树不是严格的 b 树,但这对本次讨论无关紧要)这种类型的索引将由 sql 语句创建,例如

create index idx_t1_c1 on t1(c1);
Run Code Online (Sandbox Code Playgroud)

在 B 树索引中,数据存储在有序树中,其中最高(或根)页面只有指向较低级别分支的指针,而较低级别分支又具有指向较低分支或最低级别页面(或块)的指针持有指向包含索引值的行的表页的指针。通过索引检索索引数据就变成了通过指针从根向下遍历树,一直到包含您感兴趣的值的叶子的问题。如果然后,您需要转到您可以直接访问所需页面的表格,而不必扫描整个表格。这种机制完全独立于索引列的数据类型。Oracle 和 SQL Server 的内部结构不同并且受到知识产权保护,但逻辑本质上是相同的。效率之所以高是因为通常索引的深度会非常低(对于绝大多数典型的段大小为 2 或 3 个级别),并且包含感兴趣值的叶子数量也很少,因此您可能能够过滤对于您感兴趣的数据,只需执行少数 I/O 操作,而不是扫描整个对象。

如果您真的对磁盘存储感兴趣,那么可以使用以下命令将页面的表示转储到磁盘以供检查。如果您这样做并且对某些正规信息技术教育中的数据结构不是很熟悉,您可能会后悔:)

ALTER SYSTEM DUMP DATAFILE <n> BLOCK MIN <x> MAX <y> ; -- oracle file n, block x->y
DBCC PAGE (DBID,FILENUM,PAGENUM,<LEVEL>); -- mssql  -- level 0 to 3 increasing detail
Run Code Online (Sandbox Code Playgroud)