Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
Доброе время суток! При разработке столкнулись с такой интересной особенностью... Есть функция возвращающая refcursor одного select'a. Обнаружили одну интересную закономерность... Если, допустим, просто выполнять select, то общее время выполнения будет порядка 300ms. Если выполнить тотже select с теми же параметрами через функцию и попытаться получить результат с помощью FETCH ALL FROM "<unnamed portal 1>", то время выполнения, за которое мы получим все данные, будет сильно различаться. ( В нашем случае оно доходит до 11s). Причем длительность FETCH'a почти прямо пропорционально количеству вытаскиваемых записей. Подскажите, плз, это особенность Postgres'a или наши кривые руки? А если второе, то подскажите, плз, в какую сторону стоит рыть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 13:04 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
Курсоры всегда работали медленнее, чем простые запросы, это особенность всех СУБД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 13:58 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
ZashibisКурсоры всегда работали медленнее, чем простые запросы, это особенность всех СУБД Ну не в сотни же раз... Кроме того, заметили еще одну особенность, время вытаскивания 10 записей из курсора приблизительно занимает в десять раз меньше времени, чем получение последующих 100 записей из того же курсора, а время получения самой первой записи очень похоже на время выполнения select'a. Мне кажется, что такое поведение не очень нормально. Возможно, мы что-то напортачили с настройками... Подскажите, плз, в какую сторону нужно рыть с этими проблемами или где можно получить по такому вопросу консультации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 14:20 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
HAMLOЕсли выполнить тотже select с теми же параметрами через функциюесли параметры select подаются в функцию в качестве аргументов, постгрес может выбрать другой план выполнения запроса. а вообще давайте полную информацию: текст запроса, explain analyze запроса, текст создания функции, explain analyze select function(), explain analyze fetch from cursor,.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 14:37 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
Текст запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Его план выполнения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Код: plaintext 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. План выполнения функции: Код: plaintext 1. 2. 3. 4. Честно говоря, как посмотреть пла fetch'a - я не понял :( Подскажите, плз, тупорылому программеру... Да! Чуть было не забыл! Версия PostgreSQL 8.3 Буду крайне благодарен за любые советы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 15:45 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
HAMLOЧестно говоря, как посмотреть пла fetch'a - я не понял :(да, это я загнул. здесь интересен не план фетча (который видимо элементарный и одинаковый), а время его выполнения (первого, который у вас медленный, и последующих порциями разного объема), например в psql можно получить время выполнения запроса включив \timing. еще можете протестировать скорость работы с курсором не через функцию, а через запросы DECLARE, FETCH. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 16:16 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat...здесь интересен не план фетча (который видимо элементарный и одинаковый), а время его выполнения (первого, который у вас медленный, и последующих порциями разного объема), например в psql можно получить время выполнения запроса включив \timing. еще можете протестировать скорость работы с курсором не через функцию, а через запросы DECLARE, FETCH. Поэксперементировал со временем :) SELECT выполняется и получает результаты, в среднем, за 250 ms Время выгребания из курсора, полученным функцией или с помощью DECLARE, FETCH - приблизительно, одинаковые. Количество строк везде одинаковое - 144. Результаты такие: При выгребании по 5 строк ~400 ms за порцию При выгребании по 10 строк ~800 ms за порцию При выгребании по 30 строк ~2400 ms за порцию При выгребании по 50 строк ~5400 ms за порцию При выгребании по 100 строк ~8200-8300 ms за порцию При выгребании всего курсора - 11000-12000 ms Самое забавное, что результаты хорошо подходят друг к другу методом простого умножения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 16:39 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
А если провести эксперимент с курсором на какой-нибудь таблице, где больше 200 тысяч записей? Сделать простую выборку Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 18:49 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
Мы активно используем функции, возвращающие объемные курсоры. По сравнению с обычным запросом накладные расходы в единицах %. Однако есть отличие - клиентское приложение сразу же делает fetch в грид и отпускает транзакцию. примерно так: begin; select function('cursor_name'); fetch all from cursor_name; commit; Сравните, будет ли различаться время при исполнении в консоли, если держать транзакцию или сразу коммитить? Как мне кажется, пока вы не начали чтение данных их курсора, размер транзакции минимален. Фетч первых 10 записей тут же создает изоляцию для них по всем задействованным таблицам. Если в это время еще кто-то читает по тому же месту - размер транзакции будет расти и расти. __ В моем случае время исполнения вот такого запроса http://sql.ru/forum/actualthread.aspx?tid=523544 лишь на 25-30мс меньше, чем fetch курсора из функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2008, 22:23 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
tadmin Как мне кажется, пока вы не начали чтение данных их курсора, размер транзакции минимален. Фетч первых 10 записей тут же создает изоляцию для них по всем задействованным таблицам. Если в это время еще кто-то читает по тому же месту - размер транзакции будет расти и расти. __ В моем случае время исполнения вот такого запроса http://sql.ru/forum/actualthread.aspx?tid=523544 лишь на 25-30мс меньше, чем fetch курсора из функции. Это все, наверное так, но по тому примеру, как Вы привели время расфетчивания курсора составляет что-то около 11-12 сек против 0.2-0.3 сек. при простом select'e. Это и показалось мне очень, гх-м..., странным. Вот я и обратился за помощью народа. Может кто-то чего-то знает или сталкивался с такими проблемами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2008, 11:16 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
Доброе время суток! Поигрался я с этой проблемой с разными версиями PostgreSQL'я с одними и теми же данными. Общий вывод такой: Проблема имеет место быть только на версии 8.3.0. На версиях 8.2.4 и 8.2.6 ее не существует. Так что, к сожалению, переходить на 8.3 еще ранова-то :( Пожскажите, плз, с кем лучше связаться (из русскоговорящих :) ) разработчиков, чтобы описать этот заковык... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2008, 14:08 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
у нас проект переведен на 8.3. Есть минимум 5-6 разных функций, который возвращают большие курсоры по х10К записей. Похожих проблем не было. 1) проверяли, воспроизводится ли подобный эффект в: - вашем приложении? - в PGAdmin? - в консоли? 2) Нет ли у вас тестового набора данных, чтобы я мог воспроизвести у себя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2008, 10:28 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
tadmin 1) проверяли, воспроизводится ли подобный эффект в: - вашем приложении? - в PGAdmin? - в консоли? Эффект оказался удивительно стойким. В приложении - воспроизводиться. В PGAdmin - воспроизводиться В консоли - воспроизводиться, как с удаленной машины, так и на локольном хосте, где живет БД. tadmin 2) Нет ли у вас тестового набора данных, чтобы я мог воспроизвести у себя? На данный момент - нет. Постараюсь в течение суток - двух подготовить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2008, 11:02 |
|
||
|
Огромная разница по времени между FETCH'ем из курсора и выполнением select'a
|
|||
|---|---|---|---|
|
#18+
ZashibisКурсоры всегда работали медленнее, чем простые запросы, это особенность всех СУБДТолько что проверил для Oracle, - разница практически не заметна (менее 0.01 сек для полного фетча 121 000 записей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2008, 21:02 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35153349&tid=2004517]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 404ms |

| 0 / 0 |
