Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Есть таблица (биллинг) в 280 млн. записей размером около 18 гигабайт (это на Firebird - на PostgreSQL было бы гигабайт на несколько больше). Создан индекс по дате-времени. Остальные поля сильно неуникальны и создавать по ним индекс нецелесообразно. Есть настоятельная потребность выбирать большое количество записей (от 400 тыс. (часто) до 10 млн. (оч. редко)) по некоторым условиям, основным из которых является дата-время. В Firerbird для таких страдальцев как я есть оптимизация индексного скана, которая скан по индексу реализует как последовательный скан страниц, на которых могут находится записи, удовлетворяющие условию поиска. Сказать, что это работает, значит ничего не сказать. Разница даже с "супер-пупер быстрым" MySQL на MyISAM оказалась 3 раза в пользу Firebird. Есть ли какие-нибудь трюки на PostgreSQL, которые могли бы облегчить мне жизнь? В настоящий момент индексный скан по 2.5 миллионам записей на FB 1.5.3 и PG 8.1.1 занимает соответственно 21 и 150 сек. И что мне делать? Сидеть на FB и не дёргаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 08:52 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
автор(это на Firebird - на PostgreSQL было бы гигабайт на несколько больше). авторВ настоящий момент индексный скан по 2.5 миллионам записей на FB 1.5.3 и PG 8.1.1 занимает соответственно 21 и 150 сек. Я не пойму - тестил ли ты на тех же данных с той же структурой те же запросы или нет. Кроме того не забудь перед первым запуском (после заливки данных) сделать analyze для всей базы - разница может быть колосальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 10:21 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Andrew SagulinЕсть настоятельная потребность выбирать большое количество записей (от 400 тыс. (часто) до 10 млн. (оч. редко))Передавать результирующие 400 тыс строк клиенту? Тогда возможно затраты на передачу данных будут больше, чем на сканирование индекса. Или использовать эти 400 тыс строк для последующих операций, например вычисления агрегатов, и отдавать клиенту мало строк результата? Andrew Sagulin... скан по индексу реализует как последовательный скан страниц, на которых могут находится записи, удовлетворяющие условию поиска... Есть ли какие-нибудь трюки на PostgreSQL, которые могли бы облегчить мне жизнь?В точности такая штука есть в постгресе 8.1. Cм. доку Bitmap Heap Scan и Bitmap Index Scan Andrew SagulinВ настоящий момент индексный скан по 2.5 миллионам записей на FB 1.5.3 и PG 8.1.1 занимает соответственно 21 и 150 сек.Смотрите планы выполнения запросов в постгресе. Включите/отключите возможности bitmap scan-ов с помощью enable_bitmapscan и сравните результаты. Andrew SagulinИ что мне делать? Сидеть на FB и не дёргаться?Из вашего поста не понятно, почему вы ставите перед собой задачу слазить с FB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 10:43 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Прошу прощения, за лишнее сообщение - не совсем разобрался с цитированием, а удалить теперь не могу. В FB не устраивает только отсутствие единой последовательной документации. А так, пока есть время и возможность экспериментировать, хочу попробовать разные СУБД, составить о них своё мнение, чтобы, когда "припрёт", можно было быстро "сорентироваться на местности". Создание кластерного индекса с последующим analyze дало PG такую же производительность, как и FB. Меня это не совсем устраивает, но..., я думаю, тему можно закрыть, так как основные направления в неспешном чтении документации я получил, а остальное зависит только от меня. Спасибо всем ответившим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 11:45 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Не советую "Кластерный индекс" - толку мало (без периодической команды CLUSTER - но не думаю, что тебе захочется ее выполнять на многогигабайтовой таблице), а оптимизатор может "сбиться с толку". Проблема была только в не сделанном ANALYZE. Кстати - на сколько больше таблица в PG в сравнении с FB (я знаю, что больше, но насколько?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 13:39 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
В моём случае: Код: 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. Средняя длина записи на FB: 68 байт на PG: 94 байта средняя длина ключа по datetime (в расчёте на одну запись): FB: 7,3 байта PG: 22 байта Сколько это будет в расчёте на 280 млн. записей можно посчитать: FB: около 20 с небольшим гигабайт PG: около 31 гигабайта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 14:06 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Вдогонку: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 14:09 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
[quot автор]В точности такая штука есть в постгресе 8.1. Cм. доку Bitmap Heap Scan и Bitmap Index Scan[quot автор] Можно поподробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 14:52 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
postt авторВ точности такая штука есть в постгресе 8.1. Cм. доку Bitmap Heap Scan и Bitmap Index ScanМожно поподробнее.http://www.postgresql.org/docs/8.1/static/performance-tips.html Here the planner has decided to use a two-step plan: the bottom plan node visits an index to find the locations of rows matching the index condition, and then the upper plan node actually fetches those rows from the table itself. Fetching the rows separately is much more expensive than sequentially reading them, but because not all the pages of the table have to be visited, this is still cheaper than a sequential scan. (The reason for using two levels of plan is that the upper plan node sorts the row locations identified by the index into physical order before reading them, so as to minimize the costs of the separate fetches. The "bitmap" mentioned in the node names is the mechanism that does the sorting.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2006, 15:21 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Дабы поставить небольшую, нежирную такую, точку... Bitmap scan ни в какую не хотел включаться до выполнения команды Код: plaintext Однако, как тут правильно заметили, для многогиговой базы это не выход. Я подозреваю, что оптимизатор за деревьями не видит леса: из-за небольшой неупорядоченности данных по времени, не может определить, что они тем не менее очень хорошо кластеризованы по дате (в силу того, что данные заливаются в базу посуточно). Чтобы помочь оптимизатору, был создан индекс Код: plaintext После этого на выборках типа: Код: plaintext 1. PG показал просто чудеса производительности: скорость считывания данных была более 30 мегабайт в секунду, т.е. практически равна производительности дисковой системы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 08:56 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
а если попробовать что нить вроде "5.9.2. Implementing Partitioning"? что нить измениться? интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 10:03 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Andrew Sagulin Код: plaintext 1. Код: plaintext 1. Респект !!! А я дураком был, использовал timestamptz - теперь он никак индекс ни по date_trunc ни по cast(... as date) делать не хочет. Ну и фиг. Пока скорость устраивает (кстати такая же: 1млн за 40-60 сек для данных вне кеша (прошлый месяц)) Зато для текущего месяца сумма по абонентам - 250т за 1 секунду (под конец месяца соотв-но за 2-3 секунды). Размер shared_buffers = 60000, work_mem = 16384. На машине гиг оперативки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 11:03 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
st_serg а если попробовать что нить вроде "5.9.2. Implementing Partitioning"? что нить измениться? интересно О! Это то, что доктор прописал!Предварительные испытания показали, что это действительно работает. Небольшое усложнение программы для заливки данных (пара-тройку команд DDL) полностью окупается отсутствием индекса по дате-времени и очень быстрой работой запросов на выборку. Будем двигаться в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2006, 15:19 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Испытания на реальном материале показали весьма странное поведение partitioning: первый запрос на каком-либо интервале выполняет долго (при этом скорость чтения с винчестера около 5 мегабайт в секунду). Повторный запрос выполняется очень быстро (трансфер с винта около 50 мег в секунду). Стоит поменять запрос, и опять - первый раз тормоза, второй - всё летает. Во всех случаях план выполнения запроса один и тоже, нагрузка на процессор - не более 10%. Влияние кеша ОС исключено: считываются данные объёмом более 1 Гбайта при объёме кеша ОС не более 400 мегабайт. Пробовал делать union таблиц вручную - тоже всё просто летает. "Ничего не понимаю"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 15:40 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Немного прояснилось, из-за чего падает скорость чтения, но почему так происходит, не знаю. В общем, файл-монитор показал что при последовательном чтении файлов таблиц наблюдается запись (!) в предыдущие уже считанные таблицы (но не все). Vacuum? А зачем? Мусора-то нет: пустые таблицы заполнялись командами insert и никаких update. Analyze по всем таблицам делал. Может мне кто-нибудь прояснить причину такого поведения PG? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2006, 16:19 |
|
||
|
Оптимизация index scan
|
|||
|---|---|---|---|
|
#18+
Есть простая таблица с полем tsvector и GIN индексом. Записей 7млн. Индекс получился размером 500Мб. Сервер 2 ядра, 2 винта в raid0, RAM 6Gb. Настройки PG: shared_buffers = 2000MB temp_buffers = 32MB work_mem = 64MB effective_cache_size = 2000MB Запрос вида: Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. второй: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. free Код: plaintext 1. 2. 3. 4. Свободной памяти полно, и было бы хорошо если после первого запроса база или ОС закинула в память весь 500Мб индекс. Но по факту получаеться что индекс попадает в память маленькими кусочками при каждом новом запросе. Как можно сказать базе чтоб GIN индекс всегда держала в памяти? Время поиска должно быть не более 0.3 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2008, 08:44 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35350314&tid=2004325]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 299ms |
| total: | 417ms |

| 0 / 0 |
