powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему может не применятся индекс?
13 сообщений из 13, страница 1 из 1
Почему может не применятся индекс?
    #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
Почему может не применятся индекс?
    #39747019
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С стоимостью в 10000000000 единиц разобрался - это была реакция на отключение enable_seqscan, но даже в этом случае индекс не применялся
...
Рейтинг: 0 / 0
Почему может не применятся индекс?
    #39747044
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111С стоимостью в 10000000000 единиц разобрался - это была реакция на отключение enable_seqscan, но даже в этом случае индекс не применялся

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

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

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

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

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

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

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

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

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

А что показывает столбец indisvalid в таблице pg_index для индекса xif612tcardaccept ?
...
Рейтинг: 0 / 0
Почему может не применятся индекс?
    #39747306
bff7755a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А покажите most_common_vals и most_common_freqs из pg_stats для этого столбца? Может для 99% строк это 1694841 вот он и выбирает seq scan?
...
Рейтинг: 0 / 0
Почему может не применятся индекс?
    #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
Почему может не применятся индекс?
    #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
Почему может не применятся индекс?
    #39747326
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111Maxim Boguk,

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

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

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

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

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


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