0

我被分配了以下查询以及如何通过创建索引来优化它们:

a)SELECT EmployeeID FROM Employee WHERE Name='John'AND Surname='Brown'

b)SELECT EmployeeID FROM Employee WHERE Salary=1300

c)SELECT EmployeeID FROM Employee WHERE Salary BETWEEN 1000 AND 1500

d)SELECT EmployeeID FROM Employee WHERE Salary+Bonus>1500

从表 Employee:EmployeeID、Name、Surname、Salary、Bonus

我已经说过,对于第一个 a) 复合索引是最好的,第二个索引更好,第三个是分区的,第三个是分区的,并且某种聚集在(我不确定我的选择是否可以请验证它们并纠正我,因为我是新手。Psindexes 最好在 Oracle 中。提前致谢。

4

2 回答 2

3

对于第一个 a) 最好使用复合索引

在哪些列上?姓氏+名字,名字+姓氏?顺序可能很重要。在这种情况下,它可能根本不重要,但通常您要考虑整个应用程序,并考虑您通常如何进行查找。例如,如果您有另一个仅按姓氏查找的查询,您可能希望确保将姓氏列放在索引中的第一个位置,以便该索引对两个查询都有效。过度索引几乎与索引不足一样对性能不利。

第二个集群更好

同样,您在选择索引时需要考虑整个表/应用程序。一张表只能有一个聚集索引。您的一个聚集索引很可能需要位于 EmployeeID 列上。即使我们在这里没有看到任何使用它的查询,这也是最常见的需求。在这里,工资的常规索引可能就足够了。

为第三个分区

一个定期的薪水指数可能就足够了。数据库将能够转到第一条记录,然后“遍历索引”直到不再匹配。但这取决于表的大小......如果表很大(进入数百万行的 10 到 100 行),分区是有意义的(通常在表本身上)。我不知道有多少企业拥有数以千万计的员工。同样,我们想要做的一件事是避免过度索引,因此重用 b) 中的相同索引是好的。

某种聚集在(d

这取决于数据库引擎和版本,但任何索引本身都不太可能有助于此查询。原因是表达式通常不是 sargable,这意味着查询优化器不够聪明,无法知道索引是否有效。您可以做的是创建一个计算列 虚拟列并在该列上放置一个索引。

在所有情况下,由于您只请求 EmployeeID 列,因此您希望将 EmployeeID 添加到索引中,但实际上并不对该字段进行索引。只需包含索引的列。通过这种方式,数据库将能够完全从索引中完成您的查询,而无需返回表。只包含列而不是对其进行索引的原因是为了提高 INSERT/UPDATE 语句的性能,以避免需要重建索引。

于 2013-11-10T18:34:01.030 回答
2

对于 d) 基于函数的索引 (FBI) 将是合适的:

CREATE INDEX emp_i3 ON Employee (Salary+Bonus);
于 2013-11-10T23:29:33.727 回答