|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Добрый день уважаемые. Есть сегментированная по диапазону таблица ключ сегментирования поле "DATE", содержит поле "ID" number. Первичный ключ "ID", "DATE" локальный. Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования. При перемещении архивного сегмента возникла проблема, так как часть индекса таблицы после перемещения сегмента стала неиспользуемой, планы выполнения у пользователей поменялись и они выборкой MAX(ID) стали нагружать систему, и виснуть сами, так как первичный ключ перестал использоваться. Пока не перестроил часть этого сегмента. Я задумался чтобы в клиентском приложении добавить выборку MAX(ID) только из текущего сегмента добавив условие DATE > trunc(sysdate, 'YEAR') Но индекс перестает использоваться. Не пойму почему, что оба поля в индексе есть, я как то, был уверен, что индекс будет использоваться. Прошу разъяснить. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 09:10 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos, 1. ID скорее всего уникальная последовательность, оптимизатор не может применить INDEX SKIP SCAN. 2. В индексе нет выражения trunc(DATE , 'YEAR') ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 10:01 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
PaulWist 2. В индексе нет выражения trunc(DATE , 'YEAR') у него > trunc( sysdate , 'YEAR') ...... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 10:07 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Stax у него > trunc( sysdate , 'YEAR') ...... stax Ааа, у ТС два индекса по ID и DATE, если внимательно вчитаться в текст. Тогда надо смотреть на кардинальность индекса по DATE, и что в этом поле лежит на самом деле. DDL таблицы индексов в студию. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 10:42 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
PaulWist, > Первичный ключ "ID", "DATE" локальный. Индексов у меня пять, но по другим полям и интересует именно этот. Индекс первичного ключа, в нем два поля "ID", "DATE", если что то неоднозначно сформулировал, готов уточнить, если это поможет решению. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:55 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Может какое другое решение предложите. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 11:57 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos Может какое другое решение предложите. alHaos Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:06 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos так как часть индекса таблицы после перемещения сегмента стала неиспользуемой ... за выходные (ночью) починить индекс ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:13 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Stax, Так и делается сейчас, хотел бы как то в момент нагрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:19 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально... Время, ресурсы, приоритеты... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:21 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos Первичный ключ "ID", "DATE" локальный alHaos MAX(ID) alHaos Клиентское приложения периодически запрашивает MAX(ID) для инкрементирования. Насчет текущего: Допустим у вас такая таблица: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
max(id) тогда будет с перебором всех секций Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
max(dt) тоже будет не быстрым - см IFFS Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
select max(id) from t partition for (date'...') или просто partition (имя секции) конечно работать будут, но это вам надо будет получать сначала или макс дату или имя секции: select max(id) from t partition for (date'2022-01-28') Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Можете, конечно, сделать функцию, которая будет сначала получать имя секции или дату и уже потом селектить по ней, но тогда лучше еще индекс завести например Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:31 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально... Сейчас они делают Код: plsql 1.
и прибавляют к нему единицу, а нужно изменить всего лишь на Код: plsql 1.
и не прибавлять единицу... А еще можно сделать Код: plsql 1.
и даже прибавление единицы не убирать, если разрабы уж совсем ленивые заняты. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:39 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos Никанор Кузьмич, Поменять запрос, разработчики еще сделают, а вот менять логику тут все печально... Время, ресурсы, приоритеты... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:40 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Sayan Malakshinov, даже не знаю, не думал как две сессии одновременно инкрементируют..., я не разработчик этой системы, может в рамках одной транзакции все... имя секции в запросе, интересно но как быть в момент смены текущей секции. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:46 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Благодарю уважаемые за информацию к размышлению, дальнейшие ответы опционы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 12:49 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos PaulWist, > Первичный ключ "ID", "DATE" локальный. Индексов у меня пять, но по другим полям и интересует именно этот. Индекс первичного ключа, в нем два поля "ID", "DATE", если что то неоднозначно сформулировал, готов уточнить, если это поможет решению. Повторяю: DDL таблицы индексов в студию, перевожу, скрипты create table, create index. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 13:01 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
PaulWist, Будьте любезны Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 13:19 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos, авторalter table "target_table" add constraint PK primary key (ID, "DATE") а почему ID без кавычек ? и нужно соблюдать регистр ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:10 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
123ййа почему ID без кавычек ? Потому что в отличии от DATE он не является зарезервированным словом, очевидно... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:25 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, посмотри create table. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 14:29 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos PaulWist, Будьте любезны Код: 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.
И где такой индекс ? Или я может чего то не понимаю ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:34 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
alHaos Stax, Так и делается сейчас, хотел бы как то в момент нагрузки. Ключ в "При перемещении архивного сегмента". Это alter table move partition? Если да: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:40 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Или: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:43 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Владимир СА, Developer так нагноил скрипты, есть он там создался автоматически для первичного ключа. уберите USING INDEX из DDL. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:44 |
|
Выбор max(id) только из крайнего сегмента таблицы
|
|||
---|---|---|---|
#18+
Sayan Malakshinovmax(id) тогда будет с перебором всех секций ... max(dt) тоже max(dt) практически никогда не будет перебирать все секции, т.к. в плане "PARTITION RANGE ALL MIN/MAX" и обратный просмотр партиций (от max к min). Выполнение завершится на первой секции с данными. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2022, 15:56 |
|
|
start [/forum/topic.php?fid=52&fpage=3&tid=1879559]: |
0ms |
get settings: |
17ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
28ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
466ms |
get tp. blocked users: |
1ms |
others: | 357ms |
total: | 883ms |
0 / 0 |