集群索引与非集群索引的成本
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 页数据加上索引开销。
我从一本 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 页数据加上索引开销。