我在数据库管理课程中正在做一些问题设置,但无法弄清楚这个特定问题。
我们具有以下关系:
Emp (id, name, age, sal, ...)
以及以下查询:
SELECT id
FROM Emp
WHERE age > (select max(sal) from Emp);
然后我们应该选择一个索引,它将成为一个很好的查询优化器。我的答案是只使用Emp(age)
,但问题的解决方案是
Emp(age)
&
Emp(sal)
为什么会有2个索引?我似乎无法确定为什么您需要的不仅仅是age属性。
答案 0 :(得分:1)
您需要两个索引才能获得最佳性能
1)子查询(从Emp中选择max(sal))将从索引Emp(sal)中受益,因为在树索引上,检索max会更快
2)外部查询需要对Emp(age)进行过滤,因此也可以从树索引中受益
答案 1 :(得分:1)
当然,您意识到查询是荒谬的,将age
与sal
(可能是薪水)进行比较。也就是说,两个索引适用于:
SELECT e.id
FROM Emp e
WHERE e.age > (select max(e2.sal) from Emp e2);
我添加了表别名以强调查询两次引用了Emp
表。
要从表中获取最大的sal
,您需要在emp(sal)
上建立索引。最大值是一个简单的索引查找操作。
然后,您要将其与age
进行比较。好吧,为了与age
进行比较,您需要在emp(age)
上建立索引。这是对emp
的完全独立引用,没有对sal
的引用,因此您不能将两列放在一个索引中。
可能不需要age
上的索引。查询可能返回很多行-返回很多行的表通常不能从二级索引中受益。可以从索引中受益的一种情况是,如果age
是聚集的索引(即,通常是主键中的第一列)。但是,我不建议使用这种索引结构。