|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
Что-то не вижу простого решения. Задана таблица с числовым PK, нужно для одного конкретного числа найти ближайший к этому числу PK наиболее эффективным способом. Если таковых два, то наименьший из двух. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Учитывая что в примере сортировка идет по значению функции, не закончится ли это полным перебором? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:06 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
При правильной организации данных решается за шесть логических чтений практически независимо от размера таблицы с данными. При относительно небольших объемах и высокой потребности в производительности можно решить на ассоциативном массиве PL/SQL ценой его однократной загрузки. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:22 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
НеофитSQL Учитывая что в примере сортировка идет по значению функции Зачем? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:23 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
andrey_anonymous При правильной организации данных решается за шесть логических чтений практически независимо от размера таблицы с данными. При относительно небольших объемах и высокой потребности в производительности можно решить на ассоциативном массиве PL/SQL ценой его однократной загрузки. Поиск по B-tree неограниченного размера за шесть чтений? Вы конечно шутите. Чудес не бывает, хотелось бы за O(log N) в SQL, без повторных поисков по индексу. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:42 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
Неофит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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:44 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
graycode НеофитSQL Учитывая что в примере сортировка идет по значению функции Зачем? Так в примере, чтоб было понятно какой ожидается результат. Я подозреваю что пример неэффективен, т.к. функция может помешать оптимизатору, особенно если функция посложнее чем abs() ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:47 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
НеофитSQL Поиск по B-tree неограниченного размера за шесть чтений? Вы конечно шутите. Чудес не бывает, хотелось бы за O(log N) в SQL, без повторных поисков по индексу. :) Вам ведь уже говорили, что Btree в Oracle нифига не бинарный. До миллионов (десятков миллионов) записей задача решается за указанные расходы, которые требуются на два индексных поиска (каждый по 2 логических чтения индекса Blevel=2 + одно за записью в таблице, if any) - один вверх и один вниз. В принципе, env показал один из способов воспользоваться таким поиском, но не показал структуры и планы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:50 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
env Неофит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.
Спасибо, сравниваю планы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:51 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
Неофит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. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 17:56 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
Решение env "в лоб" выглядит оптимально. Не вижу как можно быстрее. Индекс конечно есть - это основной ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:03 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
НеофитSQL, Решение в "лоб" можно записать так: Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:09 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
НеофитSQL Решение env "в лоб" выглядит оптимально. Не вижу как можно быстрее. "Быстрее" - нет, план аналогичной эффективности попроще - да, можно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:10 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
env Тупо в лоб И с кaкого перепуга 3 GROUP BY? А главное тут все зависит от наличия индекса по id. Без него 2 FULL SCAN плюс 3 SORT AGGREGATE что в разы хуже. При отсутствии индекса Код: plsql 1. 2.
совсем неплох: 1 FULL SCAN + WINDOWS SORT PUSHED RANK который согласно Jonathan Lewis ( 12c First N ) 'may still have to generate the entire pre-sorted data set". Можно поколдовать: Код: 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.
Ну а если есть индекс, то уж: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:10 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
graycode НеофитSQL, Решение в "лоб" можно записать так: Код: plsql 1. 2. 3.
нельзя(( ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:23 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
Кстати, план не отражает short circuit: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:25 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
SY Ну а если есть индекс, то уж: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Это решает задачу поиска минимального из соседних, а не ближайшего и ближайших может быть два, если они на одинаковом расстоянии. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 18:48 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
[quot graycode#22234075] SY Это решает задачу поиска минимального из соседних, а не ближайшего и ближайших может быть два, если они на одинаковом расстоянии. Упс. Да, MIN и MAX придется вычислять всегда. MATCH_RECOGNIZE для забавы: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:19 |
|
Найти ближайший PK
|
|||
---|---|---|---|
#18+
env Код: plsql 1. 2. 3. 4. 5.
А где 29 ?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.11.2020, 19:51 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1880706]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 255ms |
0 / 0 |