Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему может не применятся индекс? / 13 сообщений из 13, страница 1 из 1
12.12.2018, 22:33
    #39746991
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
извиняюсь не могу прислать план выполнения.

Версия постгри 9.6
Имеется таблица условно назовем ее t у нее есть ссылочное поле "c" на нем висит констрейн и индекс, на время активной вставки в нее ~65тыс строк были удалены все индексы и констрейны. После чего созданы обратно.
Одинаковые значения в поле "с" встречаются с частотой от 1 до 5 раз, как говорится почти идеальный вариант для индексов, только планировщик так не считает и запрос
Код: plsql
1.
select * from t where c = 100;


дает полное сканирование таблицы с стоимостью в 10000000000..10000000xxx единиц.
Код: plsql
1.
analyze t;

делал - не помогает.
причем проблема такая с несколькими таблицами, на другой таблице с числом записей около 13млн помогло повторное удаление индексов и констрейнов с поля и создания их заново. А с этой какая то засада.
...
Рейтинг: 0 / 0
12.12.2018, 23:33
    #39747019
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
С стоимостью в 10000000000 единиц разобрался - это была реакция на отключение enable_seqscan, но даже в этом случае индекс не применялся
...
Рейтинг: 0 / 0
13.12.2018, 04:14
    #39747044
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Swa111С стоимостью в 10000000000 единиц разобрался - это была реакция на отключение enable_seqscan, но даже в этом случае индекс не применялся

1)покажите целиком запрос как есть

2)покажите итоги explain analyze целиком

3)покажите \d+ имя таблицы (тоже целиком)

тогда и обсудим что не так.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
13.12.2018, 09:40
    #39747125
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Код: plsql
1.
explain analyze select * from tcardaccept where idCard = 1694841



Seq Scan on tcardaccept (cost=0.00..3644.32 rows=1 width=309) (actual time=24.077..37.350 rows=1 loops=1)
Filter: (idcard = '1694841'::numeric)
Rows Removed by Filter: 47465
Planning time: 0.197 ms
Execution time: 37.394 ms

Код: plaintext
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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
                                                                    Table "public.tcardaccept"
       Column       |            Type             |           Modifiers            | Storage  | Stats target 
--------------------+-----------------------------+--------------------------------+----------+--------------
 id                 | numeric(16,0)               | not null                       | main     |              
 idcard             | numeric(16,0)               |                                | main     |              
 dbeginwork         | timestamp without time zone |                                | plain    |              
 ddismissed         | timestamp without time zone |                                | plain    |              
 lmainwork          | character varying(1)        | default 'N'::character varying | extended |              
 idworknature       | numeric(16,0)               |                                | main     |              
 idordercontract    | numeric(16,0)               |                                | main     |              
 idorderdism        | numeric(16,0)               |                                | main     |              
 idorderbegin       | numeric(16,0)               |                                | main     |              
 iddismissact       | numeric(16,0)               |                                | main     |              
 iddismissreason    | numeric(16,0)               |                                | main     |              
 dbegintrial        | timestamp without time zone |                                | plain    |              
 dendtrial          | timestamp without time zone |                                | plain    |              
 dcontractdate      | timestamp without time zone |                                | plain    |              
 snm                | character varying(254)      |                                | extended |              
 idcardtype         | numeric(16,0)               |                                | main     |              
 identrytype        | numeric(16,0)               |                                | main     |              
 iddismissreasonext | numeric(16,0)               |                                | main     |              
 dcontractdateend   | timestamp without time zone |                                | plain    |              
 lcontractfixeddate | character varying(1)        | default 'N'::character varying | extended |              
 lirregularwork     | character varying(1)        | default 'N'::character varying | extended |              
 idcreator          | numeric(15,0)               |                                | main     |              
 ideditor           | numeric(15,0)               |                                | main     |              
 dcreatedatetime    | timestamp without time zone |                                | plain    |              
 deditdatetime      | timestamp without time zone |                                | plain    |              
 idparent           | numeric(16,0)               |                                | main     |              
Indexes:
    "pk_tcardaccept" PRIMARY KEY, btree (id), tablespace "pgindex"
    "ak_tcardaccept_card_begnwork" UNIQUE, btree (idcard, dbeginwork)
    "usr_tcardaccept" UNIQUE, btree (idcard, ddismissed, dbeginwork)
    "ix_tcardaccept_id_parent_card" btree (id, idparent, idcard)
    "ix_tcardaccept_parent_card_id" btree (idparent, idcard, id)
    "xif2126tcardaccept" btree (idcreator)
    "xif2127tcardaccept" btree (ideditor)
    "xif2493tcardaccept" btree (idparent)
    "xif612tcardaccept" btree (idcard)
    "xif613tcardaccept" btree (iddismissreason)
    "xif614tcardaccept" btree (iddismissact)
    "xif615tcardaccept" btree (idordercontract)
    "xif616tcardaccept" btree (idorderbegin)
    "xif617tcardaccept" btree (idorderdism)
    "xif618tcardaccept" btree (idworknature)
    "xif698tcardaccept" btree (idcardtype)
    "xif882tcardaccept" btree (identrytype)
    "xif883tcardaccept" btree (iddismissreasonext)
Check constraints:
    "ck_tcardaccept_ctrtfixeddate" CHECK (lcontractfixeddate::text = ANY (ARRAY['Y'::character varying::text, 'N'::character varying::text]))
    "ck_tcardaccept_irregularwork" CHECK (lirregularwork::text = ANY (ARRAY['Y'::character varying::text, 'N'::character varying::text]))
    "ck_tcardaccept_mainwork" CHECK (lmainwork::text = ANY (ARRAY['Y'::character varying::text, 'N'::character varying::text]))
Foreign-key constraints:
    "t_2126" FOREIGN KEY (idcreator) REFERENCES tuser(id)
    "t_2127" FOREIGN KEY (ideditor) REFERENCES tuser(id)
    "t_2493" FOREIGN KEY (idparent) REFERENCES tcardaccept(id)
    "t_612" FOREIGN KEY (idcard) REFERENCES tcard(id)
    "t_613" FOREIGN KEY (iddismissreason) REFERENCES tdismissreason(id)
    "t_615" FOREIGN KEY (idordercontract) REFERENCES torder(id)
    "t_616" FOREIGN KEY (idorderbegin) REFERENCES torder(id)
    "t_617" FOREIGN KEY (idorderdism) REFERENCES torder(id)
    "t_698" FOREIGN KEY (idcardtype) REFERENCES tcardtype(id)
    "t_882" FOREIGN KEY (identrytype) REFERENCES tentrytype(id)
    "t_883" FOREIGN KEY (iddismissreasonext) REFERENCES tdismissreasonext(id)
Referenced by:
    <Удалил>
Policies (row security enabled): (none)
Options: macs=false

на другой бд план другой

Index Scan using xif612tcardaccept on tcardaccept (cost=0.42..10.71 rows=2 width=295) (actual time=0.084..0.084 rows=1 loops=1)
Index Cond: (idcard = '1694841'::numeric)
Planning time: 5.670 ms
Execution time: 0.124 ms
...
Рейтинг: 0 / 0
13.12.2018, 10:27
    #39747166
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Swa111,

hmm это точно стандартный постгрес а не поделка какая то левая?
(в стандартной поставке я не припомню Options: macs=false)
и такой же вопрос про ту базу где индекс работает.

Для теста еще попробуйте сделать:
explain analyze select * from tcardaccept where idCard = 1694841::numeric(16,0);


PS: тот кто придумал структуру таблиц на основе Numeric (который на 2 порядка медленее чем bigint/int) - скажем так - альтернативно одаренный... и аналогично про boolean в виде character varying(1).


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
13.12.2018, 10:45
    #39747176
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Maxim Boguk,

Нет, это какая то местная сборка на базе 9.5.1 (в первом посте не правильно указал версию), там где индексы работают - это тот же сервер только другая БД.
Причем на этой же БД есть копия таблицы tcardaccept, но в другой схеме, всего с двумя индексами id и idCard и там индексы работают нормально.

По поводу типов данных тоже много вопросов к архитектору

Явное приведение типов не помогло.
...
Рейтинг: 0 / 0
13.12.2018, 12:01
    #39747269
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Swa111С стоимостью в 10000000000 единиц разобрался - это была реакция на отключение enable_seqscan, но даже в этом случае индекс не применялся
Может indexscan тоже отключен?
Что показывает запрос, там где индекс не используется:
Код: sql
1.
select name, setting from pg_settings where name like 'enable%';
...
Рейтинг: 0 / 0
13.12.2018, 12:07
    #39747272
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Павел Лузанов,

Все включено. Индексы не работают только на нескольких таблицах.
...
Рейтинг: 0 / 0
13.12.2018, 12:31
    #39747297
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Swa111,

А что показывает столбец indisvalid в таблице pg_index для индекса xif612tcardaccept ?
...
Рейтинг: 0 / 0
13.12.2018, 12:40
    #39747306
bff7755a
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
А покажите most_common_vals и most_common_freqs из pg_stats для этого столбца? Может для 99% строк это 1694841 вот он и выбирает seq scan?
...
Рейтинг: 0 / 0
13.12.2018, 13:00
    #39747321
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Павел Лузанов,

indisvalid = true

bff7755a,

конкретно этот код 1694841 вообще не попал в статистику most_common_vals
попробовал код с частотой 0,0005 из most_common_freqs - не помогло по прежнему полное сканирование
попробовал код с частотой 0,00023 - аналогично.

на боевой БД выше индекс correlationЖ: 0.66 против 0,52
+ на тестовой (проблемной) в поле idCard встречается null
...
Рейтинг: 0 / 0
13.12.2018, 13:01
    #39747322
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
bff7755aА покажите most_common_vals и most_common_freqs из pg_stats для этого столбца? Может для 99% строк это 1694841 вот он и выбирает seq scan?

Так приводили же итоги explain analyze...

Seq Scan on tcardaccept (cost=0.00..3644.32 rows=1 width=309) (actual time=24.077..37.350 rows=1 loops=1)
Filter: (idcard = '1694841'::numeric)
Rows Removed by Filter: 47465


1 строка и по плану и в реальности из 50000 почти.
...
Рейтинг: 0 / 0
13.12.2018, 13:05
    #39747326
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не применятся индекс?
Swa111Maxim Boguk,

Нет, это какая то местная сборка на базе 9.5.1 (в первом посте не правильно указал версию), там где индексы работают - это тот же сервер только другая БД.
Причем на этой же БД есть копия таблицы tcardaccept, но в другой схеме, всего с двумя индексами id и idCard и там индексы работают нормально.

По поводу типов данных тоже много вопросов к архитектору

Явное приведение типов не помогло.

Тогда перегрузите таблицу со всеми данными и индексами в стандартную PG, и если там проблемы нет - все вопросы к авторам кривой сборки. Вряд ли вам кто то на счет кастомных сборок и их глюков поможет тут.
Все возможные причины почему в стандартной сборке могло быть такое поведение - уже тут проверили.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему может не применятся индекс? / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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