
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
07.05.2015, 15:09
|
|||
|---|---|---|---|
|
|||
Слишком оптимистичный LIMIT |
|||
|
#18+
Есть такой простой запрос: Код: sql 1. 2. 3. 4. При выполнении получаем такой, очевидно неправильный план: Код: sql 1. 2. 3. 4. 5. 6. 7. Меняю запрос на: Код: sql 1. 2. 3. 4. Получаю : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Собсно логику Postgres можно понять. Он берет cost получения всех записей 209017.54 делит на количество результирующих рядов 6383 и умножает на кол-во LIMIT 19 - и получает 622,6. При этом у плана с поиском всех receiptDetail с заданным значением, а потом упорядочивания cost 1000, то есть формально выше. Но при этом проблема в том, что Postgres естественным образом не учитывает корелляцию (так как чеки проводятся порциями и номера чеков идут по возрастанию), и тем самым "плюет на дисперсию". Как вообще можно бороться с такими случаями? Может есть какой-то способ увеличить cost при Limit'е (чтобы лучше работать в крайних случаях)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.05.2015, 15:35
|
|||
|---|---|---|---|
Слишком оптимистичный LIMIT |
|||
|
#18+
Nitro_Junkie, как бороться -- вы сами уже успешно заборолись. а если запросы часты -- Код: sql 1. -- оно вам заборет сканирование всего индекса при плохой корреляции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=1998004]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 331ms |

| 0 / 0 |
