Answers:
是的,当您要查询部分索引时,就会有好处。如果首先使用部分谓词,则索引可用于涉及那些谓词但不是索引中所有列的查询。
另外,除非您有其他要求,否则可以将最有选择性的谓词放在首位,因为这样可以更快地减少索引查找操作。
IDX_2
根据表上查询的性质,您的情况不一定是多余的。但是,可能不必包括所有列。例如,如果您在之前进行了很多查询location
,date
那么IDX_2
可能有助于解决这些查询,因为IDX_1
顺序不正确。但是,您可能会发现在上item
是多余的IDX_2
。
从9i开始,Oracle引入了“跳过扫描”运算符,可在其中更有效地查询尾随索引列,从而减少了对此类补充索引的需求。
在更具体的情况下,如果您item
通过location
和查询并且date
不需要任何其他列,则可以通过索引完全解决查询,而不必从表中读取任何内容。您还可以构建包含未索引列的覆盖索引。如果可以从覆盖索引中解析所有需要的列,则查询根本不需要触摸主表。
最后,回答最后一个问题:如果您有一组经常使用的查询,这些查询正在消耗大量资源,并且可以使用索引进行调整,那么当然值得考虑。但是,维护索引会带来插入操作的开销,因此您必须权衡查询性能与索引在插入或更新操作上产生的开销。
要考虑的另一件事是具有很多空值的列。
如果这些列在索引中在它们之后指定了任何列,则必须索引空值。否则,像往常一样,不索引空值(当然,这是假设您正在使用b树索引)。
因此,如果您的列中包含大量的空值,则将它们放在索引的末尾可以节省大量磁盘空间。