|
|
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
Добрый день. Вопрос такого плана. Есть ли в PostgreSQL создать индекс где в теле индекса свои поля, а в листовом уровне плюс дополнительные. Я просто занимаюсь MS-SQL этим пользуюсь часто... а вот в этой тематике пока не але ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 15:21 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
Про PG не скажу, а вот что пользуешься ты этим часто -- не очень хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:06 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator, а что вы хотите сделать и для чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2015, 18:18 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator, ios. Index only scan -- это думаю почти совсем то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2015, 09:09 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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 — читается вся таблица. Не понимаю для чего? В постгри в индексе не хранятся сами данные? это же бтри... или в постгри бтри другое чем в МССКЛ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 10:39 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator, выложите сюда план запроса. Во-первых, таблица может быть маленькая, выборка может быть неизбирательная, планировщик может решить, что секскан выгоднее индекс-скан. Кстати, так бывает. Кроме того, индекс-онли-скан работает только для относительно мало меняемых таблиц, если установлена видимость для блока и если все указанные в запросе поля содержатся в индексе. И в дополнение - index only scan для postgresql 9.2 и выше. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:28 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator, PostgreSQL хранит данные о видимости записей в самих записях. Поэтому после прохода по индексу надо обязательно лезть в таблицу. При таком раскладе SeqScan только по таблице всяко быстрее. Исключение — IndexOnlyScan, требует вакуумированной таблицы без новых изменений. С моей точки зрения странный как раз MS-SQL. И это не “постгри”, а постгрес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:29 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:29 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator, zasandatorSeq Scan — читается вся таблица. На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan. Такое ожидаем только в версии 9.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:35 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
Maxim BogukА index only scan по индексу - случайное чтение с дискаЕсли postres не может сделать такое же последовательное чтение only индекса, как и таблицы, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:39 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.Maxim BogukА index only scan по индексу - случайное чтение с дискаЕсли postres не может сделать такое же последовательное чтение only индекса, как и таблицы,то это недостаток реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:39 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
grufoszasandator, zasandatorSeq Scan — читается вся таблица. На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan. Такое ожидаем только в версии 9.5 Чтооооооо???? Вы вообще о чем? IOS уже несколько лет как есть. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:43 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
grufoszasandator, zasandatorSeq Scan — читается вся таблица. На данный момент времени в оптимизаторе постгреса нет возможности делать Index only scan. Такое ожидаем только в версии 9.5 Хм. А мужики не знают! Код: sql 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:44 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
ОКТОГЕН, да, верно. такое название операции есть. К сожалению это не совсем то, что хотел zasandator Дело в том, что в MSSQL есть два понятия к индексу 1. индексный доступ - Index Seek 2. последовательный доступ - Index Scan у нас же есть только одно понятие 1. индексный доступ - Index Scan и тут вот как раз и начинаются непонятки для новичков. В наименовании ведь слова Scan... Смысл оптимизации MSSQL при использовании сканирования индекса, в том, что в взять в обработку объект меньшего размера - 2 поля, в то время как сама таблица состоит из 3-х полей. Текущая реализация Index Only Scan using table1_idx1 on table1... похожа на это, но срабатывает только если мы выбираем еще и мало записей, то есть эффективное использование индекса. А это все же не то, что хотел zasandator Да, это ограничение в текущей реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 11:59 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.Если postres не может сделать такое же последовательное чтение only индекса, как и таблицы, то это недостаток реализации. Во-первых, Вы так говорите, как будто кто-то это может сделать в общем случае . ;) Например, упомянутый тут MSSQL --- в общем случае не может. Во-вторых, выгоды в этом на практике обычно нет, т.к. надо сильно постараться заполнить индекс так, чтобы от этого был выигрыш. ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:00 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
grufos, Ну собственно да... индекс скан меня и интересует в том числе. Ну индекс же не только для поиска (в МССКЛ) а для сортировки в том числе. Если вот запрос сделать - select a,b from tbl order by a asc, b asc то будет именно индекс скан и все - без сортировки. если сделать order by b, a - сканирование индекса (потому что других нет и этот индекс даст наименьшее количество чтений с диска) и плюс в план добавится довольно таки тяжелая сортировка. А че в постгрес? если есть индекс ix1(a,b) будет чтение с heap + sort? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:12 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
Ну а вообще... такая ситуация... 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), в надежде что план будет примерно такой: скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап. И нифига! хеш соединение с полным сканом большой таблицы! Что я не понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:20 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandator <>в надежде что план будет примерно такой: скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап. <>обычно это удаётся навязать через LATERAL [ с LIMIT-ом в нём, заведомо покрывающем разумное количество (ограничением кардинальности, если позволите). ибо если количество заведомо неразумно => хешджойн будет быстрее туевой хучи нестед лупов] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:26 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
qwwq, Я понимаю это - представляю примерно как работает оптимизатор запросов )))))). Ну small - 100 строк, large - 10 млн. какой смысл эти 2 таблицы делать хэшджоин с полным сканированием? В моем понимании (обычно MS-SQL так и делает) сканирует мелкую таблицу и 100 нестед луп... Понятно, что если строк не 100 а 1000 или больше кардинальность меняется и план может поменяться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:42 |
|
||
|
индексы с "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), в надежде что план будет примерно такой: скан мелкой таблицы, поиск (сиик = онлииндексскан) в большой таблице и нестед луп лукап. И нифига! хеш соединение с полным сканом большой таблицы! Что я не понимаю? Для детального ответа - приведите полный тестовый пример. Генерация данных + explain analyze проблемного запроса. Тогда можно будет что то ответить. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:45 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
qwwq, ну вот на конкретном примере... может есть какие подсказки хинты? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Как на этом примере заставить поиск по индексу? ну или хотя бы сканирование индекса (что бы f3 не захватывал) сделать? может хинтами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 12:46 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymousp2.Если postres не может сделать такое же последовательное чтение only индекса, как и таблицы, то это недостаток реализации. Во-первых, Вы так говорите, как будто кто-то это может сделать в общем случае . ;) Например, упомянутый тут MSSQL --- в общем случае не может. Во-вторых, выгоды в этом на практике обычно нет, т.к. надо сильно постараться заполнить индекс так, чтобы от этого был выигрыш. ;)Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков. Что значит "заполнить индекс", я не понял. Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 13:03 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
zasandatorqwwq, ну вот на конкретном примере... может есть какие подсказки хинты? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Как на этом примере заставить поиск по индексу? ну или хотя бы сканирование индекса (что бы f3 не захватывал) сделать? может хинтами? всетаки сделайте нормальный test case который можно руками прогнать. А там посмотрим. Какая часть таблицы large в вашем примере будет выбираться? -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 13:17 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
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. ЧЯДНТ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 13:20 |
|
||
|
индексы с "include"
|
|||
|---|---|---|---|
|
#18+
p2.Не скажу за mssql, но оракл умеет делать последовательное сканирование индекса достаточно давно. Вопрос всего лишь в организации листовых блоков. Что-то я сходу не нашёл, можно ссылку? Кстати, я правильно понял, что Вы имели в виду простое последовательное чтение страниц индекса (игнорируя всякие ссылки между узлами B+-дерева)? p2.Что значит "заполнить индекс", я не понял. Можно вставлять в индекс по-разному, в том числе так, что в итоге листья распределяются на диске совсем не по порядку ключа. p2.Но выгода такая же как и с таблицей - последовательное чтение блоков на неssd дает значительное преимущество. Да это ясно, а вот как Oracle этого добивается при активно модифицируемом индексе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2015, 13:52 |
|
||
|
индексы с "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?all=1&fid=53&tid=1997971]: |
0ms |
get settings: |
11ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
191ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
102ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 603ms |

| 0 / 0 |
