在oracle中使用order by子句创建功能索引

时间:2011-06-15 05:22:09

标签: sql oracle oracle10g indexing

我需要在表格上按索引创建订单

Student (
  roll_No, 
  name, 
  stream,
  percentage, 
  class_rank, 
  overall_rank  )

我希望查询类似

的内容
SELECT * 
  FROM student 
 WHERE stream = 'science'

预期结果将是学生按其排名降序排列。要求是我不能在查询本身中指定order by子句。

这应该通过索引来实现(流,按class_rank desc排序)。这在oracle中是否可以实现?

2 个答案:

答案 0 :(得分:4)

如果未指定ORDER BY子句,则Oracle不保证返回行的顺序。这个要求没有意义。

您可能会很幸运,并且发现Oracle选择的查询计划恰好按您想要的顺序返回行。但这应该是运气问题 - 甲骨文明天可以选择不同的查询计划,或者Oracle版本升级可能会产生结果变化。例如,当新版本的Oracle添加了一个更有效的分组算法而没有排序结果的副作用时,依赖于GROUP BY子句将结果作为副作用排序多年的人们感到很苦恼。

答案 1 :(得分:0)

我得到了它的工作

  CREATE INDEX stream_rank_idx  ON Student (stream,class_rank desc);

所以什么时候我从学生那里开始选择*,其中stream =?查询上面的索引将被使用,它将返回我想要的结果。

我认为如果我不升级oracle,它几乎总是安全的。甚至在升级之后,oracle将改变索引选择方式的可能性非常低。