Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
По мотивам , с удивлением обнаружил, что на 1.7млн. записей (ширина записи width=216) следующий запрос просто неприлично тормозит: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Если я правильно понял - то это еще одно место граблей с пневмоприводом Постгресовских славных индексов? Для сравнения Оракл 10GR2 дает (правда на более узкой таблице) значения порядка 1 сек. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:13 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Мда. Сам шучу сам смеюсь. Сделал небольшую проверку: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 17:17 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Andrey DaeronМда. Сам шучу сам смеюсь. Сделал небольшую проверку: Код: plaintext 1. 2. 3. 4. 5. А план при этом такой же? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 18:06 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
План: Код: plaintext 1. 2. 3. 4. 5. Почему так - ХЗ. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 18:21 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Andrey DaeronМда. Сам шучу сам смеюсь. Т.е. таки ширина таблицы. Ia by vse-taki tak pospeshno ne sudil. (hotia mojet byt' eto i tak). Nado proveriat' v polnostiu ne-cachirovannom sluchae, i smotret' chto iavliaetsia limitiruiushim factorom, CPU ili I/O. ( grubo govoria zanimaet li 100% cpu postmaster vo vremia zaprosa...) A tak eto nemnojko pohoje na gadanie na kofeinoi gusche.... IMHO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 18:28 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. при индексе (alias_id,id) на ma_data ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 19:11 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
СергейК Andrey DaeronМда. Сам шучу сам смеюсь. Т.е. таки ширина таблицы. Ia by vse-taki tak pospeshno ne sudil. (hotia mojet byt' eto i tak). Согласен. Меня просто немного другой вопрос беспокоил. Доковырлся еще не много: 1. Ставим серверу 500МБ шаред буферов (чтоб таки мог скешить). 2. Первое выполнение: 14 сек. iostat - 25-30 метров чтение (я так понимаю размер блока 512 байт) top - 38%. 3. Второе выполнение 3.05 сек iostat - в передлах 0 top - 100%. Вывод: 1. Индексы НЕ используются (судя по всему - опять же идеология версионности и "приблизительно-рекомендательный" храктер реализации) - используется seq_scan 2. Основная проблема - закешировать данные в памяти, а там уже все быстро и просто. т.е. все упирается в тормозной винт. Закешированные данные - прекрастно себе живут, и ничего лишнего не просят. Я считаю что 1.7 млн записей просмотреть и саггрегировать за 3 секунды - вполне простительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 19:19 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Andrey Daeron Согласен. Меня просто немного другой вопрос беспокоил. Доковырлся еще не много: 1. Ставим серверу 500МБ шаред буферов (чтоб таки мог скешить). 2. Первое выполнение: 14 сек. iostat - 25-30 метров чтение (я так понимаю размер блока 512 байт) top - 38%. 3. Второе выполнение 3.05 сек iostat - в передлах 0 top - 100%. Nu v takoi formulirovke, u menia nikakih pretenzii k Postgresu toje net. Vse ochen' daje razumno... Nu a naschet versionnosti i neispolzovania index'ov ia pojalui s vami ne soglashus'. Predstavim sebe, chto Postgres daje by hranil vidimost' tuplov v index'ah, to v zaprose SELECT alias_id, max(id) FROM tmpb_3 GROUP BY alias_id emu vse ravno by prishlos' lezt' v osnovnuiu tablitsu chtoby podniat' znachenie kolonki id... T.e. realno emu vse ravno nujno podymat' KAJDYY tuple iz tablitsy... Poetomu ia voobshe ne viju kak index tut chego-to mojet printsipialno uluchshit'... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 19:28 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Чем-то зацепил запрос :( Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. И такой запрос приводит в ступор: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2007, 20:14 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Andrey DaeronЧем-то зацепил запрос :( Индексы есть всякие разные. Все равно не используются :( В теории для каждого alias_id (их всего 57 и эта инфа должна быть и в индексе и в статистике), в другом индексе (по парам) можно было бы найти max(id) и уже его наличие проверить в БД. Впрочем для такого запроса Оракл индексы тоже не использует. V teorii da, no ne potrebovalo li by eto slishkom bolshogo chisla seek'ov... Nu v obshem, tak kak Oracle tut index'y ne ispolzuet, to ia schitau tut sporit' ne o chem :-). Andrey Daeron И такой запрос приводит в ступор: Код: plaintext 1. 2. 3. 4. 5. A tut kak raz chisto effect togo, chto v postgrese vidimost' ne hranitsia v indexe... Postgresu vse ravno nujno podymat' tuply s diska.... poetomu seq. scan okazyvaetsia vygodnee. Tak chto planner tut postupaet absolutno korrectno.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 02:44 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
СергейК A tut kak raz chisto effect togo, chto v postgrese vidimost' ne hranitsia v indexe... Postgresu vse ravno nujno podymat' tuply s diska.... poetomu seq. scan okazyvaetsia vygodnee. Tak chto planner tut postupaet absolutno korrectno....керню пишете. "абсолютно корректно" - значица - апсалютно минимальные затраты с т.з математятики. при относительно свежем индексе, для возврата 43 строк нужно просмотреть по несколько записей на одно значение alias_id, и только ~ (57-43) значений alias_id потребует проверку всех записей с этим значением alias_id. Думаица сама природа индексов в постгресе говорит о том, что оптимизация запросов не была в числе приоритетов раздрабодчикафф И тем более оптимайзер не являица их сильной стороной и теперь. Я вот все думаю, если вместо удаления иметь поле актуальности, включаемое во все индексы (вернее все индексы строить при условии WHERE actual = TRUE, не обеспчит ли это актуальности индекса? Кто готов рассказать, как обстоит дело с условными индексами? остаются ли в них индексы по не удовлетворяющим условию записям? Или остаются - поскольку измначальная версия отвечала условию, а узнать, что версия неактуальна можно только посмотрев запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 10:41 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
Для выбора небольшого кол-ва строк из большой таблицы при том, что каждую строку можно быстро выбрать по индексу. ИМХО делать через plpgsql по одному запросу на каждую строку результата. (Как я написал тут .) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 13:55 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
4321Думаица сама природа индексов в постгресе говорит о том, что оптимизация запросов не была в числе приоритетов раздрабодчикафф И тем более оптимайзер не являица их сильной стороной и теперь. Я вот все думаю, если вместо удаления иметь поле актуальности, включаемое во все индексы (вернее все индексы строить при условии WHERE actual = TRUE, не обеспчит ли это актуальности индекса? Кто готов рассказать, как обстоит дело с условными индексами? остаются ли в них индексы по не удовлетворяющим условию записям? Или остаются - поскольку измначальная версия отвечала условию, а узнать, что версия неактуальна можно только посмотрев запись? Поговрить об условных индексах не готов , но когда-то прочитал в рассылке Постгреса хорошее описание что они понимают под индексом (и откуда берется ре-чек). Индекс - это указание того, что данные удовлетворяющие некоторому условию есть на странице. Ну, например, если есть индекс по alias_id, то в нем будет хранится инфа для каждого уникального значения alias_id на каких страницах есть о них упоминание, и только эти страницы будут при поиске подниматься с винта. Йо. Размер страницы в PG - 8k. Ну в общем как сделан условный индекс - можно или догадаться самим (типа велосипед изобрести ) или глянуть сырцы (для любителей этого дела) или спросить в ихней рассылке. Попробую изобрести велосипед. что такое условный индекс? Это тотже индекс, только в нем кол-во элементов определенно отсечено условием, и если условие выборки совпадает (или приводимо с точки зрения Постгреса) с условием индекса - то он используется. Ну и хранится там информация только про страницы записей попадающих под условие частичного индекса. ИМХО примерно отсюда и берется реализация партиционирования Постгреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 15:24 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat... я просто предлагал смоделировать ваше предложение посредством запроса _к другой таблице_ (маленькой, которая нверное таки существует) с подзапросом к большой. Причем подзапрос можно переписать в виде Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 16:02 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat... я просто предлагал смоделировать ваше предложение посредством запроса _к другой таблице_ (маленькой, которая нверное таки существует) с подзапросом к большой. Причем подзапрос можно переписать в виде Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 16:02 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
iiiiiiiiiiiiiiiiiiii я просто предлагал смоделировать ваше предложение посредством запроса _к другой таблице_ (маленькой, которая нверное таки существует) с подзапросом к большой. Причем подзапрос можно переписать в виде Код: plaintext 1. 2. Да, это вполне супер-решение: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Но это не совсем честно. В общем-то вопрос был скорее теоретический, чем практический. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 16:13 |
|
||
|
Использование индекса при GROUP BY
|
|||
|---|---|---|---|
|
#18+
iiiiiiiiiiiiiiiiiiiiя просто предлагал смоделировать ваше предложение посредством запроса _к другой таблице_ (маленькой, которая нверное таки существует) с подзапросом к большой.Да, это пожалуй самое простое. Если таблица alias существует. iiiiiiiiiiiiiiiiiiiiпочти то же самое оптимизатор, в идеале, мог бы делать (для оригинального запроса автора топика) и сам пользуясь одним лишь индексом (alias_id,id), и единственно - проверяя актуальность в самой таблице, уж раз ему иначе низзя. Тут, мне кажется, можно было бы сделать некий index scan с условием "alias_id::NEXT > alias_id::PREV". (Аналогично тому как делается в функции f_test в примере ниже.) Код: plaintext 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. Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2007, 16:33 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34309823&tid=2005734]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
128ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 460ms |

| 0 / 0 |
