Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Досталась в наследство несколько выподвывернутая таблица. Ради удобства в некоторых запросах добавил пару computed-by поля. Рекурсивных запросов нет, так что максимум рекурсии должен быть 1 уровень вложенности. По структуре ОКВЭДов, даже если сделать полную рекурсию, то максимум должен быть 9-я вложенность. Но такого нет. ID - просто PK: 1,2,3,4,... Пример: CODE = '01.13.24' // PARENT_CODE = '01.13.2' Остальные поля не важны. ODS 11.1 dialect 3; 1842 строки в таблице Код: 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. Всё считается и показывается правильно. По мотивам http://www.sql.ru/forum/1128761/kodirovka-podklucheniya-raznyy-plan провел эксперимент с индексом по вычислимому столбцу. Код: sql 1. По идее данный индекс мало на что влияет (если не указывать parent_id в сортировке или условиях). IBExpert ему почему-то показал статистику = 1. Далее, делаем запросы (все они без этого индекса прoходят без каких-либо проблем) Код: sql 1. Отрабатывает. Код: sql 1. Код: sql 1. Код: sql 1. FB 2.5.3 Win64 - запрос не проходит, IBExpert дважды показывает диагностику о рекурсии по системным таблицам FB 2.1.6 Win32 - запрос не проходит, IBExpert после долгого ожидания дважды показывает deadlock Удаляем этот индекс - все запросы проходят в лёт. При это я не вижу ни одной причины серверу вообще трогать новосозданный индекс по выражению-полю parent_id ни в одном из этих трёх запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 13:50 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Arioch, не надо такие индексы создавать. Такое придумать можно только нарочно, чтобы сделать птице побольнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 14:16 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, я могy только повторить насчёт трусов и крестика: индексы, вычисляемые по выражению, разрешены столбцы, вычисляемые по выражению, разрешены индексы по столбцам, вычисляемым по выражению, не разрешены но индексы по выражению равному столбцу, вычисляемому по выражению, разрешены И в любом случае, имеем какое-то совершенно иррациональное поведение оптимизатора. ХЗ где оно еще может вылезти. Два дедлока на prepare запроса... PS: легендарная "база Болтика" тоже была примером "чтобы сделать птице побольнее." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 14:20 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Arioch, ещё раз повторю. Не надо создавать индексы по подзапросам. Даже больше скажу не стоит такие вычисляемые поля создавать. Если нужен аналог матвью, то это делается совсем не так. И уж если о рациональности говорить, то надо вообще такие кривые индексы запрещать создавать. Вот только проверку всей возможной кривизны не так уж легко сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 14:28 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, мне не нужен тут materialized view, а просто используемая возможность легко в дереве выйти на уровень вверх. редко используемая, так что доавлять триггер и столбец не нужно. и индекс мне такой не нужен, иначе бы я его давно создал. просто проверяя возможное наткнулся на совершенно дикое поведение оптимизатора. когда гипотетической при возможности использования в любом запросе любого инедкса у оптимизатора рвёт крышу. Как минимум этa грабля готовый пример для статьи "как поставить FB на колени" или любого другого списка gotcha ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2014, 14:33 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Вот почитал вас, тут почитал, и назрел вопрос. Итак, часть индексов по выражению эффективно используются, а часть висит с искусственной селективностью 1 мёртвым грузом. Правильно ли я понимаю логику: чтобы индекс не отбросили, оптимизатор должен явно видеть, что значение индекса по вычисляемым полям изменится только тогда, когда изменятся значения использованных в выражении полей . В случае, если в выражении индекса содержится запрос, даже опосредованно - через использование вычисляемого поля, оптимизатор дальше его не анализирует, формально создаёт индекс, но в потом этот индекс не перестраивает, и в запросах его не использует. Если в выражении индекса содержатся только обращения к текущим полям или скалярные функции (типа substring), оптимизатор расслабляется и нормально отстраивает и использует индекс. Я прав, или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2014, 23:01 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
MrCat, индекс всегда поддерживается ("перестраивается"). А будет ли он использоваться в запросах - зависит от кучи факторов, начиная с тех же запросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2014, 23:09 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Arioch, Код: sql 1. 2. ох, ёжик... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2014, 23:29 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
AriochРади удобства в некоторых запросах добавил пару computed-by поля.Я тут выстрелил себе в ногу, теперь хромаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 12:13 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Ух ты, празднуем возрождение темы? Ivan_Pisarevsky, не, не хромаю. Работает, когда надо... На вид работает не хуже, чем явно сформулированный запрос. А если и хуже - то не тот размер таблицы, чтобы париться. PS. Ещё раз говорю, дважды вычислимого индекса тут нет и не планировался, просто табличка использовалась как готовый лабораторный ролик для него kdv, а сформулируй лучше в рамках DDL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 12:37 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
некроманты, блин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 14:19 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
dimitrMrCat, индекс всегда поддерживается ("перестраивается"). А будет ли он использоваться в запросах - зависит от кучи факторов, начиная с тех же запросов. Тогда приведу конкретику. Создадим таблицу, в которой два поля - текстовое значение и некоторый ключ к нему. В моём случае понадобился первый непрерывный кусок состоящий из цифр. Разумеется, нет никаких проблем с тем, чтобы хранить ключ обычным физическим проиндексированным полем, и даже можно сэкономить - сделать float-ключ, а не строку. Мне стало интересно, как заработает другой вариант, с вычисляемым полем и индексом по нему: фигура первая - неудачная Код: sql 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. 98. 99. 100. 101. 102. 103. 104. фигура вторая - тоже неудачная Код: sql 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. фигура третья - удачная, конечно, но толку-то... Код: sql 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. Можно сделать предположение: любые пляски с source вычисляемого поля/индекса не помогают подцепить индекс, который вычисляется как выражение, включающее в себя это вычисляемое поле. Нельзя упростить выражение для вычисляемого индекса через использование в нём вычисляемого поля. Попробуем ещё раз обмануть птичку. фигура четвёртая - неудачная Код: sql 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. Обмануть не вышло. Но оно и к лучшему. Потому что чем городить такие огороды - копипастить некислый sql в два места - лучше уж физическое ключевое поле создать. В рамках раскапывания старых могил спрошу ещё: * что означает отрицательная селективность индекса (фиг. 2)? * я плохо понимаю, как это работает, но движку можно подсказать, какой индекс он должен подцепить при выполнении запроса - select ... PLAN () . Можно ли в верхних "НЕТ-НЕТ-ДА-НЕТ" как-то помочь оптимизатору найти вычисляемый индекс? * не совсем понимаю план запроса в чевёртой фигуре - почему t1 join'ится к rdb$database? Надо же для каждой записи таблицы ( T1 NATURAL ) посчитать выч. поле с подзапросом ( RDB$DATABASE NATURAL ), а не наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 17:28 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
MrCat, Фигнёй не страдай. Индекс по вычисляемому полю с подзапросом - этот нонсенс. Даже если это заработает, то 1. Индекс перестраивается во время модификации таблицы для которой он сделан, но не таблиц которые используются в подзапросе вычисляемого поля. 2. Вычисляемое поле вычисляется при выборке вычисляемого поля Какие чудо результаты найдёт твой индекс, если модифицируешь данные в таблицах, которые используются в подзапросе вычисляемого поля? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 17:39 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Ну я так и предположил, когда первое сообщение писал - "оптимизатор должен явно видеть, что значение индекса по вычисляемым полям изменится только тогда, когда изменятся значения использованных в выражении полей", там же не только подзапрос может вернуть изменившееся значение, там RAND() достаточно пихнуть в выражение. Просто тут я присоединяюсь и к Arioch, и к kdv ( CORE-1212 ) - индекс разрешён, создаётся, но не подцеплятся. Смущает только пользователя. Я думал, есть какая-то лазейка из разряда "использовать не рекомендуется, но если очень нужно - вот вам индекс. Считается в момент изменения записи. И это значение может отличаться от высчитываемого, если сам сохранение не обеспечишь. Используй с умом.", но нет лазейки, видимо. С индексом теперь понятно, спасибо, но что, всё же, означает отрицательная селективность? Это глюк или говорит о чём-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 18:02 |
|
||
|
Издеваясь над птицей - странный эффект с индексом по computed-by полю
|
|||
|---|---|---|---|
|
#18+
MrCat, Ты везучий... Или может быть у тебя ODS новая... Или может быть твои бешенные индексы - единственные на этой таблице и нормальных индексов по ней нет (PK например) Птому что в моем примере, после создание "бешенного" индекса переставали работать ЛЮБЫЕ запросы, которые потенциально могли использовать ХОТЯ БЫ КАКОЙ-НИБУДЬ индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2014, 19:17 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=84&tid=1563132]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 206ms |

| 0 / 0 |
