powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индексы с "include"
38 сообщений из 38, показаны все 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
индексы с "include"
    #38967898
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zasandatorMasterZivПро PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо.
Очень интересно ))).
В чем же здесь "плохость"?))))


Плохость в том, что это нельзя использовать как универсальный механизм оптимизации запросов.
Это (покрытие индексом) может случаться иногда, как приятный бонус, можно очень редко сделать это специально,
если совсем уж вилы, добавив одну нужную колонку в индекс.
Но вот так чтобы каждый запрос доводить до покрытия индексом -- это непрактично и бессмысленно, сегдня запрос
такой, завтра добавляется ещё одно поле в select list или ещё один join -- и всё, покрытия нет, но индекс уже толще
чем положено в 1.5-2-3 раза, его чтение занимает больше времени, меньше записей на странице и т.п.
Это не смертельно, но всё же.

zasandatorЕсли говорить, что много индексов плохо, я понимаю прекрасно )))).


Много индексов -- хорошо. Много индексов с include -- плохо.
...
Рейтинг: 0 / 0
индексы с "include"
    #38967915
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем и насколько индекс с "include" лучше составного индекса на те же поля?
Будет ли он занимать меньше места и насколько ? Изменение вторичных полей будет чуть дешевле, насколько?

PgSQLAnonymousp2.Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков.Что-то я сходу не нашёл, можно ссылку? Кстати, я правильно понял, что Вы имели в виду простое последовательное чтение страниц индекса (игнорируя всякие ссылки между узлами B+-дерева)?

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

p2.Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество.Да это ясно, а вот как Oracle этого добивается при активно модифицируемом индексе?Листовые блоки индекса - двусвязанный список. Оракловый index full scan читает листовые блоки по этому списку и дает упорядоченные значения, а index fast full scan последовательно читает все блоки индекса мультиблочными операциями IO и дает неупорядоченные значения.
Если требуется предыдущая версия измененной другой транзакцией строки, по ней будет дополнительные обращения к области undo для деконструирования изменений. И не важно откуда получена текущая версия, индекс это или таблица.
...
Рейтинг: 0 / 0
индексы с "include"
    #38968016
Фотография zasandator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.А чем и насколько индекс с "include" лучше составного индекса на те же поля?
Будет ли он занимать меньше места и насколько ? Изменение вторичных полей будет чуть дешевле, насколько?

В нелистовом уровне не присутствуют поля какие в include = экономия места.
2. в MS-SQL есть ограничение на 900 (или 914 не помню точно) байтов какие может занимать одна строка индекса (без инклуд), в инклуд можно запихать хоть гигабайт (ну это совсем конечно, но тем не менее при желании варчар(1000) вполне себе возможно)
...
Рейтинг: 0 / 0
индексы с "include"
    #38968087
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.Листовые блоки индекса - двусвязанный список. Оракловый index full scan читает листовые блоки по этому списку и дает упорядоченные значения, а index fast full scan последовательно читает все блоки индекса мультиблочными операциями IO и дает неупорядоченные значения.
Если требуется предыдущая версия измененной другой транзакцией строки, по ней будет дополнительные обращения к области undo для деконструирования изменений. И не важно откуда получена текущая версия, индекс это или таблица.
Index fast full scan посмотрел, спасибо.
Интересно (учитывая частоту проявления преимущества перед index full scan на практике
и современное распространение SSD), стоит ли это тащить в PostgreSQL?
...
Рейтинг: 0 / 0
индексы с "include"
    #38968123
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLAnonymousIndex fast full scan посмотрел, спасибо.
Интересно (учитывая частоту проявления преимущества перед index full scan на практике
и современное распространение SSD), стоит ли это тащить в PostgreSQL?Само по себе, полное сканирование будь то таблицы или индекса специфично для хранилищ данных, а выгода возникает, когда индекс с большой вероятность вытесняется из оперативной памяти. Задесятки терабайт пока слишком дорого для промышленных ssd и они обычно используются как дополнительный кеш. Кроме того, последовательное чтение физической структуры хранения можно разделить на независимые куски и обрабатывать параллельно. В 9.5 вроде планируют сделать parallel seq scan.
Последовательное чтение индекса позволяет его использовать как частичный заменитель вертикального/поколоночного секционирования.

Чтобы занять уверенную позицию в сегменте хранилищ от 10TB, постгресу еще много чего допиливать, помимо последовательного сканирования индексов.
...
Рейтинг: 0 / 0
индексы с "include"
    #38968153
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.Само по себе, полное сканирование будь то таблицы или индекса специфично для хранилищ данных, а выгода возникает, когда индекс с большой вероятность вытесняется из оперативной памяти.
Нет, подождите. ;) Почему Вы думаете, что полное сканирование --- это нормально для DWH?
Даже с кучей ad-hoc запросов при хорошем проектировании и наборе индексов его увидишь не так часто, IMHO.
И, кроме того, мне кажется, что запросов, которые вообще могут с выгодой использовать "Index fast full scan", не так уж много.
И если даже их немало в конкретной БД, то какова практическая польза?

p2.Задесятки терабайт пока слишком дорого для промышленных ssd и они обычно используются как дополнительный кеш.
Ну это кому как. ;)

p2.Кроме того, последовательное чтение физической структуры хранения можно разделить на независимые куски и обрабатывать параллельно.
Так же, как и некоторые другие стратегии чтения.

p2.Чтобы занять уверенную позицию в сегменте хранилищ от 10TB, постгресу еще много чего допиливать, помимо последовательного сканирования индексов.
Например?
...
Рейтинг: 0 / 0
индексы с "include"
    #38968161
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zasandatorВ нелистовом уровне не присутствуют поля какие в include = экономия места.

Суха теория, мой друг, а вот практических сравнений не хватает. ;)

zasandator2. в MS-SQL есть ограничение на 900 (или 914 не помню точно) байтов какие может занимать одна строка индекса (без инклуд), в инклуд можно запихать хоть гигабайт (ну это совсем конечно, но тем не менее при желании варчар(1000) вполне себе возможно)
В PostgreSQL тоже есть аналогичное ограничение, около 1/3 страницы (обычно 2712 байт, кажется).
...
Рейтинг: 0 / 0
индексы с "include"
    #38968223
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLAnonymousПочему Вы думаете, что полное сканирование --- это нормально для DWH?"Специфично для" не является синонимом "нормально для". Если уж подменять термины, то ближе будет трактовка - "ненормально для не...".
Если отрицать seq index only scan, чем он отличается от sec scan таблицы. Впрочем, "увидишь не так часто" говорит о другой практике работы с теми самыми ad-hoc, у меня большинство запросов агрегировали все данные или комбинацию малоселективных плохокластеризованных атрибутов. Случайный доступ к таблицам через индексы скорее редкость. А вот проход по всему только-индексу при "хорошем проектировании и наборе индексов" достаточно эффективно сокращал количество физических чтений.

PgSQLAnonymousНу это кому как.какие у вас системы хранения с ssd используются под postgres, какой объем ssd и какова стоимость?

PgSQLAnonymousТак же, как и некоторые другие стратегии чтения.О каких именно стратегиях идет речь?

PgSQLAnonymousНапример?Стоит ли здесь сравнивать бесплатный продукт с давно пасущимися на рынке мейнстримами типа терадаты, оракла и пр., когда для этого есть отдельный форум Сравнение СУБД?
...
Рейтинг: 0 / 0
индексы с "include"
    #38968248
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.PgSQLAnonymousПочему Вы думаете, что полное сканирование --- это нормально для DWH?"Специфично для" не является синонимом "нормально для". Если уж подменять термины, то ближе будет трактовка - "ненормально для не...".

Да не собирался я ничего подменять, просто не так понял.
А полное сканирование таблиц я время от времени видел практически во всех системах,
так что ничего специфичного для DWH в нём нет (я имею в виду именно на "больших" таблицах).

p2.Если отрицать seq index only scan, чем он отличается от sec scan таблицы. Впрочем, "увидишь не так часто" говорит о другой практике работы с теми самыми ad-hoc, у меня большинство запросов агрегировали все данные или комбинацию малоселективных плохокластеризованных атрибутов. Случайный доступ к таблицам через индексы скорее редкость.
Ну да, другая практика...
А Вы можете привести более конкретные примеры: какая предметная область, какие данные, что запрашивают?

p2.А вот проход по всему только-индексу при "хорошем проектировании и наборе индексов" достаточно эффективно сокращал количество физических чтений.
Так в этом и вопрос: в каких случаях и насколько index fast full scan эффективнее index only scan-а (который в PostgreSQL уже есть)?

p2.Какие у вас системы хранения с ssd используются под postgres, какой объем ssd и какова стоимость?
Не помню точно, извините. Кажется, всего-то 2--4 Тб, а уж стоимость я совсем забыл. ;(
Суть в том, что для DWH под PostgreSQL можно использовать сколько нужно SSD/RAM,
и, в итоге, возможно, получить более производительную (чем Oracle) систему за меньшие деньги. ;)

p2.PgSQLAnonymousТак же, как и некоторые другие стратегии чтения.О каких именно стратегиях идет речь?

Об index scan-е, bitmap index scan-е, некоторых join-ах... да и вообще, многие операции могут обрабатываться параллельно.

p2.PgSQLAnonymousНапример?Стоит ли здесь сравнивать бесплатный продукт с давно пасущимися на рынке мейнстримами типа терадаты, оракла и пр.,
Да какая разница, сколько они там пасутся на рынке (пример: COBOL) и насколько они мейнстрим (пример: PHP)?
Меня гораздо больше интересуют практические технические преимущества/недостатки.

О, кстати. ;) О мейнстриме в DWH:

Since 2008 EXASOL leads the well-respected international TPC-H benchmark for analytical scenarios,
in all datavolume-based categories 100 GB, 300 GB, 1 TB, 3 TB, and 10 TB.
Notably, EXASolution holds the top position in the section "Performance" as well as "Price/Performance".

То есть, получается, сейчас это абсолютный лидер, а основана EXASOL всего-то в 2000 году, вроде. ;)

p2.когда для этого есть отдельный форум Сравнение СУБД?
Так давайте сравним там, почему бы нет?
...
Рейтинг: 0 / 0
индексы с "include"
    #38968273
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PgSQLAnonymousтак что ничего специфичного для DWH в нём нет (я имею в виду именно на "больших" таблицах).то есть, в хорошо спроектированных oltp-задачах с правильными индексами полное сканирование больших таблиц общепринятый подход.

PgSQLAnonymousА Вы можете привести более конкретные примеры: какая предметная область, какие данные, что запрашивают?карты имеют множество атрибутов, но нас они интересуют как связь между персональными данными клиентов и операциями. нужно построить "куб" по месяцам, полу, возрастной группе, региону, принадлежности к целевой аудитории, контрольной группе или прочим. Так вот, пара полей номер карты+номер клиента проиндексированы и индекс в пять раз меньше таблицы карт. Поскольку пересекаются все строки, то связь клиентов на карты эффективнее решается полным сканированием индекса и хеш-джоином. Полное сканирование выполняется за 1000 многоблочных iops с последовательным доступом - 3 секунды. Поблочный случайный iops в три раза дешевле многоблочного, но их 20000 - имеем 20 секунд. Чтение исходной таблицы - 15 секунд.

PgSQLAnonymousОб index scan-е, bitmap index scan-е, некоторых join-ах... да и вообще, многие операции могут обрабатываться параллельно.В случае полистового прохода index scan эффективно поделить на равноценные части не заглянув в данные не получится.
А про стратегию чтения "некторые join" не знал.
...
Рейтинг: 0 / 0
индексы с "include"
    #38968320
PgSQLAnonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.PgSQLAnonymousтак что ничего специфичного для DWH в нём нет (я имею в виду именно на "больших" таблицах).то есть, в хорошо спроектированных oltp-задачах с правильными индексами полное сканирование больших таблиц общепринятый подход.
Нет, но оно всё равно там иногда встречается .

p2.PgSQLAnonymousА Вы можете привести более конкретные примеры: какая предметная область, какие данные, что запрашивают?карты имеют множество атрибутов, но нас они интересуют как связь между персональными данными клиентов и операциями. нужно построить "куб" по месяцам, полу, возрастной группе, региону, принадлежности к целевой аудитории, контрольной группе или прочим. Так вот, пара полей номер карты+номер клиента проиндексированы и индекс в пять раз меньше таблицы карт. Поскольку пересекаются все строки, то связь клиентов на карты эффективнее решается полным сканированием индекса и хеш-джоином. Полное сканирование выполняется за 1000 многоблочных iops с последовательным доступом - 3 секунды. Поблочный случайный iops в три раза дешевле многоблочного, но их 20000 - имеем 20 секунд. Чтение исходной таблицы - 15 секунд.
Структуру я примерно понял, но это похоже на OLAP, IMHO (тогда где же агрегированные значения?).
Т.е. 3 секунды --- это fast full scan того же индекса, который index only scan проходит за 20 секунд, я правильно понял?

p2.В случае полистового прохода index scan эффективно поделить на равноценные части не заглянув в данные не получится.
Почему не получится? Для этого можно использовать гистограмму из статистики, например.
...
Рейтинг: 0 / 0
индексы с "include"
    #38968353
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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), в надежде что план будет примерно такой:

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

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

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

зы. по SQLServer:

Судя по всему в примере id это ПК, в таком случае разве не достаточно было бы только индекса

Код: sql
1.
create index ix1_large on large (f2)



?
...
Рейтинг: 0 / 0
индексы с "include"
    #38969859
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.А чем и насколько индекс с "include" лучше составного индекса на те же поля?
.

Он не лучше или хуже, он -- другой. Поля в INCLUDE не являются частью ключа индекса, это просто копия данных из основной
таблицы. Кстати, при их изменении нужно maintain-ить индекс, копировать данные туда.


Будет ли он занимать меньше места и насколько ?

Ровно на размер полей в INCLUDE меньше.


Изменение вторичных полей будет чуть дешевле, насколько?

Поля в INCLUDE, если о них речь, обновлять немного дешевле, там не меняется ключ индекса, поэтому место индексной записи
в индексе поменяться не может, запись либо UPDATE-иться in-place, либо расширяется или переносится из-за нехватки места под новое значение полей в include. Т.е. немного дешевле.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / индексы с "include"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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