|
|
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Всем привет. Странное поведение ИМХО. сделал: Код: sql 1. выполняю запрос: Код: sql 1. 2. 3. такой план: Код: sql 1. 2. 3. незначительно меняю запрос: Код: sql 1. 2. 3. теперь такой план: Код: sql 1. 2. 3. 4. 5. 6. как сделать чтобы и во втором запросе был план как в первом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:05:16 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_, для начала привести реальный 2-й запрос, а то как-то не того-этого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 12:09:53 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
--поправил, разница в пять минут s.start_datetime < '2014-08-01 00:55' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 13:33:08 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_, А можно вывод Код: sql 1. глянуть, на оба варианта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 14:17:05 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorov, первый Код: sql 1. 2. 3. 4. 5. 6. Код: sql 1. 2. 3. стал работать "правильно" смещаю еще на пять минут Код: sql 1. 2. 3. не могу дождаться выполнения ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 14:59:28 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_, SELECT count(1) FROM session; ? ЗЫ сделайте CTE выборку по времени, а только от него -- агрегат. Будет аналогично 1-му всегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 15:24:15 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
--поправилGold_, SELECT count(1) FROM session; ? ЗЫ сделайте CTE выборку по времени, а только от него -- агрегат. Будет аналогично 1-му всегда 122860475 спасибо! так и сделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2014, 16:16:55 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Сделал. Но вопрос остался. Почему выбирался такой план? "PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 10:01:57 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_Сделал. Но вопрос остался. Почему выбирался такой план? Я полагаю, что в таблицу данные прибывают резвенько, а с настройками по умолчанию для больших таблиц `autvacuum` приходит все реже. Вот база и посчитала, что ей будет выгоднее пойти по индексу `sessions_pkey`. Связано может быть с тем, что на момент запроса гистограмма показала ожидание по записям существенно выше реального. Рекомендую сделать так Код: sql 1. 2. 3. Это увеличит размер гистограммы для колонки `start_datetime` и заставит систему анализировать таблицу чаще. Должно стать лучше. Gold_"PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3, 64-bit" Надо до 9.2.9 апгрейднутся, дырки были. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 10:36:06 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorov, спасибо - попробую! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 12:51:27 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorov, Вообще перед стартом топика пробовал так: Код: sql 1. 2. не помогло. сейчас проверю еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 13:02:38 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_ Код: sql 1. 2. Как по мне — 10000 много слишком. А вы могли бы подобрать такие значения `start_datetime`, чтобы повторить начальную ситуацию и запостить `EXPLAIN (analyze, buffers)` работающего диапазона `EXPLAIN` “бесконечного” диапазона `EXPLAIN (analyze, buffers)` для “бесконечного” диапазона с CTE Хочется глянуть на ожидания и реальные цифры. А индекс на `(strat_datetime,id)` рассматривался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 14:14:14 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorov, `EXPLAIN (analyze, buffers)` работающего диапазона Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. `EXPLAIN` “бесконечного” диапазона Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. `EXPLAIN (analyze, buffers)` для “бесконечного” диапазона с CTE Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 14:45:40 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
sessions_pkey это индекс на id ??? ну так у тебя там min(s.id) стоит. Это сбивает оптимизатор, понятно почему, никакая статистика тут не поможет. Ибо в ней нет данных о том как быстро при проходе по индексу по id от меньшего к большему мы попадем на запись в нужном интервале дат!! запрос вида: SELECT count(s.id) FROM sessions s WHERE s.start_datetime >= '2014-08-01 00:00' AND s.start_datetime < '2014-08-01 00:55' будет работать всегда по быстрому плану. так что попробуйте SELECT count(s.id),min(s.id) FROM sessions s WHERE s.start_datetime >= '2014-08-01 00:00' AND s.start_datetime < '2014-08-01 00:55' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:22:41 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_, Ожидания совпадают. Не могу сказать почему оптимизатор решает, что пройти по `session_pkey` с фильтром ему будет дешевле. Попробуйте обновиться. Если возможно — поделитесь снимком таблички? Или хотя бы описанием ее (`\d sessions` в psql) и выводом запроса: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:41:54 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Duraksessions_pkey это индекс на id ??? ну так у тебя там min(s.id) стоит. Это сбивает оптимизатор, понятно почему, никакая статистика тут не поможет. Ибо в ней нет данных о том как быстро при проходе по индексу по id от меньшего к большему мы попадем на запись в нужном интервале дат!! А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:49:08 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Duraksessions_pkey это индекс на id ??? ну так у тебя там min(s.id) стоит. Это сбивает оптимизатор, понятно почему, никакая статистика тут не поможет. Ибо в ней нет данных о том как быстро при проходе по индексу по id от меньшего к большему мы попадем на запись в нужном интервале дат!! запрос вида: SELECT count(s.id) FROM sessions s WHERE s.start_datetime >= '2014-08-01 00:00' AND s.start_datetime < '2014-08-01 00:55' будет работать всегда по быстрому плану. так что попробуйте SELECT count(s.id),min(s.id) FROM sessions s WHERE s.start_datetime >= '2014-08-01 00:00' AND s.start_datetime < '2014-08-01 00:55' Ivan Durak, "sessions_pkey это индекс на id ?" Да Да работает, но это скорее похоже на CTE Объяснение не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 15:52:32 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorovIvan Duraksessions_pkey это индекс на id ??? ну так у тебя там min(s.id) стоит. Это сбивает оптимизатор, понятно почему, никакая статистика тут не поможет. Ибо в ней нет данных о том как быстро при проходе по индексу по id от меньшего к большему мы попадем на запись в нужном интервале дат!! А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… он не пессеместичен. Он оптимизирован! Ведь для вычисления min(id) и ежу понятно что проще взять поиском одну запись в индексе, а не сканить всё. Но у тебя не просто одна запись минимальная, а еще фильтр. Представь себе теперь что твой фильтр по датам покрывает весь диапазон в таблице. Какой план теперь оптимален?? Ответ - взять по индексу sessions_pkey первую запись! И тут все дело в распределении. Как распределятся даты относительно id. Такой информации нету в статистике. И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id примерно к 100-й записи даст нам одну подпадающую под фильтр) Все, профит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 19:43:32 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Durakон не пессеместичен. Он оптимизирован! Ведь для вычисления min(id) и ежу понятно что проще взять поиском одну запись в индексе, а не сканить всё. Но у тебя не просто одна запись минимальная, а еще фильтр. Представь себе теперь что твой фильтр по датам покрывает весь диапазон в таблице. Какой план теперь оптимален?? Ответ - взять по индексу sessions_pkey первую запись! И тут все дело в распределении. Как распределятся даты относительно id. Такой информации нету в статистике. И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id примерно к 100-й записи даст нам одну подпадающую под фильтр) Все, профит Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 20:36:39 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorovIvan Duraksessions_pkey это индекс на id ??? ну так у тебя там min(s.id) стоит. Это сбивает оптимизатор, понятно почему, никакая статистика тут не поможет. Ибо в ней нет данных о том как быстро при проходе по индексу по id от меньшего к большему мы попадем на запись в нужном интервале дат!! А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… надо уточнить у руководство. еще интересно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 21:08:54 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Durakvyegorovпропущено... А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… он не пессеместичен. Он оптимизирован! Ведь для вычисления min(id) и ежу понятно что проще взять поиском одну запись в индексе, а не сканить всё. Но у тебя не просто одна запись минимальная, а еще фильтр. Представь себе теперь что твой фильтр по датам покрывает весь диапазон в таблице. Какой план теперь оптимален?? Ответ - взять по индексу sessions_pkey первую запись! И тут все дело в распределении. Как распределятся даты относительно id. Такой информации нету в статистике. И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id примерно к 100-й записи даст нам одну подпадающую под фильтр) Все, профит Объяснение в принципе понятно, но про процент не очень. Перефразирую Вас (как я понял) И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id после 1% записей даст нам одну подпадающую под фильтр) правильно? Тогда вопросы по плану: Код: plaintext 1. 2. 3. 4. 5. 6. стоимость 14310657.98 - это стоимость поднятие индекса целиком? но 2491 записи оптимизатор, думает что найдет подходящий запись? Тогда процент перехода примерно 0,04 процента (5744.95/14310657.98*100) Но, тогда нет объяснение, как запрос работал месяц назад - от общего количества процент был меньше, а план был "правильным" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 21:50:22 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Durakvyegorovпропущено... А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… он не пессеместичен. Он оптимизирован! Ведь для вычисления min(id) и ежу понятно что проще взять поиском одну запись в индексе, а не сканить всё. Но у тебя не просто одна запись минимальная, а еще фильтр. Представь себе теперь что твой фильтр по датам покрывает весь диапазон в таблице. Какой план теперь оптимален?? Ответ - взять по индексу sessions_pkey первую запись! И тут все дело в распределении. Как распределятся даты относительно id. Такой информации нету в статистике. И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id примерно к 100-й записи даст нам одну подпадающую под фильтр) Все, профит да, Вы правы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: sql 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. SELECT 1.58/38889.36*100 0.004062807924841139067300 только процент меньший, но и условия другие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 22:22:15 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Gold_надо уточнить у руководство. еще интересно? Нет, спасибо. Уточните, пожалуйста, за сколько месяцев у вас там данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 22:53:51 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
vyegorovGold_надо уточнить у руководство. еще интересно? Нет, спасибо. Уточните, пожалуйста, за сколько месяцев у вас там данные? в этой таблице с 2012 года ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2014, 23:02:24 |
|
||
|
Странное план ИМХО.
|
|||
|---|---|---|---|
|
#18+
Ivan Durakvyegorovпропущено... А я не понимаю. С моей точки зрения оптимизатор должен быть пессимистичен и оценивать проход по `sessions_pkey` как проход по всему индексу с фильтрацией. Что должно быть явно дороже прохода по части другого индекса. Я потому и прошу снимок таблицы, чтобы побаловаться, индексы подропать… он не пессеместичен. Он оптимизирован! Ведь для вычисления min(id) и ежу понятно что проще взять поиском одну запись в индексе, а не сканить всё. Но у тебя не просто одна запись минимальная, а еще фильтр. Представь себе теперь что твой фильтр по датам покрывает весь диапазон в таблице. Какой план теперь оптимален?? Ответ - взять по индексу sessions_pkey первую запись! И тут все дело в распределении. Как распределятся даты относительно id. Такой информации нету в статистике. И он угадывает по принципу (если в фильтре по датам выбирается 1% таблицы, значит перебор последовательных id примерно к 100-й записи даст нам одну подпадающую под фильтр) Все, профит нахер-нахер такую оптимизацию PS предположение о полной независимости распределения временных отсечек и id -- крайне редко выполняется. часто оно почти монотонно. т.е. последний процент дат будет лежать рядом с последним процентом id надеюсь таки в "пописать оптимайзер" таких долбо..бов за профитом не пускают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2014, 03:57:29 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=124&tid=1998522]: |
0ms |
get settings: |
4ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
265ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 191ms |
| total: | 533ms |

| 0 / 0 |
