Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
День добрый. Надеюсь, что местные гуру помогут решить данную проблему. Конфигурация тестовой машины: PostgreSQL 8.1.4 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special) под WinXP Prof SP2 (NTFS), P4-2600 HT, 512 MB RAM, IDE Maxtor (70 GB). postgresql.conf work_mem = 16192 shared_buffers = 4096 sort_mem = 4096 temp_buffers = 1000 Тестируя приложение на локальной базе (пара табличек максимальная всего 250 тыс. записей) обратил внимание на чудовищные с моей точки зрения тормоза по сравнению с MySQL 5.0.24-community-nt. Примеры: CREATE TABLE "public"."fares" ( "ID" INTEGER NOT NULL, "FaRecordLength" VARCHAR(4), "FaRecordType" VARCHAR(2), "FaID" VARCHAR(10) NOT NULL, "FaBlockID" VARCHAR(19) NOT NULL, "FaAktion" VARCHAR(1), "FaTkRef" VARCHAR(18), "FaRlRef" VARCHAR(18), "FaRtRef" VARCHAR(900), "FaTariffTitle" VARCHAR(20), "FaStructDeparture" VARCHAR(60), "FaStructArrival" VARCHAR(273), "FaValidPairs" VARCHAR(128), "FaSeasonCode" VARCHAR(3), "FaLastReturn" VARCHAR(8), "FaAdtRt" VARCHAR(1), "FaChdRt" VARCHAR(1), "FaInfRt" VARCHAR(1), "FaAdtOw" VARCHAR(11), "FaChdOw" VARCHAR(1), "FaInfOw" VARCHAR(1), "FaAdtRtNet" VARCHAR(11), "FaAdtOwNet" VARCHAR(11), "FaAdtRtTkt" VARCHAR(11), "FaAdtOwTkt" VARCHAR(11), "FaChdDiscount" VARCHAR(3), "FaChdIata" VARCHAR(1), "FaInfDiscount" VARCHAR(3), "FaInfIata" VARCHAR(1), "FaBlackOutDates" VARCHAR(80), "FaDatePurchase" VARCHAR(8), "FaLastDatePurchase" VARCHAR(8), "FaNotesIn" VARCHAR(4), "FaNotesOut" VARCHAR(1), "FaBruttoNettoSwitch" VARCHAR(1), "FaFareSeekCode" VARCHAR(1), "FaBlackOutDatesOut" VARCHAR(32), "FaBroker" VARCHAR(29), "FaAdtRtMinSelling" VARCHAR(6), "FaAdtOwMinSelling" VARCHAR(6), "FaCommissionRtAdt" VARCHAR(6), "FaCommissionOwAdt" VARCHAR(6), "crc" VARCHAR(32), CONSTRAINT "fares_pkey" PRIMARY KEY("ID") ) WITHOUT OIDS; CREATE INDEX "fares_idx" ON "public"."fares" USING btree ("crc"); 1. запрос select count(*) from ( select count(*), crc from fares group by crc having count(*) > 1 ) test PG: 55 sec (повтор - 49 sec). MySQL: 7 sec (повтор - 0.5 sec). 2. select max(LENGTH("FaRtRef")) from fares PG: 18 sec (повтор 16 sec.) MySQL: 1 sec (повтор - 0.7 sec). 3. PS. Таблица fares_new копия таблицы fares, только с количеством записей +~1000 select count(*) from fares_new where crc not in ( select crc from fares where fares.crc = fares_new.crc ) PG: 109 sec (повтор 79 sec.) MySQL: 4 sec (повтор - 3 sec). Подскажите, пожалуйста, какие настройки надо подкрутить у PG, чтобы избавиться от тормозов. Заранее спасибо! Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 15:47 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
У Постгреса count тормозной. Нужно строить костыли для быстрого получения общего кол-ва. Если нужна скорострельность - бери мускул на MyISAM'e (самый быстрый из существ.БД - но без транзакций), фичастость - постгри. по настроикам http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 15:59 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
PS. vacuum full analyze делал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 15:59 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Тормозит, к сожалению, не только count(*): 2. select max(LENGTH("FaRtRef")) from fares PG: 18 sec (повтор 16 sec.) MySQL: 1 sec (повтор - 0.7 sec). 4. select * from fares_new where crc not in ( select crc from fares where fares.crc = fares_new.crc ) limit 10 PG: 30 sec (повтор 79 sec.) MySQL: 3 sec (повтор - 2.5 sec). А разобраться хотелось бы именно с настройкой PG. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 16:20 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
shared_buffers = 4096 слишком мало. Те постгресс в памяти держит только 4096*8Kb данных. Попробуй увеличить например до 16384-32768(128-256Mb). sort_mem = 4096 можно тоже увеличить до 10240 например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 16:43 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Master Alex 4. select * from fares_new where crc not in ( select crc from fares where fares.crc = fares_new.crc ) limit 10 PG: 30 sec (повтор 79 sec.) MySQL: 3 sec (повтор - 2.5 sec). а вот это надо переписать на внешнее объединение (или попробывать с EXCEPT) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 16:56 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Master AlexТормозит, к сожалению, не только count(*): 2. select max(LENGTH("FaRtRef")) from fares PG: 18 sec (повтор 16 sec.) MySQL: 1 sec (повтор - 0.7 sec). Есть хоть одна БД, в которой ЭТО не тормозит по умолчанию? Построй функциональный индекс. [quot Master Alex] 4. select * from fares_new where crc not in ( select crc from fares where fares.crc = fares_new.crc ) limit 10 PG: 30 sec (повтор 79 sec.) MySQL: 3 sec (повтор - 2.5 sec). А разобраться хотелось бы именно с настройкой PG.[quot Master Alex] Перепиши с JOIN и опять же попробуй построить функциональный индекс. Вообще, руки отрывать надо за такие запросы... А в MySQL много чего не тормозит из-за ее файлово-индексного движка, но вот только ни на что сложнее веб-портала ее лучше не ставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 18:32 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
ездунУ Постгреса count тормозной. Это называется "Слышал звон..." ChameLe0nshared_buffers = 4096 слишком мало. Те постгресс в памяти держит только 4096*8Kb данных. Попробуй увеличить например до 16384-32768(128-256Mb). Суперсовет, при условии наличия у вопрошающего всего 512 метров памяти, ага. Master Alex work_mem = 16192 shared_buffers = 4096 sort_mem = 4096 temp_buffers = 1000 Читаем release notes к версии 8.0 и видим: Release notes Server configuration parameters SortMem and VacuumMem have been renamed to work_mem and maintenance_work_mem to better reflect their use. The original names are still supported in SET and SHOW. Так откуда здесь взялся sort_mem? Да, и в какое значение выставлен effective_cache_size? 1. запрос select count(*) from ( select count(*), crc from fares group by crc having count(*) > 1 ) test PG: 55 sec (повтор - 49 sec). MySQL: 7 sec (повтор - 0.5 sec). Можно посмотреть explain analyze запроса для postgres'а и его аналог для mysql? select max(LENGTH("FaRtRef")) from fares Строить индекс по length("FaRtRef"). Возможно переписать запрос в виде Код: plaintext 1. select count(*) from fares_new where crc not in ( select crc from fares where fares.crc = fares_new.crc ) переписать в виде Код: plaintext 1. 2. 3. 4. 5. А вообще тот факт, что "повторы" в mysql работают быстрее, а в postgres'е --- нет, говорит нам о том, что postgres нифига кэш не использует. Да и вообще для таблиц в 250 тыс записей десятки секунд на запрос --- величины невероятные. Там случаем память не кончилась, не свопит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 18:46 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Инфа для размышления: Взял две таблицы по одной целой колонке. В t1 загнал числа от 1 до 10000 по порядку, в t2 - от 2 до 20000 с шагом 2 (2, 4, 6...) Результатом выполнения запроса во всех случаях является цифра 5000. MaserAlex, обратите внимание на стоимости запросов: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ну и напоследок: Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. 6. Запрсы нужно писать с умом, любовью и нежностью :-) ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 19:20 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Брешу. Первые два запроса - 4999, последний - 5000. ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 19:23 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Опять брешу. Просто числа 1-10 у меня в T1 повторялись :-) ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 19:28 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за идеи по параметрам и корректировку запросов! После подкрутки и установки на нормальный сервер (Dual Xeon 2.8, 1GB) все залетало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2006, 23:11 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Sad Spirit ChameLe0nshared_buffers = 4096 слишком мало. Те постгресс в памяти держит только 4096*8Kb данных. Попробуй увеличить например до 16384-32768(128-256Mb). Суперсовет, при условии наличия у вопрошающего всего 512 метров памяти, ага. А вообще тот факт, что "повторы" в mysql работают быстрее, а в postgres'е --- нет, говорит нам о том, что postgres нифига кэш не использует. Да и вообще для таблиц в 250 тыс записей десятки секунд на запрос --- величины невероятные. Там случаем память не кончилась, не свопит? Отличные выводы. Судя по тому что длина одной записи около 1.5-2k, а записей всего около 250к, + учитывая служебные данные => размер таблицы ~400-550Мб. Постгрессу отведено 4к shared_buffers(32 М). Отсюда думаю легко догадаться что постгрес во время запросов постоянно читает с дисков. А судя по запросам они почти все читали полностью таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2006, 10:14 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
К сожалению на 512 MB памяти мне так и не удалось добиться приемлемой производительности PG. Перепробовал кучу вариантов параметров настройки - все мимо - сервер стоит колом, шуршит диском и не использует индексы там, где их использует MySQL: explain analyze select count(*) from ( select count(*), crc from fares group by crc having count(*) > 1 ) test Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. по этому запросу плана выполнения получить не удалось - сервер ушел в стопор и не вернулся :( select count(*) from fares_new where crc not in ( select crc from fares ) Настройка сервера приаттачена. Если у кого будут идеи или опыт тюнинга PG на 512 MB памяти - welcome! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2006, 18:59 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Master Alexне использует индексыпопробуйте set enable_seqscan to off, и т. п. Master Alex-> Seq Scan on fares (cost=0.00..39487.11 rows=249911 width=36) (actual time=14.326..23288.953 rows=249911 loops=1)даже seqscan работает 23 секунды. слишком долго. думаю что любой другой план не будет намного быстрее. Master Alexпо этому запросу плана выполнения получить не удалось - сервер ушел в стопор и не вернулся :(в таких случаях можно смотреть explain, без analyze Master Alexselect count(*) from fares_new where crc not in ( select crc from fares )у меня по такому запросу получился план Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2006, 19:42 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Master Alex explain analyze select count(*) from ( select count(*), crc from fares group by crc having count(*) > 1 ) test Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Ну, и о чём нам говорит план выполнения? Сначала у нас 23 секунды читается с диска таблица. Потом с 23-й секунды до 50-й она сортируется. Очевидно, тоже на диске, т.к. в щедро выделенные 10 метров (work_mem) не помещается. Хотелось бы посмотреть ещё на результат запроса Код: plaintext 1. В любом случае, этот запрос без Seq Scan не обойдётся --- особенности архитектуры PostgreSQL; MySQL, возможно, обходится просмотром по индексу. Да и формат хранения данных у него (в случае MyISAM) покомпактнее в разы, так что Seq Scan быстрее. Вариантов ускорить Seq Scan (повторяю, без него тут всё равно не обойтись, enable_seqscan=off может только затормозить запрос) немного: 1) Добавить памяти 2) Поставить более шустрый диск (23 секунды на чтение таблицы!?) 3) Уменьшить размер таблицы. 4) Можно ещё прямо перед запросом (не в postgresql.conf!) выставить жырное значение work_mem, чтобы делалась не сортировка, а что-то типа hash aggregate. Но от первых 23 секунд это, скорее всего, не избавит. Рекомендую крепко задуматься о третьем варианте: таблица из 43 полей, причём все, кроме id, имеют тип varchar? Слово "нормализация" о чём-нибудь говорит? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2006, 22:11 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Sad SpiritНу, и о чём нам говорит план выполнения? Сначала у нас 23 секунды читается с диска таблица. Потом с 23-й секунды до 50-й она сортируется. Очевидно, тоже на диске, т.к. в щедро выделенные 10 метров (work_mem) не помещается. Да, проблема, действительно оказалась в установках, еще раз покрутив их было найдено вот такое сочетание, которое давало вполне приемлемые результаты выполнения запросов: Код: plaintext 1. 2. 3. 4. 5. Еще раз огромное спасибо всем за советы и за варианты запросов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2006, 15:02 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
> "Сначала у нас 23 секунды читается с диска таблица. Потом с 23-й секунды до 50-й она сортируется. Очевидно, тоже на диске, т.к. в щедро выделенные 10 метров (work_mem) не помещается." А откуда взяты цифры? Что то накосо просмотрев результат анализа не обнаружил числа 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 02:22 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
ShadyAngel> "Сначала у нас 23 секунды читается с диска таблица. Потом с 23-й секунды до 50-й она сортируется. Очевидно, тоже на диске, т.к. в щедро выделенные 10 метров (work_mem) не помещается." А откуда взяты цифры? Что то накосо просмотрев результат анализа не обнаружил числа 23. actual time=14.326..23288.953 c 14 миллисекунды начала запроса по 23288 миллисекунду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 08:38 |
|
||
|
Помогите настроить PostgreSQL
|
|||
|---|---|---|---|
|
#18+
Sad SpiritРекомендую крепко задуматься о третьем варианте: таблица из 43 полей, причём все, кроме id, имеют тип varchar? Слово "нормализация" о чём-нибудь говорит? :) Присоединяюсь: много полей типа VARCHAR(1) - храниться какой-то флаг?, ну так smallint или boolean лучше будет!!! Ибо VARCHAR(1) храниться как (минимум) 4байта - длинна(=1) и данные (подозреваю, тоже до 4 байт округленны). Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 11:07 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33992908&tid=2006095]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
130ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 477ms |

| 0 / 0 |
