powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индексы с "include"
25 сообщений из 38, страница 1 из 2
индексы с "include"
    #38966471
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Вопрос такого плана.
Есть ли в PostgreSQL создать индекс где в теле индекса свои поля, а в листовом уровне плюс дополнительные. Я просто занимаюсь MS-SQL этим пользуюсь часто... а вот в этой тематике пока не але
...
Рейтинг: 0 / 0
индексы с "include"
    #38966692
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо.
...
Рейтинг: 0 / 0
индексы с "include"
    #38966714
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator,
а что вы хотите сделать и для чего?
...
Рейтинг: 0 / 0
индексы с "include"
    #38966940
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator,

ios. Index only scan -- это думаю почти совсем то
...
Рейтинг: 0 / 0
индексы с "include"
    #38967591
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПро PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо.
Очень интересно ))).
В чем же здесь "плохость"? ))))
Если говорить, что много индексов плохо, я понимаю прекрасно )))). С инклюд еще больше место будет. Но без индексов или с определенными индексами - это дело конкретных случаев на мой взгляд.

Вообще постгри странны.... В MS-SQL в таблице tbl(a int, b int, c int), создаю индекс create index ix1 on tbl (a,b) - (индекс BTree). И далее делаю запрос такой - select a,b from tbl.

происходит сканирование по индексу ix1. В постгри тоже самое когда делаю, в плане показывает - Seq Scan — читается вся таблица. Не понимаю для чего? В постгри в индексе не хранятся сами данные? это же бтри... или в постгри бтри другое чем в МССКЛ?
...
Рейтинг: 0 / 0
индексы с "include"
    #38967637
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator, выложите сюда план запроса.
Во-первых, таблица может быть маленькая,
выборка может быть неизбирательная, планировщик может решить,
что секскан выгоднее индекс-скан. Кстати, так бывает.
Кроме того, индекс-онли-скан работает только для относительно мало меняемых таблиц,
если установлена видимость для блока и если все указанные в запросе
поля содержатся в индексе.
И в дополнение - index only scan для postgresql 9.2 и выше.
Как-то так.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967639
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator,

PostgreSQL хранит данные о видимости записей в самих записях. Поэтому после прохода по индексу надо обязательно лезть в таблицу. При таком раскладе SeqScan только по таблице всяко быстрее.
Исключение — IndexOnlyScan, требует вакуумированной таблицы без новых изменений.

С моей точки зрения странный как раз MS-SQL.
И это не “постгри”, а постгрес.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967640
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandatorMasterZivПро PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо.
Очень интересно ))).
В чем же здесь "плохость"? ))))
Если говорить, что много индексов плохо, я понимаю прекрасно )))). С инклюд еще больше место будет. Но без индексов или с определенными индексами - это дело конкретных случаев на мой взгляд.

Вообще постгри странны.... В MS-SQL в таблице tbl(a int, b int, c int), создаю индекс create index ix1 on tbl (a,b) - (индекс BTree). И далее делаю запрос такой - select a,b from tbl.

происходит сканирование по индексу ix1. В постгри тоже самое когда делаю, в плане показывает - Seq Scan — читается вся таблица. Не понимаю для чего? В постгри в индексе не хранятся сами данные? это же бтри... или в постгри бтри другое чем в МССКЛ?

Тонкость в том что seq scan по таблице - это линейное чтение с диска.
А index only scan по индексу - случайное чтение с диска и с хорошей вероятностью будет медленнее.
Можно:
1)заэнфорсить IOS через set enable_seq_scan to 0;
или
2)сделать select a,b from tbl order by a,b; тогда вероятнее всего IOS будет.

PS: если у вас в таблице 1-2-10 строк то seq scan вообще всегда дешевле. Планы зависят от размеров таблицы и индекса поэтому тестирование на пустых данных - бесмысленно.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
индексы с "include"
    #38967655
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator,

zasandatorSeq Scan — читается вся таблица.

На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan.
Такое ожидаем только в версии 9.5
...
Рейтинг: 0 / 0
индексы с "include"
    #38967659
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukА index only scan по индексу - случайное чтение с дискаЕсли postres не может сделать такое же последовательное чтение only индекса, как и таблицы,
...
Рейтинг: 0 / 0
индексы с "include"
    #38967661
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.Maxim BogukА index only scan по индексу - случайное чтение с дискаЕсли postres не может сделать такое же последовательное чтение only индекса, как и таблицы,то это недостаток реализации.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967666
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufoszasandator,

zasandatorSeq Scan — читается вся таблица.

На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan.
Такое ожидаем только в версии 9.5

Чтооооооо????
Вы вообще о чем?
IOS уже несколько лет как есть.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
индексы с "include"
    #38967670
ОКТОГЕН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufoszasandator,

zasandatorSeq Scan — читается вся таблица.

На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan.
Такое ожидаем только в версии 9.5
Хм. А мужики не знают!
Код: sql
1.
2.
3.
4.
EXPLAIN ANALYZE
SELECT tst
FROM table1
WHERE tst<2


Код: plaintext
1.
2.
3.
4.
5.
--------------------------
Index Only Scan using table1_idx1 on table1  (cost=0.43..11.45 rows=2 width=8) (actual time=0.029..0.033 rows=2 loops=1)
  Index Cond: (tst < 2::double precision)
  Heap Fetches: 2
Planning time: 0.137 ms
Execution time: 0.052 ms
...
Рейтинг: 0 / 0
индексы с "include"
    #38967702
Фотография grufos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОКТОГЕН,

да, верно. такое название операции есть.
К сожалению это не совсем то, что хотел zasandator
Дело в том, что в MSSQL есть два понятия к индексу
1. индексный доступ - Index Seek
2. последовательный доступ - Index Scan

у нас же есть только одно понятие
1. индексный доступ - Index Scan
и тут вот как раз и начинаются непонятки для новичков.
В наименовании ведь слова Scan...

Смысл оптимизации MSSQL при использовании сканирования индекса, в том, что в взять в обработку объект меньшего размера - 2 поля, в то время как сама таблица состоит из 3-х полей.

Текущая реализация Index Only Scan using table1_idx1 on table1... похожа на это, но срабатывает только если мы выбираем еще и мало записей, то есть эффективное использование индекса.
А это все же не то, что хотел zasandator

Да, это ограничение в текущей реализации.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967706
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.Если postres не может сделать такое же последовательное чтение only индекса, как и таблицы, то это недостаток реализации.
Во-первых, Вы так говорите, как будто кто-то это может сделать в общем случае . ;)
Например, упомянутый тут MSSQL --- в общем случае не может.

Во-вторых, выгоды в этом на практике обычно нет, т.к. надо сильно постараться заполнить индекс так, чтобы от этого был выигрыш. ;)
...
Рейтинг: 0 / 0
индексы с "include"
    #38967723
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grufos,

Ну собственно да... индекс скан меня и интересует в том числе.
Ну индекс же не только для поиска (в МССКЛ) а для сортировки в том числе.

Если вот запрос сделать - select a,b from tbl order by a asc, b asc то будет именно индекс скан и все - без сортировки. если сделать order by b, a - сканирование индекса (потому что других нет и этот индекс даст наименьшее количество чтений с диска) и плюс в план добавится довольно таки тяжелая сортировка.

А че в постгрес? если есть индекс ix1(a,b) будет чтение с heap + sort?
...
Рейтинг: 0 / 0
индексы с "include"
    #38967735
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а вообще... такая ситуация...
2 таблицы одна с небольшим количеством данных, другая разв 100 больше данных, соединение

запрос к примеру такой
select small.f1, large.f2 from small join large on small.id = large.id

в плане вижу скан small далее скан large и хэшсоединение.
Пытаюсь его (как в МС-СКЛ) оптимизировать

на MS-SQL создал бы типа такого - create index ix1_large on large (id) include (f2).
Ну фиг с ним, не нашел в постгрес инклуд, попытался увеличить покрытие индекса так - index (id, f2), в надежде что план будет примерно такой:

скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап.

И нифига! хеш соединение с полным сканом большой таблицы!

Что я не понимаю?
...
Рейтинг: 0 / 0
индексы с "include"
    #38967744
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator <>в надежде что план будет примерно такой:

скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап.
<>обычно это удаётся навязать через LATERAL [ с LIMIT-ом в нём, заведомо покрывающем разумное количество (ограничением кардинальности, если позволите). ибо если количество заведомо неразумно => хешджойн будет быстрее туевой хучи нестед лупов]
...
Рейтинг: 0 / 0
индексы с "include"
    #38967771
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Я понимаю это - представляю примерно как работает оптимизатор запросов )))))).
Ну small - 100 строк, large - 10 млн.
какой смысл эти 2 таблицы делать хэшджоин с полным сканированием? В моем понимании (обычно MS-SQL так и делает) сканирует мелкую таблицу и 100 нестед луп... Понятно, что если строк не 100 а 1000 или больше кардинальность меняется и план может поменяться.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967775
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandatorНу а вообще... такая ситуация...
2 таблицы одна с небольшим количеством данных, другая разв 100 больше данных, соединение

запрос к примеру такой
select small.f1, large.f2 from small join large on small.id = large.id

в плане вижу скан small далее скан large и хэшсоединение.
Пытаюсь его (как в МС-СКЛ) оптимизировать

на MS-SQL создал бы типа такого - create index ix1_large on large (id) include (f2).
Ну фиг с ним, не нашел в постгрес инклуд, попытался увеличить покрытие индекса так - index (id, f2), в надежде что план будет примерно такой:

скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап.

И нифига! хеш соединение с полным сканом большой таблицы!

Что я не понимаю?

Для детального ответа - приведите полный тестовый пример.
Генерация данных + explain analyze проблемного запроса.
Тогда можно будет что то ответить.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
индексы с "include"
    #38967777
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

ну вот на конкретном примере... может есть какие подсказки хинты?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table small (id int, f1 int)
create table large (id int, f2 int, f3 char(4000))
create index ix1 on large (id, f2)

insert into small ... -- 100 строк
insert into large ... -- 10 млн строк

select small.f1, large.f2
from small join large on small.id = large.id


Как на этом примере заставить поиск по индексу? ну или хотя бы сканирование индекса (что бы f3 не захватывал) сделать? может хинтами?
...
Рейтинг: 0 / 0
индексы с "include"
    #38967796
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLAnonymousp2.Если postres не может сделать такое же последовательное чтение only индекса, как и таблицы, то это недостаток реализации.
Во-первых, Вы так говорите, как будто кто-то это может сделать в общем случае . ;)
Например, упомянутый тут MSSQL --- в общем случае не может.

Во-вторых, выгоды в этом на практике обычно нет, т.к. надо сильно постараться заполнить индекс так, чтобы от этого был выигрыш. ;)Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков. Что значит "заполнить индекс", я не понял. Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967818
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandatorqwwq,

ну вот на конкретном примере... может есть какие подсказки хинты?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table small (id int, f1 int)
create table large (id int, f2 int, f3 char(4000))
create index ix1 on large (id, f2)

insert into small ... -- 100 строк
insert into large ... -- 10 млн строк

select small.f1, large.f2
from small join large on small.id = large.id


Как на этом примере заставить поиск по индексу? ну или хотя бы сканирование индекса (что бы f3 не захватывал) сделать? может хинтами?

всетаки сделайте нормальный test case который можно руками прогнать.
А там посмотрим.

Какая часть таблицы large в вашем примере будет выбираться?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
индексы с "include"
    #38967820
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandator<>
Как на этом примере заставить поиск по индексу? ну или хотя бы сканирование индекса (что бы f3 не захватывал) сделать? может хинтами?
у меня и просто так не хешит:

Код: sql
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.
create table small (id int, f1 int);
create table large (id int, f2 int, f3 char(4000));
create index ix1 on large (id, f2);

INSERT INTO small(id) SELECT generate_series(1,100);
INSERT INTO large(id,f2) SELECT i,k FROM generate_series(1,100000) g(i) , generate_series(1,10) card(k) ;

EXPLAIN ANALYZE
select small.f1, large.f2
from small join large on small.id = large.id;
-----------
Merge Join  (cost=5.91..61.37 rows=1010 width=8) (actual time=0.763..12.311 rows=1000 loops=1)
  Merge Cond: (large.id = small.id)
  ->  Index Only Scan using ix1 on large  (cost=0.42..36214.93 rows=1000000 width=8) (actual time=0.025..2.877 rows=1001 loops=1)
        Heap Fetches: 1001
  ->  Sort  (cost=5.32..5.57 rows=100 width=8) (actual time=0.716..2.803 rows=991 loops=1)
        Sort Key: small.id
        Sort Method: quicksort  Memory: 20kB
        ->  Seq Scan on small  (cost=0.00..2.00 rows=100 width=8) (actual time=0.012..0.350 rows=100 loops=1)
Planning time: 0.389 ms
Execution time: 15.169 ms
-----------
-- иногда я пинаю так, когда надо выбрать с заведомо ограниченным 1:N, а оно, от дурости, на хеш лезет
-- но это, естественно, в разовых выборках, а не "продуктовый код"
EXPLAIN ANALYZE
select small.f1, large.f2
from small 
,LATERAL (SELECT id,f2 FROM  large WHERE  small.id = large.id 
	ORDER BY id, f2 LIMIT 1000 -- с запасом
) AS "large";

-----------
Nested Loop  (cost=0.42..482.00 rows=1000 width=8) (actual time=0.082..14.937 rows=1000 loops=1)
  ->  Seq Scan on small  (cost=0.00..2.00 rows=100 width=8) (actual time=0.017..0.256 rows=100 loops=1)
  ->  Limit  (cost=0.42..4.60 rows=10 width=8) (actual time=0.014..0.084 rows=10 loops=100)
        ->  Index Only Scan using ix1 on large  (cost=0.42..4.60 rows=10 width=8) (actual time=0.005..0.029 rows=10 loops=100)
              Index Cond: (id = small.id)
              Heap Fetches: 0
Planning time: 0.211 ms
Execution time: 18.429 ms
-----------


ЧЯДНТ ?
...
Рейтинг: 0 / 0
индексы с "include"
    #38967861
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков.
Что-то я сходу не нашёл, можно ссылку? Кстати, я правильно понял, что Вы имели в виду простое последовательное чтение страниц индекса (игнорируя всякие ссылки между узлами B+-дерева)?

p2.Что значит "заполнить индекс", я не понял.
Можно вставлять в индекс по-разному, в том числе так, что в итоге листья распределяются на диске совсем не по порядку ключа.

p2.Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество.
Да это ясно, а вот как Oracle этого добивается при активно модифицируемом индексе?
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индексы с "include"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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