|
|
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Всем привет! Стоит такая задача. Последовательно выполняются 4 запроса к БД в разных транзакциях (каждый обернут в транзакцию - это критично). Внутри каждого из этих запросов есть одинаковый подзапрос. Вопрос - как добиться гарантированного кеширования этого подзапроса для уменьшения общего времени выполнения задачи? Версия PostgreSQL 9.4 Дело в том, что на одной БД вроде как ускорение происходит, а на другой - нет. Текст запроса примерно следующий Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Может показаться, что тут нет подзапроса, но планировщик не показывает разницы с вариантом, если обращение к таблице suggest_term обернуть в подзапрос. Один из вариантов решения проблемы, который я вижу - использование временных таблиц. Т.е. прежде, чем выполнять основные запросы, сделать выборку внутреннего подзапроса во временную таблицу. После выполнения запросов, удалить ее. Вопрос - не будет ли создана сильная нагрузка на БД из-за временных таблиц? Будут ли временные таблицы храниться только в оперативной памяти? Может быть у вас есть другие варианты решения проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 11:07 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Igor Lazarevдругие варианты решения в одной транзакции будет гарантия последовательного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 11:44 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Petro123, тогда не получится одновременно вытаскивать кол-во записей и фильтрованные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 12:05 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Igor Lazarev(каждый обернут в транзакцию - это критично). я вот это не понял. Я не знаю как тут работает оптимизатор в данной БД. Но, либо делать всё в одном соединении и одной транзакции, либо параллельно в разных, но тогда от клиента зависит. Что он делает с 4-мя параллельными запросами. (результатами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 12:16 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Igor Lazarev, Кэшируются не подзапросами, а данные, которые они обрабатывают. ответ - никак, и в то же время - ничего делать не нужно, данные уже закэшированы, при условии, что кэш большой, данные использования одни и те же, и все такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 19:21 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
[i]Может показаться, что тут нет подзапроса, но планировщик не есть тут или нет под запросы - совсем неважно. Один из вариантов решения проблемы, который я вижу - использование временных таблиц. не пойдет, у тебя разные транзакции... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 19:23 |
|
||
|
Кеширование подзапроса для последовательности транзакций
|
|||
|---|---|---|---|
|
#18+
Да никак. Четыре разные транзакции в общем случае получат четыре разных ответа на эти подзапросы. Данные-то между запросами могут быть модифицированы другими клиентами. Materialized view можно попробовать соорудить, если есть надежда, что данные подзапроса в основном статичные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 22:11 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1997474]: |
0ms |
get settings: |
8ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
196ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 522ms |

| 0 / 0 |
