Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Помогите с оптимизацией Есть очень большая таблица (115 млн. записей) : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. С одним индексом: Код: plaintext 1. 2. 3. 4. 5. Приложение перелопачивает всю таблицу, делая однотипные запросы: Код: plaintext 1. 2. 3. 4. На некоторых word_id наблюдается замедление. Вот например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Если enable_bitmapscan отключить, то получаем следующее: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вопросы: 1. Видно, что планировщик ошибается. Но так ли это всегда? То-есть буду ли я прав, если буду выполнять SET enable_bitmapscan TO off в приложении принудительно, для всех запросов такого типа? 2. Как можно всё убыстрить? Просто, таких запросов приложение выполняет очень много подряд и общее время выполнения приложения, мягко говоря, не очень маленькое. 3. Когда выполняю данные запросы с Explain Analyze в PgAdmin часто скорость их выполнения скачет. Причём то она такая как приведена выше, то по 400ms как с включённым enable_bitmapscan так и с выключенным, с чем это может быть связанно? 4. Не страшно ли, что в таблице отсуствует primary key ? Из таблицы данные только читаются. Никаких инсертов и прочего. Постгрес в этот момент стоит и отдыхает. Только данное приложение работает. После создания таблицы делался VACUUM FULL ANALYZE и REINDEX Заранее спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 03:16 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
Чему равно значение work_mem? Предлагаю поднять до 20'480 и посмотреть как будет работать bitmapscan ( 115млн записей/8 = 14 375 000 байт для идеального bitmap scan'а). чем меньше неиспользуемых индексов в таблице, тем лучше -- базе проще работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 04:58 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
Vladimir Sitnikov, shared_buffers = 24MB temp_buffers = 8MB work_mem = 10MB maintenance_work_mem = 16MB max_fsm_pages = 153600 max_fsm_relations = 1000 Postgres 8.3 Железо не самое слабое: AMD Athlon 64 X2 Dual Core 4200+, RAM 2GB, винты SATA, 3 штуки по 80 GB OS: Ubuntu 8.04 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 10:46 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
golden13work_mem = 10MB По-моему, увеличение до 20Мб должно помочь. Дело в том, что bitmap scan выполняется по-разному в зависимости от того помещается ли scan в work_mem или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 11:43 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
Vladimir Sitnikov, После установки work_mem = 20MB Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Уже похоже на правду. Что можно ещё сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 12:24 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
Однако, для запроса с другим word_id всё по прежнему :( Понятно, что тут больше rows. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вопросы всё теже. Что можете посоветовать? Может для такой большой таблицы имеет смысл использовать Partitioning? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 12:50 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
golden13-> Bitmap Heap Scan on res_pages_temp (actual time=..21466.504 rows=22396) -> Bitmap Index Scan on res_pages_temp_w_r (actual time=..27.328 rows=22396)поиск по индексу проходит быстро, а последующий выбор строк из таблицы тормозит. может быть из-за того, что эти 20 000 строк находятся на разных страницах. попробуйте кластеризовать таблицу res_pages_temp по индексу res_pages_temp_w_r. golden13Если enable_bitmapscan отключить, то получаем следующее: "Total runtime: 377.018 ms" 3. Когда выполняю данные запросы с Explain Analyze в PgAdmin часто скорость их выполнения скачет. Причём то она такая как приведена выше, то по 400ms как с включённым enable_bitmapscan так и с выключенным, с чем это может быть связанно?может быть время выполнения первого запроса с некоторым ограничением word_id=12345 (не важно по какому плану) медленное, а последующие с этим же word_id=12345 быстрые из-за кэширования страниц жесткого диска в память постгресом или операционной системой. golden131. Видно, что планировщик ошибается. Но так ли это всегда? То-есть буду ли я прав, если буду выполнять SET enable_bitmapscan TO off в приложении принудительно, для всех запросов такого типа?имхо, можно это сделать, для этого и нужен set enable_*. golden132. Как можно всё убыстрить? Просто, таких запросов приложение выполняет очень много подряд и общее время выполнения приложения, мягко говоря, не очень маленькое.как я уже написал, попробуйте кластеризовтаь таблицу. можно убрать offset, обрабатывать в приложении наборы большего объема, чем по 10 000 строк. потому что при выборке с offset-ом постгрес все равно читает пропускаемые строки из индекса и из таблицы, только не возвращает их. получается одна и та же работа делается несколько раз. golden134. Не страшно ли, что в таблице отсуствует primary key ?этого мы не боимся! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 15:32 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatgolden13-> Bitmap Heap Scan on res_pages_temp (actual time=..21466.504 rows=22396) -> Bitmap Index Scan on res_pages_temp_w_r (actual time=..27.328 rows=22396)поиск по индексу проходит быстро, а последующий выбор строк из таблицы тормозит. может быть из-за того, что эти 20 000 строк находятся на разных страницах.Как раз здесь это предположение неверно. В обоих случаях (и index scan и index bitmap scan для word_id=109681 прочитали по 22396 записей). Проблемным местом было именно recheck (обратите внимание, что и для index scan'а пришлось проверить эти 22396 записей по таблице на предмет их существования) LeXa NalBatпопробуйте кластеризовать таблицу res_pages_temp по индексу res_pages_temp_w_r.+1 Очень правильная мысль. golden13Причём то она такая как приведена выше, то по 400ms как с включённым enable_bitmapscan так и с выключенным, с чем это может быть связанно?может, на сервере крутится ещё что-нибудь кроме Pg? Покажите результат команды free LeXa NalBatgolden131. Видно, что планировщик ошибается. Но так ли это всегда? То-есть буду ли я прав, если буду выполнять SET enable_bitmapscan TO off в приложении принудительно, для всех запросов такого типа?имхо, можно это сделать, для этого и нужен set enable_*.set enable_* нужно для того, чтобы можно было узнать насколько сильно планировщик ошибается и зарепортить багу. Если довольствоваться включением/выключением, то никакого прогресса не будет. А попробуйте, пожалуйста, такой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2008, 20:00 |
|
||
|
Большая таблица, оптимизация
|
|||
|---|---|---|---|
|
#18+
golden13, здравствуйте. Загвоздка в использовании OFFSET с большим значением. Старайтесь такого избегать. Проблема и решение для вашей ситуации описаны тут . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2008, 00:03 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35645323&tid=2003889]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 259ms |
| total: | 366ms |

| 0 / 0 |
