|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
Коллеги, доброго дня. Есть таблица логов, в корой логируются данные в разрезе внешних систем (индексированный столбец int8): Код: sql 1. 2. 3. 4. 5. 6. 7.
По ней выполняется запрос: Код: sql 1. 2. 3. 4. 5. 6.
Если делаем запрос по LOG_EXT_SYSTEM_ID = 6, то план получается такой: Код: sql 1. 2. 3. 4.
actual time=0.436 Если делаем запрос по LOG_EXT_SYSTEM_ID = 1, то план такой: Код: sql 1. 2. 3. 4.
actual time=21712.679 Запрос всегда пытается получить первые 50 записей. Планы идентичны, все столбцы индексированы. На таблице включены статистики: Код: sql 1. 2.
Вопрос: Почему может возникать такой разброс "actual time", и как уменьшить "actual time" для "LOG_EXT_SYSTEM_ID = 1"? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 01:46 |
|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
ps: кол-во записей в таблице: 53 482 921 Записей с LOG_EXT_SYSTEM_ID = 1 : 68 045 Записей с LOG_EXT_SYSTEM_ID = 6 : 567 154 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 02:11 |
|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
sKot Код: sql 1. 2. 3. 4. 5. 6.
вам нужен составной индекс Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 09:36 |
|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
sKot Вопрос: Почему может возникать такой разброс "actual time", и как уменьшить "actual time" для "LOG_EXT_SYSTEM_ID = 1"? Как уменьшить - уже совершенно верно подсказал коллега qwwq. Теперь к вопросу почему такой разброс. Вы планы привели, если их почитать то видно что база идет последовательно по индексу idx_log_begin перебирая все строки таблицы в порядке idx_log_begin от меньшего к большему Код: plaintext
После чего для каждой строки проверяет условие на LOG_EXT_SYSTEM_ID = <ID индексированного столбца> Код: plaintext
И делает так пока не наберет требуемые вам offset 0 limit 50 строк Код: plaintext
Разница только в одном: для (log_ext_system_id)::bigint = 6 таким образом приходится перебирать Код: plaintext
а для (log_ext_system_id)::bigint = 1 приходится перебирать аж Код: plaintext
Отсюда и разница в скорости. Решение проблемы уже подсказали - составной индекс (два индекса по полям LOG_EXT_SYSTEM_ID и LOG_BEGIN - никак не заменяют в данном случае составной индекс по двум полям). PS: у вас проблему усугубляет то что LOG_EXT_SYSTEM_ID = 1 в таблице расположен неравномерно и в начале таблицы (по полю LOG_BEGIN) таких строк нет. Если бы он был распределен равномерно то понадобилось бы выбирать не 32М строк а всего (кол-во записей в таблице: 53 482 921)/(Записей с LOG_EXT_SYSTEM_ID = 1: 68 045)*(limit 50) строк т.е. где то 30.000 строк или около того. К сожалению на текущем этаме create statistics двумерную гистограмму не строит и не использует иначе бы это было отслежено (create statistics сейчас вычисляет только оценку уникальных значений в статистике и mcv (most common values) список, а это для вашего запроса бесполезно). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2019, 10:11 |
|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
qwwq, Максим, спасибо за совет и за подробное разъяснение. Индекс помог :) Отдельное спасибо Максиму за разъяснения по "Rows Removed by Filter" - я всегда считал, что это записи, отброшенные по индексному фильтру, а не перебранные поштучно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 12:05 |
|
Низкая селективность по индексу
|
|||
---|---|---|---|
#18+
Maxim Boguk, а вот интересно, не сработал ли бы тут худо-бедно брин индекс по LOG_EXT_SYSTEM_ID ? (а оно умеет битмап брина на бтрии ?) . раз оно так почти скластеризовано для 1. не в смысле побить составной -- тот без вариантов шустрее. а сэкономить на объёмах. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2019, 12:24 |
|
|
start [/forum/topic.php?fid=53&tid=1995210]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
152ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 256ms |
0 / 0 |