|
Как работает result cache
|
|||
---|---|---|---|
#18+
Melkomyagkii_newbi мне до сих пор не очень понятно как result cache помогает cpu экономить для простой выборки(без агрегатов и прочих вычислений) подумалось. у нас была проблема когда сотни сессий дергают маленькую справочную таблицу десятки раз в секунду каждая. Блок горячий, как следствие - cache buffer chain latch. result_cache можно было бы рассмотреть как вариант решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 04:56 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Вопрошатель, 1) Есть "веками" устоявшее поверье - даже не пытайся задумываться, не дергать ли тебе за усы новую фичу, если ей меньше трех поколений в твоей версии СУБД. 2) Ты просто заменишь один латч на другой. На старых версиях (вплоть до 12.1), почти наверно ситуацию ухудшишь. Может быть и существенно, гораздо хуже, чем те игрушечные вдвое, которые показывались в предыдущих постах. 3) есть вещи, которые в кармане разработчика в качестве его повседневного рабочего инструмента. Result_cache к ним не относится. Эта штуковина - игрушка в руках "архитектора" и/или администратора. Когда им понадобится угробить или украсить бантиком свою систему - они тебе об этом, несомненно немедленно доложат. Так что, если у тебя версия, как у Никанора Кузьмича - кури себе спокойно, не марай форум буквами, и себе не морочь голову. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 10:38 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Вопрошатель Melkomyagkii_newbi мне до сих пор не очень понятно как result cache помогает cpu экономить для простой выборки(без агрегатов и прочих вычислений) подумалось. у нас была проблема когда сотни сессий дергают маленькую справочную таблицу десятки раз в секунду каждая. Блок горячий, как следствие - cache buffer chain latch. result_cache можно было бы рассмотреть как вариант решения? скорее нет, чем да. мы самодельным кешем на pl/sql(в pga) решали подобное. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 10:50 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
booby 3) есть вещи, которые в кармане разработчика в качестве его повседневного рабочего инструмента. Result_cache к ним не относится. В текущей системе уже два раз сталкивался с ситуацией, когда без result_cache на ф-цию - даже не знаю, как бы "взлетело". Понятно, что проблема в структуре данных и алгоритме, но переписывать алгоритм - практически не возможно (т.к. был написан давно и многие ньансы работы уже утеряны, лучше не трогать), менять структуру данных или придумывать какие ни будь mat view и триггеры - еще худшая "затычка", чем result cache Т.ч. IMHO вполне рабочий инструмент, который в ряде случаях может помочь. Но разумеется, использовать его везде где только можно, лишь бы впихнуть новую фичу - не стоит. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 14:52 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev ... Понятно, что проблема в структуре данных и алгоритме, но переписывать алгоритм - практически не возможно (т.к. был написан давно и многие ньансы работы уже утеряны, лучше не трогать), менять структуру данных или придумывать какие ни будь mat view и триггеры - еще худшая "затычка", чем result cache ... Для того, чтобы сознательно переписывать, очень желательно понимать, по каким точно причинам бракуется старый. Моя практика говорит о том, что не так редко бывает достаточно подправить существующий алгоритм, если проблема правильно идентифицирована. Вот захотелось кому-то навесить на функцию result_cache. Ни секунды не сомневаясь в гипотезе, можно предполагать, что на вопрос почему, будет дан ответ - потому что слишком часто вызывается, а на вопрос где - ответ окажется - в фильтре сложного запроса, или в сложном запросе с финальной сортировкой. вот запрос из этого топика: Код: plsql 1. 2. 3. 4. 5. 6.
Он почти наверно "не настоящий", но, допустим, что именно вот такой точно и есть. Вот это что за "радость": Код: plsql 1. 2.
И сколько раз вызывается username за время одного запроса? Как точно выглядит этот распрекрасный username? И как, по мнению топикстартера, должна обходиться система при построении кеша и поиске в нем, именно с этим фрагментом? Мне лень изучать вопрос о точном устройстве result_cache, но на глаз это просто красные чернила вообще, и муть малопонятная при попытке кеширования. Для того, чтобы хотя бы приблизительно догадаться, какие у этого всего надежды, хотелось бы видеть саму функцию. Ясно, что изменить точно ничего нельзя - ни в параметр привязки превратить, ни хотя бы в подзапрос выделить, в расчете на работу scalar subquery caching. Что же, когда ничего нельзя, приходит время универсальному волшебству, хинтом решающему все проблемы. PS Мы еще не спросили - а сам-то запрос - напрямую с клиента отдается, или вызывается внутри функции? Если в функции, то почему она так часто зовется? И точно не в составе фильтра другого запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 17:00 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Биллинговая система раньше считала только дома, теперь пришлось считать и квартиры. Хранение информации об атрибутах - достаточно сложное (версионность, историчность и прочее). В общем, обращение достаточно медленное. Собственно ф-ция расчета вызывается для каждого расчитываемого объекта, в ней нужно получить все параметры квартиры + параметры здания + параметры всех квартир в здании. Вызывается столько раз, сколько квартир в доме. Параметры конкретной квартиры, вообще в результате получаются "кол-во квартир" * "кол-во квартир" раз. понятно, что по хорошему нужно было бы: 1. Получить параметры дома, получить параметры всех квартир. Где-то сохранить 2. На основе этих параметров уже считать квартиры в конкретном здании Но существующий вызывающий код, так "сортировать" задание на расчет не умеет. Изменить вызывающий код - очень сложно (опасно поломать). Result_cache как манна небесная. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 17:25 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, нет, это не понятно. Вполне может быть, что именно в описанной сказке просто deterministic оказался бы в число раз атрибутов фееричнее. Это даже, если про старые добрые временные таблицы не вспоминать, или pivot с no_merge. Так - то моргающих лампочек много на ёлках. не обязательно последняя к ней прикрученная самая красивая. PS Про "атрибуты" я бы тоже мог достойный хорошего стендапа монолог сварганить. Но, на сегодня и так план уже перевыполнен. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 17:56 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
booby Ну, а если вас с десяток таких образованных, что будет со всеми вами одновременно делать вменяемый администратор? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 18:41 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev Result_cache как манна небесная. В описанном тобой случае Result_cache, по сути, вреден, потому что входная мощность постоянно вытесняет кэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 18:48 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Elic booby Ну, а если вас с десяток таких образованных, что будет со всеми вами одновременно делать вменяемый администратор? не-не, В зеркале все с рогами и копытами. Программисту такое состояние привычно и за счастье. А дба, думаю, как-то от зеркала всё-таки полезно изолировать. Он редко, но бывает и нужен и полезен. Нормального дба нельзя приводить в неработоспособное состояние путем установки зеркала. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 19:16 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Elic booby Ну, а если вас с десяток таких образованных, что будет со всеми вами одновременно делать вменяемый администратор? Нормальные разрабы понимают, что какие у них есть DBA, такие и есть, и других не будет. Нормальные DBA понимают, что какие у них есть разрабы такие и есть, и других не будет. Нормальные разрабы и DBA понимают, что какие у них есть юзеры такие и есть, и других не будет. Нормальные юзеры хвалят / ругают разрабов, и не догадываются, что сущеcтвуют ещё какие-то DBA, аналисты, тестеры, стейджеры, саппортёры и др. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2022, 21:08 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Никанор Кузьмич, посмотрите кино по ссылке, если не видели. Там есть моменты спорные, но в интересующей вас части, скорее стоит глянуть. https://habr.com/ru/company/oleg-bunin/blog/414401/ ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 09:50 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
booby Никанор Кузьмич, посмотрите кино по ссылке, если не видели. Там есть моменты спорные, но в интересующей вас части, скорее стоит глянуть. https://habr.com/ru/company/oleg-bunin/blog/414401/ Да, докладчик хороший, кино интересное, грамотное и сделано хорошо. Присоединяюсь к рекомендации. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 10:48 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
booby 1) Есть "веками" устоявшее поверье - даже не пытайся задумываться, не дергать ли тебе за усы новую фичу, если ей меньше трех поколений в твоей версии СУБД. booby Ни секунды не сомневаясь в гипотезе, можно предполагать, что на вопрос почему, будет дан ответ - потому что слишком часто вызывается, а на вопрос где - ответ окажется - в фильтре сложного запроса, или в сложном запросе с финальной сортировкой. booby Мы еще не спросили - а сам-то запрос - напрямую с клиента отдается, или вызывается внутри функции? booby вот запрос из этого топика: Код: plsql 1. 2. 3. 4. 5. 6.
Он почти наверно "не настоящий", но, допустим, что именно вот такой точно и есть. booby Никанор Кузьмич, посмотрите кино по ссылке, если не видели. Там есть моменты спорные, но в интересующей вас части, скорее стоит глянуть. https://habr.com/ru/company/oleg-bunin/blog/414401/ ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 13:33 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
авторselect max(vepa_par_value) into v_value from ( select rownum, vepa_par_value, vepa_usr_name, vepa_vers_key from version_parameter where vers_company = 'ABC' and vepa_par_name = p_list(mod(i, c) + 1) -- username на следующей строке - это функция and nvl(vepa_usr_name, username) = username order by vepa_usr_name, vepa_vers_key) where rownum = 1; Никанор Кузьмич, приведите лучше пример реальной функции, а не тестового запроса. Желательно сразу скрипт структуры таблицы и insert (название параметров оставить как есть, значения можно поменять). Во-первых поддерживаю создание индекса. vers_company, vepa_par_name, vapa_usr_name, vepa_vers_key, vepa_par_value. Хотя не уверен, что для 400 строк он даст результат. Так как индекс нужен, чтобы быстро найти блок данных в большой таблице. А если данных всего 400 строк и они влезают в 5-10 блоков по 8 кб, то особого толку не будет. Второе - посмотрел бы на IOT (когда таблица - это индекс по первичному ключу). Но это тоже толк будет от силы раза в два. Затем ИЗБАВИЛСЯ бы от функции nvl в запросе. Я не уверен, что nvl - это SQL-функция. Если это функция PL/SQL, то происходит переключение контекста для каждой строки. Во всяком случае проверить это. Варианты замены на такие: and COALESCE(vepa_usr_name, username) = username and (vepa_usr_name is null or vepa_usr_name = username) and case when vepa_usr_name is null then 1 when vepa_usr_name = username then 1 else 0 end =1 В последнем варианте строки вообще не будут сравниваться (так как в таблице строк всего 400, значит vepa_usr_name наверняка почти не заполнено). Вот тут как раз пишут, что NVL — это функция PL/SQL, следовательно снова будет переключение контекстов. Поэтому ее следует заменить на COALESCE или оператор CASE. https://habr.com/ru/post/124948/ Далее проверить, что vepa_usr_name вообще хоть где-то заполнено. Если оно везде пустое, то вообще убрать из условия. Что значит "username на следующей строке - это функция"? Это шутка или это реально функция, а не переменная ORACLE username? Если это реально функция, то просто в начале своей функции считать значение этой функции в переменную varchar и использовать уже константу. Возможно проблема именно в этом. Никакой result cache тут явно не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2022, 22:19 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
VDeltsov Вот тут как раз пишут, что NVL — это функция PL/SQL, следовательно снова будет переключение контекстов. Поэтому ее следует заменить на COALESCE или оператор CASE. https://habr.com/ru/post/124948/ Не читайте до обеда советских газет (С) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2022, 22:33 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
AlexFF__| VDeltsov Вот тут как раз пишут, что NVL — это функция PL/SQL, следовательно снова будет переключение контекстов. Поэтому ее следует заменить на COALESCE или оператор CASE. https://habr.com/ru/post/124948/ Не читайте до обеда советских газет (С) это не "советские газеты", а "письмена на заборе". --- 2VDeltsov, исключение NVL с немалой вероятностью автоматически приведет к ухудшению производительности запроса. Для компенсации сего обстоятельства, его может потребоваться после этого заметно визуально усложнить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 00:36 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Протестировал nvl в ORACLE 12 - разницы не увидел, видимо это уже исправили. Раньше была рекомендация его не использовать. А то, что автор увидел прирост производительности в результате кэширования - это результат того, что перестала выполняться функция "USERNAME". Поэтому скорее всего достаточно будет просто один раз её считать в начале процедуры. Однако возможно, что дело не только в этой самой процедуре, но и в чудо функции "USERNAME". Так что рекомендую эту чудо функцию тоже привести. Возможно она сама по себе тоже подтормаживает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 00:53 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
VDeltsov Раньше была рекомендация его не использовать. такой универсальной рекомендации, без оговаривания точного контекста, не было никогда. А для случая, аналогичному обсуждаемому запросу - рекомендовано использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 01:28 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
NVL штука странная и ее по возможности лучше е использовать если в выражении есть функции так как она сначала вычислит ве значения и только потом будет сравнивать. А по условию это значение может быть и не нужно. Вот например Код: plsql 1. 2. 3. 4. 5. 6. 7.
Второе выполнение функции не нужно так как с первой части единица он мы сначала его вычислим и только потом отбросим как ненужное. Простая замена на coalesce дает ускорение порой просто на том что не выполняем того что не нужно выполнять Вот аутпут для обоих случаев вполне наглядно. p_number = 1 p_number = 2 end of test nvl p_number = 1 end of test coalesce ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 08:10 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Никанор Кузьмич Есть Oracle 12.1 Вообще после Никанор Кузьмич Код: plsql 1.
А лучше бы проапгрейдиться до 19, тогда у вас прямо в v$sql появится столбец RESULT_CACHE. Если же надо протрейсить RC, то есть Код: plsql 1.
пример трейса: https://gist.github.com/xtender/b3401a5118cd6898ddb8be2ad82acac9 В целом же, лучше не делать alter table result_cache force, а точечно втыкать result_cache в запросе или на функцию, причем все зависимости должны быть крайне редко изменяемыми, иначе помрете на RC латчах. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 17:12 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Никанор Кузьмич Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 17:18 |
|
Как работает result cache
|
|||
---|---|---|---|
#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.
output Код: 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. 98. 99. 100. 101. 102. 103. 104.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2022, 17:30 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Sayan Malakshinov Скорее всего, у вас 12.1. 0.1 и вы нарвались на баг Bug 16301888 - A query with result cache annnotated table is not cached (Doc ID 16301888.8) (вкратце, там автоматически не инвалидировался курсор при alter table ...result_cache) Sayan Malakshinov А лучше бы проапгрейдиться до 19, тогда у вас прямо в v$sql появится столбец RESULT_CACHE. Sayan Malakshinov Никанор Кузьмич Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2022, 11:30 |
|
Как работает result cache
|
|||
---|---|---|---|
#18+
Никанор Кузьмич, Это у Вас переключение контекста на каждую строку, раз используете функцию. К тому же её результат непонятно как кэшировать, ведь в запросе неизвестно заранее, какой результат вернет функция. Третий раз прошу объявить переменную в процедуре, в начале процедуры вытащить значение фукнции, и уже эту переменную подставлять в запрос. Функции в условии where - это самая детская ошибка, которую можно совершить. Жду результата теста. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2022, 14:36 |
|
|
start [/forum/topic.php?fid=52&msg=40135448&tid=1879487]: |
0ms |
get settings: |
17ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
486ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 592ms |
0 / 0 |