Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / explain и кол-во записей в результирующем множестве / 3 сообщений из 3, страница 1 из 1
05.07.2018, 03:06
    #39669770
sKot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
explain и кол-во записей в результирующем множестве
Доброго дня, коллеги.

Вопрос по оценочному количеству записей в результирующем множестве при выполнении команды explain:

Есть следующие таблицы:
- таблица договоров (CONTRACT) в ней ~6.2 млн записей.
- таблица подразделений (TMP_DEPS_ID), она не временная, а постоянная, в ней ~3200 записей.

explain по связке этих таблиц показывает 6067061 записей, т.е. примерное кол-во записей в табл CONTRACT:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
explain select * from CONTRACT c__r
    inner join TMP_DEPS_ID __tdi_
            on c__r.DEPARTMENT_ID = __tdi_.ID

Hash Join  (cost=98.54..298857.24 rows=6067061 width=151)
  Hash Cond: ((c__r.department_id)::bigint = __tdi_.id)
  ->  Seq Scan on contract c__r  (cost=0.00..215336.61 rows=6067061 width=143)
  ->  Hash  (cost=53.24..53.24 rows=3624 width=8)
        ->  Seq Scan on tmp_deps_id __tdi_  (cost=0.00..53.24 rows=3624 width=8)



Реальное кол-во записей возвращаемых запросом - 3298016
Код: sql
1.
2.
3.
4.
5.
    select count(*) from CONTRACT c__r
inner join TMP_DEPS_ID __tdi_
        on c__r.DEPARTMENT_ID = __tdi_.ID

3298016



При этом, если добавить дополнительное условие в where, то explain показывает правильное кол-во записей:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
explain select * from CONTRACT c__r
    inner join TMP_DEPS_ID __tdi_
            on c__r.DEPARTMENT_ID = __tdi_.ID
         where  c__r.CONTRACT_ID = 1

Nested Loop  (cost=0.71..12.76 rows=1 width=151)
  ->  Index Scan using pk_contract on contract c__r  (cost=0.43..8.45 rows=1 width=143)
        Index Cond: ((contract_id)::bigint = 1)
  ->  Index Only Scan using idx_tmp_deps_id on tmp_deps_id __tdi_  (cost=0.28..4.30 rows=1 width=8)
        Index Cond: (id = (c__r.department_id)::bigint)



Перенос TMP_DEPS_ID в условие where результата не даёт:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
explain select * from CONTRACT c__r, TMP_DEPS_ID __tdi_
         where c__r.DEPARTMENT_ID = __tdi_.ID

Hash Join  (cost=98.54..298857.24 rows=6067061 width=151)
  Hash Cond: ((c__r.department_id)::bigint = __tdi_.id)
  ->  Seq Scan on contract c__r  (cost=0.00..215336.61 rows=6067061 width=143)
  ->  Hash  (cost=53.24..53.24 rows=3624 width=8)
        ->  Seq Scan on tmp_deps_id __tdi_  (cost=0.00..53.24 rows=3624 width=8)



Столбцы по которым выполняется связывание (CONTRACT.DEPARTMENT_ID и TMP_DEPS_ID.ID) проиндексированы.
vacuum analyze выполнен.

Это нормальное поведение, или есть какой-либо способ получить более близкое к реальности значение кол-ва строк в запросе в explain?
...
Рейтинг: 0 / 0
05.07.2018, 09:24
    #39669819
Alexius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
explain и кол-во записей в результирующем множестве
sKot,

это нормальное поведение, а чем вас не устраивает эта оценка (6М против 3М)? обычно такое небольшое расхождение к проблемным планам не приводит, гораздо хуже когда отличается хотя бы на порядок.
немного поправить возможно получится (не факт), подняв stats target для contract.department_id, тем самым собирая больше статистики, но вот надо ли?
...
Рейтинг: 0 / 0
05.07.2018, 10:25
    #39669852
sKot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
explain и кол-во записей в результирующем множестве
Alexius,

Спасибо, буду дальше смотреть что можно придумать.
Я хотел использовать как примерный count(*) для отображения в пользовательском интерфейсе. Обычный count(*) выполняется ~8 сек, правда, на более сложном запросе. Это я для примера взял простой запрос, т.к. оценки по count'у абсолютно одинаковые.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / explain и кол-во записей в результирующем множестве / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]