создание функционального индекса с предложением order by в oracle - PullRequest
0 голосов
/ 15 июня 2011

Мне нужно создать заказ по индексу на столе

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

Я хочу запросить что-то вроде

SELECT * 
  FROM student 
 WHERE stream = 'science'

Ожидаемым результатом будут студенты, расположенные в порядке убывания их ранга. Требование заключается в том, что я не могу указать порядок по предложению в самом запросе.

Это должно быть достигнуто с помощью индекса on (stream, order by class_rank desc). Это достижимо в оракуле?

Ответы [ 2 ]

4 голосов
/ 15 июня 2011

Если вы не укажете предложение ORDER BY, Oracle не гарантирует порядок, в котором возвращаются строки. Требование не имеет смысла.

Возможно, вам повезет, и вы обнаружите, что Oracle выбирает план запроса, который возвращает строки в нужном вам порядке. Но это было бы вопросом удачи - Oracle может выбрать другой план запросов завтра, или обновление версии Oracle может привести к изменению результатов. Например, люди, которые годами полагались на предложение GROUP BY, упорядочивая результаты в качестве побочного эффекта, были огорчены, когда в новую версию Oracle добавлен более эффективный алгоритм группировки, который не имел побочного эффекта упорядочения результатов.

0 голосов
/ 16 июня 2011

Я получил это работает

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

так, когда я запускаю выборку * от студента, где поток =? запрос по вышеуказанному индексу будет использован и он вернет мне желаемый результат.

и я думаю, что это почти всегда безопасно, если я не обновляю oracle. и даже после обновления вероятность того, что oracle изменит способ выбора индексов, очень мала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...