集群索引与非集群索引的成本

Cost of clustering index vs non-clustering

我从一本 SQL 和我正在阅读的数据库书籍中看到了一个练习,我对如何计算 I/O 中聚类索引与非聚类索引的成本感到困惑。例如:

R 在 R.a 上有一个非聚集索引:
20.000 行
1000 页(内存)大小
R.a 有 20 个唯一值

S 在 S.c 上有聚类索引:
40.000 行
400 页(内存)大小
S.c 有 200 个唯一值

如果我从 R.a = 100 中的 R 选择 *,I/O 中的成本是多少?

如果我选择 * from S where S.c = 50 I/O 的成本是多少?

如何计算该费用?

你可以做一些假设和猜测。对于此查询:

select r.* from R where R.a = 100

首先你要算出有多少条记录,然后算出多少页。假设有 20 个值 然后 假设值的分布是均匀的,那么大约 1/20 的记录将匹配。每页包含大约 20 条记录(20,000 行/1,000 页)。因此,无需进行复杂的统计,每个页面上大约有一条匹配记录。

因此,I/O 开销大约是 1,000 页加上索引所需的内容。

第二个查询需要读取大约1/200条记录,即大约200条记录。一页包含 100 条记录。但是,索引是聚集的,所以 200 条记录不是随机分布的;它们都在相邻的页面上。一页恰好从给定值开始是值得怀疑的,所以我们称这 3 页数据加上索引开销。