|
|
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandatorMasterZivПро PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо. Очень интересно ))). В чем же здесь "плохость"?)))) Плохость в том, что это нельзя использовать как универсальный механизм оптимизации запросов. Это (покрытие индексом) может случаться иногда, как приятный бонус, можно очень редко сделать это специально, если совсем уж вилы, добавив одну нужную колонку в индекс. Но вот так чтобы каждый запрос доводить до покрытия индексом -- это непрактично и бессмысленно, сегдня запрос такой, завтра добавляется ещё одно поле в select list или ещё один join -- и всё, покрытия нет, но индекс уже толще чем положено в 1.5-2-3 раза, его чтение занимает больше времени, меньше записей на странице и т.п. Это не смертельно, но всё же. zasandatorЕсли говорить, что много индексов плохо, я понимаю прекрасно )))). Много индексов -- хорошо. Много индексов с include -- плохо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 14:30 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
А чем и насколько индекс с "include" лучше составного индекса на те же поля? Будет ли он занимать меньше места и насколько ? Изменение вторичных полей будет чуть дешевле, насколько? PgSQLAnonymousp2.Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков.Что-то я сходу не нашёл, можно ссылку? Кстати, я правильно понял, что Вы имели в виду простое последовательное чтение страниц индекса (игнорируя всякие ссылки между узлами B+-дерева)? p2.Что значит "заполнить индекс", я не понял.Можно вставлять в индекс по-разному, в том числе так, что в итоге листья распределяются на диске совсем не по порядку ключа. p2.Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество.Да это ясно, а вот как Oracle этого добивается при активно модифицируемом индексе?Листовые блоки индекса - двусвязанный список. Оракловый index full scan читает листовые блоки по этому списку и дает упорядоченные значения, а index fast full scan последовательно читает все блоки индекса мультиблочными операциями IO и дает неупорядоченные значения. Если требуется предыдущая версия измененной другой транзакцией строки, по ней будет дополнительные обращения к области undo для деконструирования изменений. И не важно откуда получена текущая версия, индекс это или таблица. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 14:46 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.А чем и насколько индекс с "include" лучше составного индекса на те же поля? Будет ли он занимать меньше места и насколько ? Изменение вторичных полей будет чуть дешевле, насколько? В нелистовом уровне не присутствуют поля какие в include = экономия места. 2. в MS-SQL есть ограничение на 900 (или 914 не помню точно) байтов какие может занимать одна строка индекса (без инклуд), в инклуд можно запихать хоть гигабайт (ну это совсем конечно, но тем не менее при желании варчар(1000) вполне себе возможно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 16:32 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.Листовые блоки индекса - двусвязанный список. Оракловый index full scan читает листовые блоки по этому списку и дает упорядоченные значения, а index fast full scan последовательно читает все блоки индекса мультиблочными операциями IO и дает неупорядоченные значения. Если требуется предыдущая версия измененной другой транзакцией строки, по ней будет дополнительные обращения к области undo для деконструирования изменений. И не важно откуда получена текущая версия, индекс это или таблица. Index fast full scan посмотрел, спасибо. Интересно (учитывая частоту проявления преимущества перед index full scan на практике и современное распространение SSD), стоит ли это тащить в PostgreSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 17:28 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymousIndex fast full scan посмотрел, спасибо. Интересно (учитывая частоту проявления преимущества перед index full scan на практике и современное распространение SSD), стоит ли это тащить в PostgreSQL?Само по себе, полное сканирование будь то таблицы или индекса специфично для хранилищ данных, а выгода возникает, когда индекс с большой вероятность вытесняется из оперативной памяти. Задесятки терабайт пока слишком дорого для промышленных ssd и они обычно используются как дополнительный кеш. Кроме того, последовательное чтение физической структуры хранения можно разделить на независимые куски и обрабатывать параллельно. В 9.5 вроде планируют сделать parallel seq scan. Последовательное чтение индекса позволяет его использовать как частичный заменитель вертикального/поколоночного секционирования. Чтобы занять уверенную позицию в сегменте хранилищ от 10TB, постгресу еще много чего допиливать, помимо последовательного сканирования индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 18:37 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.Само по себе, полное сканирование будь то таблицы или индекса специфично для хранилищ данных, а выгода возникает, когда индекс с большой вероятность вытесняется из оперативной памяти. Нет, подождите. ;) Почему Вы думаете, что полное сканирование --- это нормально для DWH? Даже с кучей ad-hoc запросов при хорошем проектировании и наборе индексов его увидишь не так часто, IMHO. И, кроме того, мне кажется, что запросов, которые вообще могут с выгодой использовать "Index fast full scan", не так уж много. И если даже их немало в конкретной БД, то какова практическая польза? p2.Задесятки терабайт пока слишком дорого для промышленных ssd и они обычно используются как дополнительный кеш. Ну это кому как. ;) p2.Кроме того, последовательное чтение физической структуры хранения можно разделить на независимые куски и обрабатывать параллельно. Так же, как и некоторые другие стратегии чтения. p2.Чтобы занять уверенную позицию в сегменте хранилищ от 10TB, постгресу еще много чего допиливать, помимо последовательного сканирования индексов. Например? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 19:22 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandatorВ нелистовом уровне не присутствуют поля какие в include = экономия места. Суха теория, мой друг, а вот практических сравнений не хватает. ;) zasandator2. в MS-SQL есть ограничение на 900 (или 914 не помню точно) байтов какие может занимать одна строка индекса (без инклуд), в инклуд можно запихать хоть гигабайт (ну это совсем конечно, но тем не менее при желании варчар(1000) вполне себе возможно) В PostgreSQL тоже есть аналогичное ограничение, около 1/3 страницы (обычно 2712 байт, кажется). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 19:33 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymousПочему Вы думаете, что полное сканирование --- это нормально для DWH?"Специфично для" не является синонимом "нормально для". Если уж подменять термины, то ближе будет трактовка - "ненормально для не...". Если отрицать seq index only scan, чем он отличается от sec scan таблицы. Впрочем, "увидишь не так часто" говорит о другой практике работы с теми самыми ad-hoc, у меня большинство запросов агрегировали все данные или комбинацию малоселективных плохокластеризованных атрибутов. Случайный доступ к таблицам через индексы скорее редкость. А вот проход по всему только-индексу при "хорошем проектировании и наборе индексов" достаточно эффективно сокращал количество физических чтений. PgSQLAnonymousНу это кому как.какие у вас системы хранения с ssd используются под postgres, какой объем ssd и какова стоимость? PgSQLAnonymousТак же, как и некоторые другие стратегии чтения.О каких именно стратегиях идет речь? PgSQLAnonymousНапример?Стоит ли здесь сравнивать бесплатный продукт с давно пасущимися на рынке мейнстримами типа терадаты, оракла и пр., когда для этого есть отдельный форум Сравнение СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 21:19 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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.когда для этого есть отдельный форум Сравнение СУБД? Так давайте сравним там, почему бы нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 22:50 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymousтак что ничего специфичного для DWH в нём нет (я имею в виду именно на "больших" таблицах).то есть, в хорошо спроектированных oltp-задачах с правильными индексами полное сканирование больших таблиц общепринятый подход. PgSQLAnonymousА Вы можете привести более конкретные примеры: какая предметная область, какие данные, что запрашивают?карты имеют множество атрибутов, но нас они интересуют как связь между персональными данными клиентов и операциями. нужно построить "куб" по месяцам, полу, возрастной группе, региону, принадлежности к целевой аудитории, контрольной группе или прочим. Так вот, пара полей номер карты+номер клиента проиндексированы и индекс в пять раз меньше таблицы карт. Поскольку пересекаются все строки, то связь клиентов на карты эффективнее решается полным сканированием индекса и хеш-джоином. Полное сканирование выполняется за 1000 многоблочных iops с последовательным доступом - 3 секунды. Поблочный случайный iops в три раза дешевле многоблочного, но их 20000 - имеем 20 секунд. Чтение исходной таблицы - 15 секунд. PgSQLAnonymousОб index scan-е, bitmap index scan-е, некоторых join-ах... да и вообще, многие операции могут обрабатываться параллельно.В случае полистового прохода index scan эффективно поделить на равноценные части не заглянув в данные не получится. А про стратегию чтения "некторые join" не знал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 01:26 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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 эффективно поделить на равноценные части не заглянув в данные не получится. Почему не получится? Для этого можно использовать гистограмму из статистики, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 08:41 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2015, 09:46 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.А чем и насколько индекс с "include" лучше составного индекса на те же поля? . Он не лучше или хуже, он -- другой. Поля в INCLUDE не являются частью ключа индекса, это просто копия данных из основной таблицы. Кстати, при их изменении нужно maintain-ить индекс, копировать данные туда. Будет ли он занимать меньше места и насколько ? Ровно на размер полей в INCLUDE меньше. Изменение вторичных полей будет чуть дешевле, насколько? Поля в INCLUDE, если о них речь, обновлять немного дешевле, там не меняется ключ индекса, поэтому место индексной записи в индексе поменяться не может, запись либо UPDATE-иться in-place, либо расширяется или переносится из-за нехватки места под новое значение полей в include. Т.е. немного дешевле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2015, 15:11 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38968153&tid=1997971]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 404ms |

| 0 / 0 |
