|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
Доброго времени суток! Никак не соображу как лучше сделать. Исходная задача: заменить все глобальные обычные (не уникальные) индексы определенной группы таблиц (выбирается like по имени) на локальные. Если смогу получить список всех колонок индекса - остальное сделаю. Проблема в том, что некоторые колонки индексов содержат функциональные выражения, которые достаются списком типа long и что-то не получается сложить всё в одну текстовую переменную или коллекцию. Пока мыслю в этом направлении: Прохожусь циклом по всем обычным глобальным индексам и пытаюсь достать их поля, чтобы создать потом такие же после drop Код: plsql 1. 2. 3.
Но в запросе 2 ошибка, т.к. надо доставать список LONG и простой to_char не срабатывает. Может что-то не догоняю и всё делается проще? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 11:26 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 12:48 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
Ты же все равно в PL/SQL это прикручивать будешь? Я как-то так достаю: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 12:52 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
PuM256 Код: plsql 1.
Интересный вариант, не знаю только, сработает ли в контексте скриптов по нашей системе обновлений... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:07 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров Ты же все равно в PL/SQL это прикручивать будешь? Я как-то так достаю: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Что-то многовато всего, но может тоже пойти - надо проверить всё... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:09 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 Доброго времени суток! Никак не соображу как лучше сделать. Исходная задача: заменить все глобальные обычные (не уникальные) индексы определенной группы таблиц (выбирается like по имени) на локальные. Если смогу получить список всех колонок индекса - остальное сделаю. Проблема в том, что некоторые колонки индексов содержат функциональные выражения, которые достаются списком типа long и что-то не получается сложить всё в одну текстовую переменную или коллекцию. Пока мыслю в этом направлении: Прохожусь циклом по всем обычным глобальным индексам и пытаюсь достать их поля, чтобы создать потом такие же после drop Код: plsql 1. 2. 3.
Но в запросе 2 ошибка, т.к. надо доставать список LONG и простой to_char не срабатывает. Может что-то не догоняю и всё делается проще? Через DBMS_METADATA. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:52 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SeaGate, а почему нельзя сделать проще? Это уже внутри цикла по глобальным простым индексам: Код: plsql 1.
Далее загоняем в переменную clob и запускаем EXECUTE IMMEDIATE ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 14:59 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 SeaGate, а почему нельзя сделать проще? Это уже внутри цикла по глобальным простым индексам: Код: plsql 1.
Далее загоняем в переменную clob и запускаем EXECUTE IMMEDIATE DBMS_METADATA предоставляет конкретный API для манипуляции объектов и поддерживается вендором СУБД. Нет смысла использовать строковые манипуляции, работающие в ограниченном числе случаев при определенных условиях. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Приведенная наивная строковая манипуляция не будет сохранять валидный DDL в общем случае, что и демонстрирует пример выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:15 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:18 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SY Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77.
SY. Если допустимо то, что делает ALTER TABLE MODIFY PARTITIONING под капотом (аля DBMS_REDEFINITION), то да. Если большие таблицы, где нужно поменять пару индексов, то накладные расходы могут оказаться несопоставимы. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:26 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SeaGate Если большие таблицы, где нужно поменять пару индексов, то накладные расходы могут оказаться несопоставимы. Согласен, просто решил показать способ как таковой. Жаль не поддерживается что-то типа: Код: plsql 1. 2.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:30 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SeaGate, это кому так придёт в голову назвать колонку? По сути, конечно, верно, но если точно знаешь, что такого безобразия не будет, то проще так сделать. Но поюзаю ещё полную правильную версию... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:32 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
DBMS_METADATA как предлагал PuM256 есть самый простой способ: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 15:41 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SY, проблема в том, что LOCAL иногда надо вставлять в середину метадаты (когда есть хвост и партиции). Поэтому-то я и делал replace, а не прибавлял в конец. Но то, что она идёт после TABLESPACE Имя_Индекса LOCAL - это чаще всего (но не универсально). А что колонку назовут служебным словом - это эксклюзив ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 16:06 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001, А хотя, возможно, и так сработает. Надо тестить... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 16:19 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SYDBMS_METADATA как предлагал PuM256 есть самый простой способ: Для частного случая из этой задачи, должно работать. Для более общего случая, когда, например, нужно пересоздать GLOBAL PARTITIONED индексы как LOCAL, уже не сработает. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Работа с API DBMS_METADATA дает корректный результат: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 16:31 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SeaGate, да, спасибо, попробую этот спрособ. Хотя с xmlquery особенно не работал и придётся разбираться... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 16:34 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
На первом же индексе вылетела ошибка (см. вложение). Текст DLL такой (имена заменены): Код: plsql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:05 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 SY, проблема в том, что LOCAL иногда надо вставлять в середину метадаты (когда есть хвост и партиции). Это про GLOBAL PARTITIONED INDEX? Тогда: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:27 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 На первом же индексе вылетела ошибка (см. вложение). ??? Ты бы RTFM что есть LOCAL INDEX. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:28 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SY, Мы преобразуем глобальные (global_stats = 'YES') простые (NONUNIQUE) индексы. А вот какой тип индекса PARTITIONED или нет - это уже как попадет... Итог global_stats = 'No' (то, что делает local) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:32 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 SY, Мы преобразуем глобальные (global_stats = 'YES') простые (NONUNIQUE) индексы. А вот какой тип индекса PARTITION или нет - это уже как попадет... Ты вообще-то понимаешь что такое global_stats? GLOBAL_STATS VARCHAR2(3) Indicates whether statistics were calculated without merging underlying partitions (YES) or not (NO) И она собирается/не собирается/как собирается исходя из DBMS_STATS.GATHER...STATS параметра granularity. A LOCAL/GLOBAL индекс это тип партицирования ничего общего с методом сбора статистики не имеющий. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:48 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
SY, значит я ошибся в параметре (не всё ещё изведал). Правильно - это то, что индекс из глобального должен стать локальным, если он не уникальный и уже не локальный. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 17:52 |
|
Заменить все индексы группы таблиц на локальные или получить список колонок индекса
|
|||
---|---|---|---|
#18+
ARRay001 SY, значит я ошибся в параметре (не всё ещё изведал). Правильно - это то, что индекс из глобального должен стать локальным, если он не уникальный и уже не локальный. Опять 25. Global partitioned index независим от партицирования/не партицирования таблицы и имеет свое партицирование Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
LOCAL PARTITIONED INDEX наследует партицирование таблицы и посему просто не может быть создан не непартицированой таблице в чем ты и убедился. Так-что исключи GLOBAL PARTITIONED INDEXES на непартицированые таблицы. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2022, 18:12 |
|
|
start [/forum/topic.php?fid=52&msg=40128537&tid=1879588]: |
0ms |
get settings: |
17ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
32ms |
get topic data: |
2ms |
get forum data: |
1ms |
get page messages: |
386ms |
get tp. blocked users: |
0ms |
others: | 372ms |
total: | 817ms |
0 / 0 |