powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Explain and Indexes
17 сообщений из 17, страница 1 из 1
Explain and Indexes
    #32477347
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
# explain select * from emails where category_id > 2;
QUERY PLAN
------------------------------------------------------------
Seq Scan on emails (cost=0.00..22.50 rows=333 width=154)
Filter: (category_id > 2)
(записей: 2)

# explain select * from emails where category_id = 2;
QUERY PLAN
------------------------------------------------------------------------------
Index Scan using emailsndx1 on emails (cost=0.00..17.07 rows=5 width=154)
Index Cond: (category_id = 2)
(записей: 2)


Если я правильно понимаю эту информацию, то при условии 'category_id = 2' используется индекс, а при условии 'cetegory_id > 2' - нет (т.е. осуществляется полный перебор)

Почему так происходит? Индекс же есть!
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477396
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте сделать vacuum analyze emails.

"(записей: 2)" - Это обозначает что в таблице две строки с category_id > 2, и две - с category_id = 2?
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477426
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
автор"(записей: 2)" - Это обозначает что в таблице две строки с category_id > 2, и две - с category_id = 2?

Нет - записей в таблице 1.000.000. Я её только что создал и не удалял и не редактировал, так что vacuum тут не причём
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477459
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
А вообще какой тип индексов лучше использовать для внешних ключей?
Я читал что индексы btree лучше использовать для числовых полей и полей типа дата/время. А hash - для текстовых полей.
Также пишут что btree лучше подходит для операций <, > и сортировки, а hash - для = и <>.
Внешний ключ - число, применяется операция сравнения. Что выбрать?

Таблица будет иметь несколько миллионов записей.

И ещё несколько наболевших вопросов:
1) Правда ли что unique индексы быстрее, чем простые индексы?
2) При таких объёмах стоит ли индексировать поле типа boolen (имеется/отсутствует)? Может оно без индекса быстрее будет?
3) Стоит ли индексировать поле типа varchar(255) - наименование. По нему будет производится поиск с помощью оператора like (скорее всего на плное вхождение: '%template%')? Eсли стоит, то каким индексом? Hash?

Очень нужна помощь в этом вопросе! Буду длагодарен любым советам.
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477461
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Я её только что создал и не удалял и не редактировал, так что vacuum тут не причём"

Повторюсь: попробуйте сделать vacuum analyze emails. С ключом analyze постгрес собирает статистику, кроме выполнения действий с удаленными/измененными строками.

Если это не поможет, то приведите пожалуйста результат работы двух ваших explain запросов с ключом analyze:
explain analyze select * from emails where category_id > 2;
explain analyze select * from emails where category_id = 2;
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477463
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
авторТаблица будет иметь несколько миллионов записей.
Уточнение: даже несколько десятков миллионов (от 10.000.000 до 100.000.000)
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477470
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
авторЕсли это не поможет, то приведите пожалуйста результат работы двух ваших explain запросов с ключом analyze:
explain analyze select * from emails where category_id > 2;
explain analyze select * from emails where category_id = 2;

# explain analyze select * from emails where category_id = 2;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Index Scan using emailsndx1 on emails (cost=0.00..17.07 rows=5 width=154) (actual time=180.16..41126.74 rows=10130 loops=1)
Index Cond: (category_id = 2)
Total runtime: 41150.82 msec
(записей: 3)

# explain analyze select * from emails where category_id > 2;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Seq Scan on emails (cost=0.00..22.50 rows=333 width=154) (actual time=28.41..6218.24 rows=979922 loops=1)
Filter: (category_id > 2)
Total runtime: 6955.11 msec
(записей: 3)

Вот такие результаты.
Вопрос: analyze собирает статистику для последующей оптимизации. Это значит что analyze нужно делать для всех запросов:
analyze select * from emails where category_id = 1;
analyze select * from emails where category_id = 2;
........
analyze select * from emails where category_id > 1;
analyze select * from emails where category_id > 2;
..........
или достаточно analyze select * from emails?
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477495
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не путайте ключи analyze в командах vacuum и explain - у них разный смысл. В vacuum-е он обозначает сбор статистической инфы о таблице. В explain-е - реальное выполнение запроса и выдачу реальной статистики запроса наряду с предполагаемой. Подробнее смотрите в доках.

"Вопрос: analyze собирает статистику для последующей оптимизации. Это значит что analyze нужно делать для всех запросов"

Надо сделать лишь "vacuum analyze emails" или "vacuum analyze" для сбора статистики по всем таблицам в базе. Подробнее смотрите в доках.

Результаты двух "explain analyze ...", которые вы привели получены после выполнения "vacuum analyze emails"? Вы сделали "vacuum analyze emails"?
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477510
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
авторРезультаты двух "explain analyze ...", которые вы привели получены после выполнения "vacuum analyze emails"? Вы сделали "vacuum analyze emails"?

После этой процедуры вот что получилось:
# explain analyze select * from emails where category_id = 2;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Seq Scan on emails (cost=0.00..20322.01 rows=13333 width=28) (actual time=43.04..8796.18 rows=10130 loops=1)
Filter: (category_id = 2)
Total runtime: 8812.18 msec
(записей: 3)

# explain analyze select * from emails where category_id > 2;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on emails (cost=0.00..20322.01 rows=973914 width=28) (actual time=35.24..8336.33 rows=979922 loops=1)
Filter: (category_id > 2)
Total runtime: 9116.29 msec
(записей: 3)

Оптимизатор совсем отказался от индексирования?
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477541
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как видно, теперь постгрес правильно предсказывает кол-во возвращаемых строк:
(... rows=13333 ...) (actual ... rows=10130 ...)
(... rows=973914 ...) (actual ... rows=979922 ...)

Сделайте теперь пожалуйста:
set enable_seq_scan to off;
explain analyze select * from emails where category_id = 2;
explain analyze select * from emails where category_id > 2;
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477561
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
авторset enable_seq_scan to off;
explain analyze select * from emails where category_id = 2;
explain analyze select * from emails where category_id > 2;

# explain analyze select * from emails where category_id = 2;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Seq Scan on emails (cost=0.00..20322.01 rows=13333 width=28) (actual time=43.04..8796.18 rows=10130 loops=1)
Filter: (category_id = 2)
Total runtime: 8812.18 msec
(записей: 3)

# explain analyze select * from emails where category_id > 2;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on emails (cost=0.00..20322.01 rows=973914 width=28) (actual time=35.24..8336.33 rows=979922 loops=1)
Filter: (category_id > 2)
Total runtime: 9116.29 msec
(записей: 3)
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477581
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри за очепятку. Сделайте пожалуйста:
set enable_seqscan to off;
explain analyze select * from emails where category_id = 2;
explain analyze select * from emails where category_id > 2;
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477595
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
Извиняюсь, наврал: вот правильные результаты:

# explain analyze select * from emails where category_id = 2;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
Index Scan using emailsndx1 on emails (cost=0.00..47007.67 rows=13333 width=28) (actual time=158.83..42997.30 rows=10130 loops=1)
Index Cond: (category_id = 2)
Total runtime: 43037.43 msec
(записей: 3)

# explain analyze select * from emails where category_id > 2;
а здесь psql виснет....
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477626
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравните результаты запроса category_id = 2:
без использования индекса: actual time=43.04..8796.18
с использованием индекса: actual time=158.83..42997.30

То есть в вашем случае постгрес все делает правильно: выбирает seq_scan, который и реально оказывается быстрее index_scan-а.

"а здесь psql виснет"

Не виснет, а задумывается. :-) Этот запрос отработает, думаю, за час с небольшим.
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477636
aev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
aev
Гость
Спасибо за помощь.

А что вы можете сказать об этом: авторКакой тип индексов лучше использовать для внешних ключей?
Я читал что индексы btree лучше использовать для числовых полей и полей типа дата/время. А hash - для текстовых полей.
Также пишут что btree лучше подходит для операций <, > и сортировки, а hash - для = и <>.
Внешний ключ - число, применяется операция =. Что выбрать?

Таблица будет иметь несколько миллионов записей.

И ещё несколько наболевших вопросов:
1) Правда ли что unique индексы быстрее, чем простые индексы?
2) При таких объёмах стоит ли индексировать поле типа boolen (имеется/отсутствует)? Может оно без индекса быстрее будет?
3) Стоит ли индексировать поле типа varchar(255) - наименование. По нему будет производится поиск с помощью оператора like (скорее всего на плное вхождение: '%template%')? Eсли стоит, то каким индексом? Hash?

Очень нужна помощь в этом вопросе! Буду длагодарен любым советам.
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477737
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Какой тип индексов лучше использовать"\r
\r
Я не экспериментировал с hash-индексами. Использую btree, которые создаются по дефолту.\r
\r
"unique индексы быстрее, чем простые индексы?"\r
\r
Не знаю. :-)\r
\r
"При таких объёмах стоит ли индексировать поле типа boolen"\r
\r
Если в таблице не будет "перекоса" по значениям в этом поле, то, думаю, постгрес такой индекс использовать никогда не будет, следовательно он не нужен.\r
\r
\'%template%\'\r
\r
В таком запросе индекс использовать бесполезно. ( В отличие например от \'template%\'. ) Можно или "вручную" разбивать тексты на слова и записывать их в отдельную таблицу, по которой затем искать по индексу запросом \'template%\'. Или попробовать воспользоваться модулем tsearch. ( Я им не пользовался. )\r
/topic/53381&hl=tsearch
...
Рейтинг: 0 / 0
Explain and Indexes
    #32477822
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hash индексы по-моему особо никем не используются и с ними могут быть проблемы. так что надо тестировать.

на наболевшие вопросы:
1) вряд ли. выше шанс, что оптимизатор выберет Index Scan по уникальному индексу, особенно если забыть сделать VACUUM ANALYZE.
2) ни при каких. лучше посмотреть в сторону PARTIAL INDEX.
3) не стоит. для таких поисков нужен полнотекстовый поиск -> contrib/tsearch2
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Explain and Indexes
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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