Oracle - Как получить информацию о полях индекса и т. Д. - PullRequest
9 голосов
/ 23 марта 2011

Как я могу перечислить столбцы индексов, легко определенные в Oracle?

И как мне использовать эти индексы в операторе выбора? Что-то вроде:

SELECT x, y, z FROM a WITH INDEX(x)...

Ответы [ 6 ]

14 голосов
/ 23 марта 2011

Как я могу перечислить столбцы индексов, легко определенные в Oracle

SELECT *
FROM all_ind_columns
WHERE table_name = 'YOUR_TABLE'

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/statviews_1064.htm#i1577532

Как использовать эти индексы в операторе выбора

Вам не нужно ничего делать. Если индекс ускорит запрос, Oracle будет использовать его автоматически.

4 голосов
/ 13 апреля 2016

Этот запрос также показывает выражение столбца для индексов на основе функций, если они есть:

SELECT
 i.table_owner,
 i.table_name,
 i.index_name,
 i.uniqueness,
 c.column_name,
 f.column_expression
FROM      all_indexes i
LEFT JOIN all_ind_columns c
 ON   i.index_name      = c.index_name
 AND  i.owner           = c.index_owner
LEFT JOIN all_ind_expressions f
 ON   c.index_owner     = f.index_owner
 AND  c.index_name      = f.index_name
 AND  c.table_owner     = f.table_owner
 AND  c.table_name      = f.table_name
 AND  c.column_position = f.column_position
WHERE i.table_owner LIKE UPPER('%someuserpattern%')
 AND  i.table_name  LIKE UPPER('%sometablepattern%')
ORDER BY i.table_owner, i.table_name, i.index_name, c.column_position
1 голос
/ 23 сентября 2016

Как писал HorseWithNoName, вы можете использовать all_ind_columns.

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

Вы можете увеличить определенный индекс с:

SELECT * FROM all_ind_columns
WHERE table_name = 'TABLE_NAME'
and index_name = 'INDEX_NAME'
order by Column_position

Я не согласен с "Вам не нужно ничего делать .." Слишком часто я вижу запросы, написанные как:

WHERE Trim(LastName) ='SMITH'
WHERE LastName like '%SMITH%'
WHERE trunc(CreationDate) = date'2016-09-23'

Даже если столбцы LastName и CreationDate проиндексированы, Oracle НЕ сможет их использовать.

Пиши

WHERE LastName like 'SMITH%'
WHERE CreationDate between date'2016-09-23' and date'2016-09-24'
1 голос
/ 21 мая 2014
SELECT table_name AS TABELA,
  index_name      AS INDICE,
  column_position AS POSICAO,
  column_name     AS COLUNA
FROM dba_ind_columns
WHERE (TABLE_OWNER LIKE upper('%&proprietario.%'))
AND (table_name LIKE upper('%&tabela.%'))
ORDER BY TABELA,
  INDICE,
  POSICAO,
  COLUNA;
1 голос
/ 23 марта 2011

Если вы хотите принудительно использовать определенный индекс, вы бы добавили подсказку к вашему запросу:

select /*+ index(tble_name indx_name) */
col1, col2
from tble_name

Это заставит использовать индекс indx_name.

0 голосов
/ 05 сентября 2017

для меня было полезно показать все индексы, замените вашими данными:

SELECT * FROM all_ind_columns
WHERE TABLE_NAME IN 
(SELECT DISTINCT TABLE_NAME from all_indexes where owner = '<INDEX_OWNER>')
order by TABLE_NAME;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...