我从我正在阅读的SQL和数据库书中看到了一个练习,我对如何计算I / O中的聚簇索引与非聚簇的成本感到困惑。例如:
R在R.a
上有一个非custering指数:
20.000行
1000页(内存)大小
R.a
有20个唯一值
S在S.c
上有一个custering指数:
40.000行
400页(内存)大小
S.c
有200个唯一值
如果我从R中选择*,其中R.a = 100
I / O的成本是多少?
如果我从S中选择*,其中S.c = 50
I / O的成本是多少?
如何计算成本呢?
答案 0 :(得分:2)
你可以做一些假设和猜测。对于此查询:
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页数据加上索引开销。