Порядок сортировки индекса Oracle и присоединение - PullRequest
3 голосов
/ 06 декабря 2010

У меня есть 2 таблицы, которые представляют собой несколько миллионов строк с индексами. Я ищу, чтобы преобразовать один из индексов в DESC для оптимизации некоторых операций. Однако повлияет ли это на скорость соединения или другие оптимизации?

Например:

Table A:<br> a_id (pk)<br></p> <p>Table B:<br> b_id (pk)<br> a_id (fk)

Если A.a_id хранится как DESC, а B.a_id хранится ASC, возникнут ли у меня какие-либо проблемы или медлительность при соединениях? Сможет ли oracle использовать индексы для объединения, даже если у них разные порядки сортировки? Должен ли я сделать B.a_id DESC также или создать второй индекс, который является DESC? Очевидно, я хотел бы провести простой эксперимент, но у меня нет доступа к DBA или запасной версии оракула для работы.

Ответы [ 6 ]

4 голосов
/ 06 декабря 2010

Оракул сможет использовать индексы для вступления, даже если у них есть разные порядки сортировки?

Индексы не используются "для объединения". Они используются для доступа к данным. Созданные таким образом источники строк затем объединяются. Единственная причина, по которой я могу думать о том, что порядок сортировки индекса будет иметь какое-либо влияние на объединение, заключается в том, что происходит объединение слиянием и используется индекс, чтобы избежать сортировки. В этом случае влияние перехода на нисходящий индекс может заключаться в том, что данные должны быть отсортированы в памяти после обращения к ним; или не может быть, если оптимизатор достаточно умен, чтобы просто проходить эти данные в обратном порядке при выполнении слияния.

Если у вас есть запросы, планы выполнения которых основаны на использовании индекса A.A_ID для получения данных в порядке возрастания (либо для целей объединения слиянием, либо для удовлетворения запрошенного порядка результатов), измените индекс на нисходящий порядок может оказать влияние.

Редактировать: Только что сделал быстрый тест на некоторых данных образца. Похоже, что оптимизатор имеет возможность объединять источники строк, сортируя их в противоположных порядках, не прибегая ни к одному из них. Таким образом, на самом очевидном уровне, когда один индекс возрастает, а другой убывает, не должно вызывать серьезных проблем с производительностью. Тем не менее, похоже, что нисходящие индексы могут оказывать другое влияние на план выполнения - в моем случае восходящий индекс использовался для быстрого полного сканирования, а нисходящий - для сканирования диапазона. Это может привести к изменениям в производительности запросов - хорошо или плохо - но единственный способ узнать наверняка - это проверить его.

2 голосов
/ 07 декабря 2010

Oracle реализует индексы в виде двусвязных списков, поэтому не имеет значения, определяете ли вы индекс ASC или DESC для одного столбца.

DESC-индексы - это особый случай, который помогает, когда у вас есть многостолбцовый индекс, например, если у меня есть запрос, который часто упорядочивает по colA ASC, colB DESC, то я могу решить добавить индекс (colA, colB DESC), чтобы избежать сортировки.

0 голосов
/ 29 апреля 2015

Вообще говоря, индекс может выполнять сканирование в порядке asc / desc, поскольку двух указателей в структуре индекса достаточно для идентификации конечных блоков и соответствующих блоков при выполнении сканирования на основе порядка asc / desc без сортировки в памяти.

Однако, если мы создадим индекс с определением столбца desc, его структура будет намного больше, чем нормальный индекс, так как нормальный индекс имеет 90-10 разделений (увеличивающиеся идентификаторы строк), где в качестве индекса desc будет 50-50 разделений иприведет к неиспользуемому пространству и кандидату для перестроения, что потребует дополнительного обслуживания и дополнительных затрат.

Индексы DESC могут быть полезны, когда у вас есть индекс с несколькими столбцами, где один столбец необходим в asc, а другой - в дескриптор.избегать сортировки в памяти.

0 голосов
/ 06 декабря 2010

Ранняя оптимизация - пустая трата времени.Просто оставьте эту проблему и сделайте следующее.Когда в этой таблице 100 миллионов строк, измените индексы и проверьте, что происходит, до тех пор ваши десять строк данных не будут тратить время на «оптимизацию».

0 голосов
/ 06 декабря 2010

Разработка без системы разработки и тестирования? Ваш ответ - развиваться с одним. Oracle поставляется на всех платформах, просто установите, добавьте данные, делайте свою работу.

Для вас просто живите опасно и меняйте индекс, кого волнует, что произойдет. Возьми это медное кольцо. Так ты скучаешь. Вы не потеряете данные.

0 голосов
/ 06 декабря 2010

Я не уверен, что получил то, что вы пытаетесь спросить - вы не можете «хранить» в порядке убывания или возрастания. Вы можете получить результаты запроса и упорядочить его, используя предложение ORDER BY, которое отсортирует результирующий набор в порядке возрастания или убывания.

Нет никакой гарантии, что вы вставляете какие-либо данные в порядке возрастания или убывания.

Следовательно, «порядок», по которому он вставлен, не будет иметь никакого отношения к исполнению, потому что нет порядка

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