простой вопрос о показателях оракула - PullRequest
0 голосов
/ 03 июня 2010

Если у меня есть запрос оракула, как показано ниже:

SELECT * FROM table_a where A = "1", B = "2", C = "3"

для этого запроса, чтобы получить один из индексов table_a ... должен ли индекс быть во всех 3 из этих столбцов?

Я спрашиваю:

  1. Что, если индекс находится на A, B, C, D?

  2. Что, если индекс находится на B, C?

  3. Будет ли индекс выбираться только тогда, когда это на A, B, C?

1 Ответ

5 голосов
/ 03 июня 2010

Oracle Cost Based Based Optimizer (CBO) пытается выбрать самый дешевый путь доступа к таблице. Пути доступа к одной таблице включают сканирование диапазона индекса, полное сканирование индекса и полное сканирование таблицы; CBO оценит стоимость каждого из этих планов и выберет план с наименьшей стоимостью.

1. Что если индекс находится на A, B, C, D?

да, Oracle может использовать этот индекс - и стоимость может быть довольно низкой, поскольку в вашем запросе ограничены ведущие столбцы (3 из них) индекса.

2. Что если индекс находится на B, C?

да, Oracle может использовать этот индекс - и стоимость может быть довольно низкой, поскольку все столбцы индекса ограничены в вашем запросе.

3. Будет ли индекс выбираться только когда он находится на A, B, C?

нет, это не исключение. да, Oracle может использовать этот индекс - и стоимость может быть довольно низкой, поскольку все столбцы индекса ограничены в вашем запросе.

Другие факторы, которые следует учитывать:

  • Ваш запрос выбирает * (все столбцы) из таблицы. Если в таблице только четыре столбца (A, B, C, D), CBO, вероятно, предпочтет план, полностью удовлетворяющий запросу по индексу (A, B, C, D), не обращаясь к таблице вообще.
  • вы не задали более интересный вопрос: « Что, если индекс находится на D, C, B, A? » - ответ на этот вопрос - да, Oracle может использовать индекс (например, с полным сканированием индекса или сканированием с пропуском индекса). Просто думал, что я добавлю это туда:)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...