Oracle综合指数Performace

时间:2019-03-20 08:01:34

标签: oracle performance indexing query-optimization sql-tuning

我的示例oracle查询结构是这样的:

SELECT <LIST_OF_COLUMNS> FROM <TABLE_NAME>
WHERE COLUMN_01 = <SOMETHING> AND COLUMN_02 = <SOMETHING> AND COLUMN_03 = <SOMETHING>

该表有超过1百万条记录。我已经分别索引了COLUMN_01,COLUMN_02和COLUMN_03。上面的查询工作正常,并提供了预期的结果。

如果在不更改现有索引的情况下将COLUMN_01,COLUMN_02和COLUMN_03(WHERE子句中的所有列)作为复合索引,是否会提高性能?如果是这样,复合索引列是否有顺序?

如果我使用OR而不是AND这样的查询,它会提高性能吗?

SELECT <LIST_OF_COLUMNS> FROM <TABLE_NAME>
WHERE COLUMN_01 = <SOMETHING> OR COLUMN_02 = <SOMETHING> OR COLUMN_03 = <SOMETHING>

3 个答案:

答案 0 :(得分:1)

  

如果在不更改现有索引的情况下将COLUMN_01,COLUMN_02和COLUMN_03(WHERE子句中的所有列)作为复合索引,会改善性能吗?

可能是。满足所有WHERE标准的一个索引用作完整的访问路径,因此比单列索引访问路径更有效。优化程序选择一个索引,因此它将对所有符合(例如)COLUMN_02条件的行进行索引,并使用其他列的条件过滤这些行。

为提高性能而付出的代价是维护附加索引的开销。因此,您应该考虑是否需要所有三个单列索引(用于其他查询)。

  

复合索引列有命令吗?

是的。将它们按不同值的升序排列。前导索引列应是区别最小的列。尽管存在一些极端的情况,但拥有唯一的密钥作为前导列可能是一场灾难,因此请务必进行基准测试。

  

如果像该查询一样使用OR而不是AND,它将提高性能吗?

您将返回更多行,这本身就是更多工作。在这种情况下也很难使用索引,因此很可能会遇到全表扫描。但是为什么不尝试一下,看看会发生什么呢?

答案 1 :(得分:1)

  1. 如果您基于三列 AND 创建一个复合索引 您永远不会只使用WHERE中的一列查询表 子句,则不需要单列索引。否则 取决于哪些列参与查询。而这种情况应该 进行充分的分析和测试。

  2. 综合索引中的列顺序确实很重要。列应按唯一性排序,其中最不相同的列排在最前面。它有助于减少与查询谓词匹配的行数,从而提高性能。
    还应注意,Oracle可以对查询中的谓词不包含所有索引列的情况使用复合索引。

例如

create index idx1 on table_name (col1, col2, col3);

/*In this query Oracle can use index idx1 as a standard one-column index, 
  because col1 is the first column in the index*/
select * from table_name where col1 = 'some_value';

/*Here Oracle can still use the composite index, 
  but in this case it will use INDEX SKIP SCAN (assuming col1 equals ANY value),
  which reduces query performance comparing to an ordinary index*/
select * from table_name where col2 = 'some_value1' and col3 = 'some_value2';
  1. ORAND运算符在这里并不重要。更重要的是与给定谓词匹配的行数

答案 2 :(得分:1)

  

如果在不更改现有索引的情况下将COLUMN_01,COLUMN_02和COLUMN_03(WHERE子句中的所有列)作为复合索引,会改善性能吗?

对于此查询:可能。对于INSERT / UPDATE / DELETE:性能会下降。

因此,您需要衡量并查看某些查询中的改进是否可以证明其他查询中的恶化。

  

如果是这样,复合索引列是否有顺序?

不适用于此查询。如果您prefix-compress索引,则可以选择压缩效果最好的顺序,否则就没关系了。

但是,可能还有其他查询仅使用某些索引列,在这种情况下,您需要确保实际使用的列在索引的最前沿。

  

如果像该查询一样使用OR而不是AND,它将提高性能吗?

不。在这种情况下,需要有单独的索引(您已经拥有的索引)。