powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разный результат EXPLAIN
9 сообщений из 9, страница 1 из 1
разный результат EXPLAIN
    #33346845
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем может быть вызвана такая разница ? Значение id_group = 10688 есть в таблице, а значения id_group = 1234 нет.

Код: plaintext
1.
2.
EXPLAIN SELECT * FROM gr_graphic WHERE id_group =  10688 ;
 Seq Scan on gr_graphic  (cost= 0 . 00 .. 508 . 79  rows= 389  width= 1149 )
 Filter: (id_group =  10688 )
Код: plaintext
1.
2.
3.
EXPLAIN SELECT * FROM gr_graphic WHERE id_group =  1234 ;
 Index Scan using gr_graphic_1 on gr_graphic  (cost= 0 . 00 .. 262 . 28  rows= 91  width= 1149 )
 Index Cond: (id_group =  1234 )

Индекс создан командой:
Код: plaintext
CREATE INDEX gr_graphic_1 ON gr_graphic USING btree (id_group);

postgres (PostgreSQL) 7.3.4
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33347283
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разными предполагаемыми кол-вами строк, удовлетворяющими условиям id_group=10688 и id_group=1234.

rows=389

rows=91
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33347626
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице около 2-х тысячи записей?
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33347747
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дык эти значения на статистике таблицы основанно.. а она приблизительная. vacuum analuze сделай и посмотри что в експлейне поменялось
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33347941
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearдык эти значения на статистике таблицы основанно.. а она приблизительная. vacuum analuze сделай и посмотри что в експлейне поменялось

Или explain analyze
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33349326
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таблице чуть больше 3000 записей.
Поле id_group не уникальное.

Мне не понятно почему в первом случае не используется индекс, а во втором используется ? Как оптимизатор может знать изначально есть такое значение в таблице или нет ?

VACUUM ANALYZE gr_graphic; - ни чего принципиально не меняет.

EXPLAIN ANALYZE возвращает ожидаемые результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 
EXPLAIN ANALYZE SELECT * FROM gr_graphic WHERE id_group =  10688 ;
Seq Scan on gr_graphic  (cost= 0 . 00 .. 519 . 30  rows= 365  width= 1149 ) (actual time= 0 . 23 .. 105 . 67  rows= 343  loops= 1 )
   Filter: (id_group =  10688 )
 Total runtime:  106 . 42  msec
( 3  rows)

EXPLAIN ANALYZE SELECT * FROM gr_graphic WHERE id_group =  1234 ;
  Index Scan using gr_graphic_1 on gr_graphic  (cost= 0 . 00 .. 345 . 40  rows= 94  width= 1149 ) (actual time= 0 . 40 .. 0 . 40  rows= 0  loops= 1 )
   Index Cond: (id_group =  1234 )
 Total runtime:  0 . 59  msec
( 3  rows)
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33349362
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну видимо планер подумал(посмотрел в статистику таблици и решил) что пробежать таблицу целиком и найти id_group=10688 быстрее чем при этом еще и индекс открывать... такое бывает когда id_group=10688 в таблице встречается достаточно часто

в твоем случае планер по статистике определили что в таблице ~10%(365) записей с id_group=10688 в реале получилос чуть поменьше (343) .

Seq Scan on gr_graphic (cost=0.00..519.30 rows=365 width=1149) (actual time=0.23..105.67 rows=343 loops=1)

во втором запросе предположил что 94 т.е ~ 3% поэтому и подумал что быстрее использовать индекс .
Index Scan using gr_graphic_1 on gr_graphic (cost=0.00..345.40 rows=94 width=1149) (actual time=0.40..0.40 rows=0 loops=1)

проведи експеремент... выключи seqscan, и опять запусти свои два експлейна
не думаю что первый станет быстрее отробатывать хотя начнет использовать индекс.

и експеремент номер 2 (посмотри со включенным и выключенным seqscan)
удали из таблицы все строки с id_group=10688 кроме одной, далее вакку аналузе,реиндекс и опять експлейны.
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33349793
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava_P
Мне не понятно почему в первом случае не используется индекс, а во втором используется ? Как оптимизатор может знать изначально есть такое значение в таблице или нет ?

1.Индекс используется, если их таблицы выбирается менее 10% записей,
иначе полное сканирование выгоднее.
2.Для этой оценки используется статистика. Поэтому собсно и есть explain, который показывает, что думает оптимизатор, и explain analyze, который показывает, что получилось в результате
...
Рейтинг: 0 / 0
разный результат EXPLAIN
    #33349980
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava_PКак оптимизатор может знать изначально есть такое значение в таблице или нет ?В процессе сбора стастики VACUUM ANALYZE он может узнать эту информацию.

mwolf1.Индекс используется, если их таблицы выбирается менее 10% записей,
иначе полное сканирование выгоднее.Точное число (10%) наверное зависит от настроек планировщика и, возможно, других параметров (средней длины строки таблицы и строки индекса,..).
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разный результат EXPLAIN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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