Oracle. Переименовать столбец с именем «count» - PullRequest
0 голосов
/ 06 ноября 2019

Я столкнулся с проблемой устаревшего кода. У меня есть таблица журнала с несколькими сотнями миллионов записей. Запросы к этой таблице занимают слишком много времени, даже если она имеет индекс. Я копаю эту проблему до столбца с именем "count". Похоже, из-за этого имени Oracle не использует индексные данные и использует полное сканирование таблицы. Поэтому я попытался переименовать столбец, но это не удалось. Я пытался:

ALTER TABLE t RENAME COLUMN count TO search_count; ORA-00900: неверный оператор SQL

ALTER TABLE t RENAME COLUMN "count" TO "search_count"; ORA-00904: "count": неверный идентификатор (то же самое с любыми другими кавычками)

ALTER TABLE t RENAME COLUMN t.count TO t.search_count; ORA-01748: здесь разрешены только простые имена столбцов

Создание новой таблицы и перемещение туда данных занимает слишком много времении в конечном итоге завершается с ошибкой «невозможно расширить табличное пространство».

Может кто-нибудь предложить какой-нибудь другой метод?

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

Альтернативное решение:

  • Создайте новый столбец с именем search_count
  • Обновите все значения в нем до значения поля count
  • Укажите индекс для этого столбца
  • Удалите предыдущий индекс и исходный столбец

В этом случае Oracle будет использовать вновь созданный индекс.

0 голосов
/ 06 ноября 2019

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

Пример доступа к индексу наСтолбец "count"

create table my_count as
select rownum "count",
rownum "COUNT",
lpad('x',100,'y') pad
from dual connect by level <= 1000
;

create index my_count_idx1 on my_count ("count");
create index my_count_idx2 on my_count ("COUNT");

Запрос с использованием индекса

select * from my_count where "count" = 1;

---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    78 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| MY_COUNT      |     1 |    78 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | MY_COUNT_IDX1 |     4 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("count"=1)

Такой же доступ выполняется для индекса по столбцу "COUNT".

0 голосов
/ 06 ноября 2019

Я думаю, что это проблема чувствительности к регистру имени столбца.

Вы сможете увидеть имя столбца, если оно в верхнем или нижнем регистре, используя команду desc t.

Если у вас строчные буквы, выполните

ALTER TABLE t RENAME COLUMN "count" TO search_count;

Но я думаю, что имя вашей колонки в верхнем регистре в соответствии с ошибкой, которую вы получаете, поэтому попробуйте следующее:

ALTER TABLE t RENAME COLUMN "COUNT" TO search_count;

IMP : имена преобразуются в верхний регистр, когда они используются без двойных кавычек в оракуле (без учета регистра), и они хранятся в метаданных, как это.

Cheers !!

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