将索引添加到具有标志值的列

时间:2018-01-22 15:20:44

标签: oracle performance sql-tuning

我是调整oracle查询的新手,因此需要帮助。

如果我有像以下的SQL查询:

select a.ID,a.name.....
   from a,b,c
   where a.id=b.id
   and ....
   and b.flag='Y';

然后将索引添加到表b的FLAG列帮助以任何方式调整查询? FLAG列只有2个值Y和N

2 个答案:

答案 0 :(得分:2)

使用标准btree索引,SQL引擎可以根据其二进制结构快速找到指定值的索引中的一行或多行,然后使用存储在索引中的物理地址(rowid)来访问所需的行在第二跳。这就像在书的索引中查找页码一样。那就是:

  1. 使用您要查找的键值转到索引。
  2. 索引会告诉您表格中的实际地址。
  3. 直接去那个实际地址。
  4. 对于像独特的客户ID这样的东西,这很好用。虽然数据库必须通过索引条目并且每个都要转到指定的地址,但是对于非唯一的东西,例如订单表中的客户ID,它仍然可以。这仍然比从上到下穿过整个桌子更快。

    但是对于只有两个不同值的列,您可以看到,例如'Y'的所有索引条目将会更多地工作,并且每个索引到达指定的位置表格,只是忘记索引并一次扫描整个表格。

    除非价值分布不均匀。如果有一百万Y行和十N行,那么索引可以帮助您快速找到N行,但对Y没用。

答案 1 :(得分:0)

将索引添加到只有2个值的列通常不是很有用,因为Oracle也可以执行全表扫描。

从您的查询看,在id上设置索引会更有用,因为这有助于加入a.id=b.id

如果您真的想进入调优,那么请学会使用“explain plan”,因为这样可以告诉您Oracle需要为查询做多少工作。添加(或删除)索引,然后重新运行解释计划。