|
|
|
Слишком оптимистичный 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:09 |
|
||
|
Слишком оптимистичный LIMIT
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, как бороться -- вы сами уже успешно заборолись. а если запросы часты -- Код: sql 1. -- оно вам заборет сканирование всего индекса при плохой корреляции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2015, 15:35 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=1998004]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 324ms |

| 0 / 0 |
