|
|
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Приветствую. В Postgress 9.2 запросах случайно нарвались на такую хрень: Для таблиц вида create table a ( id, field1 int, ..., primary key (id)) с indexed (btree) field1 почему-то field1 between x and x согласно explain plan работает лучше (по стоимости) чем field1 = x. Это фича такая о которой все знают, или просто локальная аномалия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 15:58 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Alex MarmuzevichПриветствую. В Postgress 9.2 запросах случайно нарвались на такую хрень: Для таблиц вида create table a ( id, field1 int, ..., primary key (id)) с indexed (btree) field1 почему-то field1 between x and x согласно explain plan работает лучше (по стоимости) чем field1 = x. Это фича такая о которой все знают, или просто локальная аномалия? explain показывает план а не реальное время выполнения... попробуйте explain analyze для начала у меня получается 0.050ms для between и 0.045ms для = Цена планов равная в пределах погрешности. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 16:11 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Ясно. Под explain plan я имел ввиду выполнение EXPLAIN (ANALYZE on, VERBOSE off, COSTS on, BUFFERS off, TIMING on ) (т.е. с выполнеением запроса). И делал эта неоднократно. И, раз уж для ответа на вопрос "фича, о которой все знают, или аномалия", то на всякий случай привожу детали: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Собственно таблица: Код: 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. В таблице примерно 15 000 000 записей. Похожее поведение видел и на других таблицах с другой структурой и другим количеством записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 17:32 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Да... Ожидалось то, что between будет или чуть медленее, или как-минимум такой же, как и equal. Но результат, когда between значительно быстрее чем простое сравнение несколько убил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 17:37 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Alex Marmuzevich, результат интересный, но видимо вы что-то не так померяли вот это вот смените на Код: plaintext есть подозрение что вы таки на теплых данных мерили between , а на холодных -- все остальное и побпробуйте явный каст к bigint. если это чудеса операторов-- надо посмотреть и в эту сторону (но в планах я подозрительного не вижу). т.е. потщательнее бы, что ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 19:39 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
PS на 9.3.7. не воспроизводится Код: sql 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. 49. 50. 51. 52. 53. 54. 55. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 20:14 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Alex Marmuzevich, есть подозрение на большой bloat в таблице/индексе, но как это влияет не очень понятно. какой размер у индекса? и можно привести explain обоих запросов (без analyze) с \timing on ? (звучит странно, но на всякий случай). воспроизвести пока не удалось, у меня between чуть медленней всегда работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 20:26 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Итак, ставим буфера (EXPLAIN (ANALYZE on, VERBOSE on, COSTS on, BUFFERS on, TIMING on )) Получаем Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. (Специально прогнал equal запрос дважды). Инфа по таблице: Код: sql 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. Информация по индексу Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 20:44 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
AlexiusAlex Marmuzevich, есть подозрение на большой bloat в таблице/индексе, но как это влияет не очень понятно. какой размер у индекса? и можно привести explain обоих запросов (без analyze) с \timing on ? (звучит странно, но на всякий случай). воспроизвести пока не удалось, у меня between чуть медленней всегда работает. Э... как-бы EXPLAIN option TIMING requires ANALYZE... Или имелось ввиду что-то другое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 20:47 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Alex Marmuzevich, хм, а в приведенных планах то разницы во времени выполнения не видно той, которая была. может на холодных данных первый запрос выполнялся? имелось ввиду \timing в psql, чтобы посмотреть время выполнения самого explain, но тут похоже это не оно. размер индекса нормальный для такой таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 20:58 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
AlexiusAlex Marmuzevich, хм, а в приведенных планах то разницы во времени выполнения не видно той, которая была. может на холодных данных первый запрос выполнялся? имелось ввиду \timing в psql, чтобы посмотреть время выполнения самого explain, но тут похоже это не оно. размер индекса нормальный для такой таблицы. На каких холодных? Делаю запрос. Возвращается примерно 3500 записей за 62 ms. Строю план (см выше). Меняю параметры. Делаю запрос - скорость примерно такая же. Строю план - стоимость как скала. Поведение equal-between - не изменяется. Тут скорее получаем что данные горячие. Вроде слухи ходили, что после перезапуска сервера запрос примерно 60 секунд выполнялся, но проверить не могу (нет возможности перезагрузить сервер). Ради интереса сделал discard all, но это ни на что не повлияло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 21:29 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
Кстати, explain в среднем выполняется за 60-80 ms. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 21:30 |
|
||
|
Between лучше Equal
|
|||
|---|---|---|---|
|
#18+
AlexiusAlex Marmuzevich, хм, а в приведенных планах то разницы во времени выполнения не видно той, которая была. может на холодных данных первый запрос выполнялся? имелось ввиду \timing в psql, чтобы посмотреть время выполнения самого explain, но тут похоже это не оно. размер индекса нормальный для такой таблицы. ну да, разницы то теперь никакой. но тс закусил удила. уже невменяем, похоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2015, 21:45 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=109&tid=1997936]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
20ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 350ms |

| 0 / 0 |
