|
|
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Есть некий select, который выполняется продолжительное время, сессия активна. Сделал трассировку сессии, получил следующее: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. возник вопрос, чего ожидает сессия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2016, 16:39:53 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкин, ваша сессия ожидает указание с клиента на фетч следующих восьми строк, после получения клиентом предыдущих восьми. Но вас не это должно интересовать пока, так общее время этого ожидания составляет меньше 5% общего времени выборки данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2016, 17:13:17 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкинчего ожидает сессия? Пока клиентское приложение получит и прожуёт отправленную ему пачку записей. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2016, 17:13:24 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
boobyжвачкин, ваша сессия ожидает указание с клиента на фетч следующих восьми строк, после получения клиентом предыдущих восьми. Но вас не это должно интересовать пока, так общее время этого ожидания составляет меньше 5% общего времени выборки данных. у меня в трейсе есть ещё два события: direct path read temp library cache: mutex X авторобщее время этого ожидания составляет меньше 5% общего времени выборки данных Могли бы подсказать, остальные 95% времени - что занимает по этому трейсу? проблема в недостаточном PGA - так как есть direct path read temp? в трейс у меня попало два селекта, второй имеет вид: select column from table where column=:p1; Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 11:57:45 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкинпроблема в недостаточном PGA - так как есть direct path read temp? У Вас cpu на fetch - почти 220 секунд. Скорее всего либо массивные сортировки, либо HJ Смотреть запрос, план его исполнения, много думать. Думать в двух направлениях: 1. Снизить ресурсоемкость запроса (более оптимальный план, возможно, поменять что-то на уровне данных, пересмотреть индексирование) 2. выделить больше ресурсов (--+ parallel, dbms_parallel_execute, по показаниям - добавить памяти, применить более быстрые носители, купить exadata, нанять специалиста) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 12:57:30 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Подскажите, а как увидеть значения bind переменных в запросе, который уже завершился? Трассировку сделать не успел, просто вижу текст запроса из поля sql_fulltext в v$sqlarea. редакция SE One. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:04:32 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousжвачкинпроблема в недостаточном PGA - так как есть direct path read temp? У Вас cpu на fetch - почти 220 секунд. Скорее всего либо массивные сортировки, либо HJ Смотреть запрос, план его исполнения, много думать. Думать в двух направлениях: 1. Снизить ресурсоемкость запроса (более оптимальный план, возможно, поменять что-то на уровне данных, пересмотреть индексирование) 2. выделить больше ресурсов (--+ parallel, dbms_parallel_execute, по показаниям - добавить памяти, применить более быстрые носители, купить exadata, нанять специалиста) план выполнения запроса такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. т.е. шла работа с временной таблицей. сколько записей было в той временной таблице для сессии - сказать не могу. HJ - не было судя из плана запроса. получается проблема в массивной сортировке, о чём говорит строка: SORT GROUP BY ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:21:35 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
В запросе не было обращений к PL/SQL функциям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:24:57 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
авторсколько записей было в той временной таблице для сессии - сказать не могу. вру, получается могу из Rows - 346...но это крайне мало, для фетча в 229 секунд. поправьте пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:25:44 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровВ запросе не было обращений к PL/SQL функциям? были и очень много. запрос на страницу или больше, pl/sql функций + 100500... куда дальше копать? что смотреть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:27:35 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Избавляться от них Или, хотя бы, сделать так, чтоб они не вызывались больше чем надо (например, scalar subquery expression) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:29:53 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровИзбавляться от них Или, хотя бы, сделать так, чтоб они не вызывались больше чем надо (например, scalar subquery expression) мой запрос с кучей pl/sql содержит следующее: Код: plsql 1. 2. Код: plsql 1. 2. Код: plsql 1. 2. таких строчек в запросе очень много... но на чём именно затык? getmaincode ? acp_rpt.GetRouteOrVoid ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 13:40:29 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкин, троллите вы жестко. andrey_anonymous вам уже ответил настолько, насколько возможно, по каменной силе силе вашего тролления. авторпроблема в недостаточном PGA - так как есть direct path read temp? direct path read temp - всего лишь следствие того, что весь ваш фетч выбирается с диска. А это следствие сортировки или хеш - соединения. может быть и PGA "недостаточно". его, рано или поздно, все равно будет недостаточно. может быть есть смысл увеличивать sort/hash area size, или даже buffer pool но лучше переписать запрос. из того, что видно - у вас низкая средняя скорость чтения с диска - около 500К/сек. и, что совершенно выглядит каменно, - в среднем за одно чтение с диска вы получаете 3 строки результата. Вероятно, это свидетельство того, что выбирая по 8 строк за раз, вы многократно перечитываете один и тот блок с диска. Ничего не меняя в запросе : Просто увеличьте на клиенте fetch size так, чтобы за раз клиенту отдавалось число строк из пары хотя бы блоков. Т.е. с 8 увеличьте до 80 или 180 - в зависимости от того, насколько широкие ваши строки данных. В вашем случае это серьезно (вероятно - более чем вдвое) улучшит время фетча и даст вам время и возможность спокойно, без использования каменных тролей на тропе чтения форума, разобраться с запросом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 14:04:48 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Вообще-то, судя пожвачкинт.е. шла работа с временной таблицей. сколько записей было в той временной таблице для сессии - сказать не могу. direct path read temp именно отсюда Никакой памяти никуда увеличивать не надо -- у него тупо молотит CPU за счет переключения контекста и хрен знает чего у него там внутри функций А если они еще и в условиях, ключах сортировки/группировки то наверняка вызываются много-много лишних раз Тут бы помог DETERMINISTIC и RESULT_CACHE, но лучше избегать вообще лишних вызовов PL/SQL из SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 14:13:49 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров, на мой взгляд - не сходится про "тупо молотит cpu" и переключения контеста. По крайней мере - с разбега - не сходится у него весь OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS - 2.12 да и выполнился всего 14462 при уже добытых 51744 строках Оно понятно, что набор у него недовыбран, и его pl/sql еще не все свои слова, вероятно, произнес. но, если уж память не надо трогать, то pl/slq - два раза повременить. он еще свой лик никак на показанную поверхность не явил. и не просто не явил, а в интересных ему 212 секундах того pl/sql - всего 1% - 2.12+-мизер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 14:33:18 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТут бы помог DETERMINISTIC и RESULT_CACHE, но лучше избегать вообще лишних вызовов PL/SQL из SQL DETERMINISTIC + RESULT_CACHE scalar subquery cache ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 14:41:45 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
автору вас низкая средняя скорость чтения с диска - около 500К/сек. могли бы вы любезно показать, как вы получили значение в 500 К/сек? Код: plsql 1. 2. 3. так? Код: plsql 1. но у меня был TABLE ACCESS FULL к временной таблице и должно многоблочное чтение использоваться. а это значит 13494 физических чтений * 128 КБ (db_file_multiblock_read_count=128) = 1727232 КБ /221 секунду - 7815 КБ в секунду... если же предположение не верно и было одноблочное чтение, то почему оптимизатор его использовал для TABLE ACCESS FULL? Oracle крутится на vmware, вкладка performance по диску показывает в среднем 22639 KBps для Read Rate. и Highest latency 3 в среднем. тогда возникает ещё один вопрос, почему при этом такие низкие показатели чтения с диска? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 15:26:11 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
Советую разобраться, что такое ELAPSED, что такое CPU И, насколько я понял не смешивать статистики и ожидания для "OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS" и конкретного оператора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 15:32:01 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
авторПросто увеличьте на клиенте fetch size так, чтобы за раз клиенту отдавалось число строк из пары хотя бы блоков. у нас есть приложение, написанное внешним разработчиком. менять код приложения, компилировать, и т.п. возможности нет. правильно я понимаю, что на уровне БД я fetch size не задам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 15:42:25 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкинавторПросто увеличьте на клиенте fetch size так, чтобы за раз клиенту отдавалось число строк из пары хотя бы блоков. у нас есть приложение, написанное внешним разработчиком. менять код приложения, компилировать, и т.п. возможности нет. правильно я понимаю, что на уровне БД я fetch size не задам? ссылка, которую предоставил любезно Elic: https://docs.oracle.com/cd/E11882_01/java.112/e16548/resltset.htm#JJDBC28623 Код: plsql 1. 2. я не могу изменять приложение... значит в моём случае лишь писать письма разработчику? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 16:18:01 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкину нас есть приложение, написанное внешним разработчиком. менять код приложения, компилировать, и т.п. возможности нет. так значит есть возможность напрямую обратиться к разработчику, а не терять время на форуме. Примите в расчет, что разработчик правомерно стребует с вас полноценную трассировку - запущенную до старта целевого запроса. (в вашей трассировке 0 исполнений запроса - это мусор, а не трассировка). жвачкинправильно я понимаю, что на уровне БД я fetch size не задам? это зависит от того - кто фетчит целевой курсор если клиент - надо явно задавать значение на клиентской стороне. если сервер (через open - fetch - close) - косвенным задается значением limit при переписывании доступа к данным через bulk collect требуется ли менять код и/или компилировать - зависит от деталей устройства вашего приложения. ну, sqlplus-то у вас, может быть, найдется. По крайней мере сможете проверить эту гипотезу, установив подходящий arraysize, и убедившись, например, в том, что никакой существенной разницы вы не видите. автор... так? да. это оценка . Для которой не имеет значения - насколько быстро что-то читалось "на самом деле". Все, что было на самом деле - разглядывайте в сырой трассировке. Нам же вы показываете здесь огрызки сферических коней в вакууме, требуя серьезной беседы. С вами серьезно и беседуют. То, что сия беседа есть запись из псих больницы - лучше подходит для пятницы, но и для вторника ничего, в условиях, когда еще вся среда впереди. тот кусок плана, который вы показали - это жесть. Если у вас строк выбирается больше одной, то подойдите к своему АБД с кирпичем в руках и запугайте его индексом на временной таблице в обмен на пиво. Не отходите от него и кирпич непрерывно на виду держите, пока он не лишит сей запрос фулскана на фильтре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 16:36:59 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
авторнапрямую обратиться к разработчику, а не терять время на форуме. что я любезно и сделал авторС вами серьезно и беседуют. очень приятная беседа. я бы сказал полезная. благодарю. авторподойдите к своему АБД с кирпичем в руках и запугайте не знаю плакать вам или смеяться, но я и есть тот самый АБД авториндексом на временной таблице в обмен на пиво изменять структуру данных я не имею права - соглашение с разработчиком, мы являемся владельцами данных, разработчик- владелец метаданных, и править нам их запрещено - это значит создание/удаление индекса под запретом. но мы можем дать рекомендации разработчику, если есть проблема. в данном случае, советуем разработчику создать индекс на временную таблицу, чтобы избегать фулл сканов? автортот кусок плана, который вы показали - это жесть. да, за 4 минуты прочесть 51744 строк - это и правда жесть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 17:05:53 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкин, можно попробовать -Doracle.jdbc.defaultPrefetchSize=xxxxx (предполагаю что это Java c Oracle драйверами). ЗЫ Не уверен что сработает однако :(. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 17:16:48 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
авторНам же вы показываете здесь огрызки сферических коней в вакууме так оно и есть. но не всегда есть возможность сделать полноценный трейс: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Такая вот картина... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 17:23:26 |
|
||
|
SQL*Net message from client - SQL*Net more data to client
|
|||
|---|---|---|---|
|
#18+
жвачкин, добавление/удаление индекса не является изменением структуры данных. Вам же никто не предлагает менять определение первичного ключа. жвачкинв данном случае, советуем разработчику создать индекс на временную таблицу, чтобы избегать фулл сканов? дело не в том, чтобы "избегать фулсканов" вообще. В данном конкретном случае фуллскан используется для фильтрации каждой строки, попадающей в отбор после этапа SORT GROUP BY Если запрос у вас возвращает 54000 строк после этапа SORT GROUP BY, то для каждой из них применяется фильтрующий fullscan по той же временной таблице. Проблема здесь в том что у вас не один, а 54000 фуллсканов - на каждую восстановленную строку по персональному фуллскану.. Индекс вынут из того же носа, что и все остальное - из предоставленного вами вакуума. Неудачный индекс сам по себе может дополнительно ухудшить вашу историю. А удачный - (может быть) не только ускорит обе фазы разом, но и позволит преобразовать фильтр в join (запрос вы так и не показали). И ваши 210 секунд превратятся в 0.02 или 0/002 секунд. Т. е. даст выигрыш по времени в 3-4-5 порядков. Но, может оказаться, что к удачному индексу подкрутка запроса прилагаться должна. жвачкинв данном случае, советуем разработчику создать индекс на временную таблицу, чтобы избегать фулл сканов? Интересно, как вы это планируете сформулировать? Мне тут на форуме один booby индекс создать присоветовал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2016, 17:33:25 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39280200&tid=1887782]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
199ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 552ms |

| 0 / 0 |
