Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
В постгресе зависимости между объектами по уникальным идентификаторам этих объектов записываются, соответственно, на изменение имени таблицы постгресу чихать, все будет работать. Тем не менее, желательно отказаться от хранения всего в схеме public и создать схемы для данных. Например, в схеме data можно хранить "сырые" данные, а в схеме "cache" таблицы функционалов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 12:40 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
ignitorСледует ли для каждой таблицы пересоздавать\изменять правила или при переименовании родительской таблицы PG сам сделает все что нужно?не надо, постгрес сделает это сам Код: 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. MBG http://oc.cs.msu.su/club/html/node2.html#SECTION00022000000000000000 Насколько я понял по этому посту , настройками wal от записи на диск по каждому коммиту не избавиться, потому что данные на диск все-таки будут записываться, но не в таблицу, а в лог. MBGжелательно отказаться от хранения всего в схеме public и создать схемы для данных. Например, в схеме data можно хранить "сырые" данные, а в схеме "cache" таблицы функционалов.Не в каждой БД непременно нужно раскидывать структуру по схемам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 14:18 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBatНасколько я понял по этому посту , настройками wal от записи на диск по каждому коммиту не избавиться, потому что данные на диск все-таки будут записываться, но не в таблицу, а в лог. В общем да. Но дело в том, что записать в лог соответствующее событие не требует каких-то трудоемких операций, это ведь не обновление данных в таблицах. В отличие от оракла, постгрес работает со своими данными через файловую систему, которая (линукс) тоже умеет кэшировать и делает это здорово. Так что если беспокоит именно файловый ввод/вывод, нужно настраивать на уровне файловой системы. Если уж так интересует этот вопрос, для начала можно noatime опцию для ФС выставить, должно помочь именно для множества мелких транзакций. А лучше научиться пользоваться двухфазными транзакциями и не заморачиваться на оптимизацию низкоуровневых операций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 16:54 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
И еще вопрос - что быстрее для операции SELECT? Составной индекс CREATE INDEX rest_idx_3 ON restdepcrd USING btree (rest_date, accanl_pic); или 2 индекса CREATE INDEX rest_idx_3_1 ON restdepcrd USING btree (rest_date); CREATE INDEX rest_idx_3_2 ON restdepcrd USING btree (accanl_pic); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 17:07 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Составной быстрее, поскольку не требует лишних вычислений и плюс к тому занимает физически меньше места. Но с появлением bitmap index scan не стоит без нужды прибегать к составным индексам. Разве чтобы order by ускорить. Сам составными индексами перестал пользоваться с появлением bitmap индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 17:20 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBG LeXa NalBat MBG LeXa NalBatименно при commit-е происходит flush на диск. (Зависит от wal_sync_method.)Не согласен. Если настройки базы заставляют каждую единичную операцию сразу писать на диск, производительность будет плачевной. Обычно записывается сразу пакет изменений. http://oc.cs.msu.su/club/html/node2.html#SECTION00022000000000000000 Насколько я понял по этому посту , настройками wal от записи на диск по каждому коммиту не избавиться, потому что данные на диск все-таки будут записываться, но не в таблицу, а в лог.В общем да.ok MBGзаписать в лог соответствующее событие не требует каких-то трудоемких операций, это ведь не обновление данных в таблицахОбсуждался вопрос о кэшировании. Он действительно очень важен. Потому что узким местом могут оказаться не "какие-то трудоемкие операции" с CPU и памятью, а запись и чтение диска. Объемы данных (кол-во страниц), которые необходимо flush-ить в файл WAL-лога, и в файл таблицы, мне кажется, должны быть сравнимы. То есть кардинальной разницы в скорости записи WAL-лога и файла таблицы нет. MBGВ отличие от оракла, постгрес работает со своими данными через файловую системуРазве оракл не умеет работать через файловую систему? MBGлучше научиться пользоваться двухфазными транзакциямиВы имеете в виду то, что в доке называется "two-phase commit"? Уже начали филосовствовать о кластерах и репликации? :-) MBGне заморачиваться на оптимизацию низкоуровневых операций.идеально, чтобы на каждом уровне было оптимально :-) ignitorИ еще вопрос - что быстрее для операции SELECT? Составной индекс или 2 индексаЗависит от условия where. Для "a=1 and b=2" - составной, для "a=1 or b=2" - два простых. MBGСоставной ... занимает физически меньше местаможет занимать почти столько же места Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.07.2007, 18:26 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat MBGлучше научиться пользоваться двухфазными транзакциямиВы имеете в виду то, что в доке называется "two-phase commit"? Уже начали филосовствовать о кластерах и репликации? :-) Не философия, а насущная необходимость :-) Хотел напомнить - СУБД это в частности и многопользовательский доступ, и целостность данных. Потому сравнивать скорость записи в файл и скорость сохранения данных в СУБД особого смысла не имеет. А вот вопросов про создание эффективных и надежных приложений к сожалению не вижу. Оптимизация select-ов и insert-ов это хорошо, но серьезную систему только на этом не построить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 10:53 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBGСоставной быстрее, поскольку не требует лишних вычислений и плюс к тому занимает физически меньше места. Но с появлением bitmap index scan не стоит без нужды прибегать к составным индексам. Разве чтобы order by ускорить. Сам составными индексами перестал пользоваться с появлением bitmap индексов. Я тоже по началу отказался от составных индексов, но когда размер таблицы вырос производительность резко упала. Впрочем, при кластеризации ситуация должна измениться в лучшую сторону. Просто к кластеризации только начал подходить (размер базы - 3GB). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 11:38 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBG LeXa NalBat MBGлучше научиться пользоваться двухфазными транзакциямиВы имеете в виду то, что в доке называется "two-phase commit"? Уже начали филосовствовать о кластерах и репликации? :-)Не философия, а насущная необходимость :-)Нет, это не "насущная необходимость". Думаю, в 99% проектов можно обойтись без репликации. MBGсравнивать скорость записи в файл и скорость сохранения данных в СУБД особого смысла не имеетДа, но второе зависит, и даже может определяться первым. Кстати, я не нашел, чтобы кто-нибудь в этом топике их сравнивал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2007, 12:34 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Как и обещал, первые результаты: Пока разбил 1 таблицу. Получилось 102 таблицы типа CREATE TABLE data.docblc_y1999m02 ( -- Inherited: id bigint, -- Inherited: doctype bigint, -- Inherited: sumbasecur numeric, -- Inherited: idarea bigint, -- Inherited: idbranch bigint, -- Inherited: idfund bigint, -- Inherited: vo character(2), -- Inherited: iddebacc bigint, -- Inherited: idcreacc bigint, -- Inherited: numdoc character(10), -- Inherited: docdate date, -- Inherited: docsum numeric, -- Inherited: bic_counter character(9), -- Inherited: taxid_counter character(12), -- Inherited: acc_counter character(25), -- Inherited: cacc_counter character(25), -- Inherited: dateexp date, -- Inherited: datecreate date, -- Inherited: note character(1000), -- Inherited: idexecutor bigint, CONSTRAINT docblc_y1999m02_docdate_check CHECK (docdate >= '1999-02-01'::date AND docdate < '1999-03-01'::date) ) INHERITS (docblc_) WITHOUT OIDS; ALTER TABLE data.docblc_y1999m02 OWNER TO postgres; Правил никаких не делал, т.к. писать в эти таблицы могу только я, а я знаю куда чего вливать и откуда чего удалять. На запросах типа CREATE TEMPORARY TABLE tmp_table (sum_doc numeric,charcod character(3),acc_cre character(5)) WITHOUT OIDS; insert into tmp_table(sum_doc,charcod,acc_cre) select sumbasecur,charcod,ret_pair_doc_cre(docblc.id) as acc_cre from docblc join accanl on (accanl.id=docblc.iddebacc and accsin2 in ('40911','40912','40913','42301','42601')) left join locbranch on (locbranch.id=accanl.idlocbranch) where docdate>='2007-01-01' and docdate<='2007-06-30' and sumbasecur>0; select sum(sum_doc)/1000 as sum_doc,charcod from tmp_table where acc_cre='70107' group by charcod Union select sum(docsum)/1000 as sum_doc,locbranch.charcod from docblc join accanl on (accanl.id=docblc.iddebacc and accsin2 in ('40911','40912','40913','42301','42601')) left join locbranch on (locbranch.id=accanl.idlocbranch) where docdate>='2007-01-01' and docdate<='2007-06-30' and idcreacc in (select id from accanl where accsin2='70107') group by locbranch.charcod; select * from tmp_table; при выбраном периоде 1 неделя выйгрыш по побитой таблице составил 15 раз, тот же запрос за полугодие 4 раза. Это пока так - первые впечатления. Стоит ли продолжать и смотреть в сторону кластеризации индексов? Или по сравнению с разделением это большого выйгрыша в селектах не даст? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2007, 16:02 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Кластеризация может ЕЩЕ дать выигрыш в десятки раз. То есть если сейчас оптимизация в 10 раз, то будет в сотни. Но только на определенном виде запросов. Снова повторять не буду, см. подробности по ссылке http://postgrestips.blogspot.com/2007/06/cluster.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2007, 21:59 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Наблюдение: при переименовании таблиц в хранимых процедурах их имена автоматом не переименовываются. Нужен совет. Есть у меня таблица restanl CREATE TABLE restanl ( idaccanl bigint, restanl_date date, turndeb numeric(19,2), turncre numeric(19,2), rest numeric(19,2), turndebnc numeric(19,2), turncrenc numeric(19,2), restnc numeric(19,2), datelastchange date ) WITHOUT OIDS; в ней хранятся остатки и обороты по счетам клиентов, т. о. на каждый день если счет не закрыт, в restanl есть остаток и обороты по нему. Я разделил эту таблицу по месяцам, предполагая, что запросы должны работать быстреее, если поиск идет по частям таблицы, а не по всем 10млн. записей. Однако, при первых же тестах на большой период в запросе выясилось, что запрос типа: select charcod,sum(abs(turndeb)) as td,sum(abs(turncre)) as tc from restanl_old join accanl on (restanl_old.idaccanl=accanl.id) left join fvaluedia on (fvaluedia.idrow=accanl.id and fvaluedia.idfeature=749630 and fvaluedia.fvalue not in ('Накопительный','Счет КБК') ) left join locbranch on (accanl.idlocbranch=locbranch.id) where (restanl_date >'2006-1-31' and restanl_date <='2006-07-31') and accanl.accanl_fund=56537 and ((accanl.dateclose>='2006-07-01' or accanl.dateclose is null ) and accanl.dateopen<='2006-07-31') and ((accanl.accsin1 in ('401','402','403','404','405','406','407')) or (accanl.accsin2 in ('40802','40804','40805','40806','40807'))) and idfeature is not null group by accanl.id,charcod выполняется по старой таблице --Total query runtime: 43985 ms. --2224 rows retrieved. по новой, распределенной таблице --Total query runtime: 231156 ms. --2224 rows retrieved. причем повторный запрос по обеим таблицам дает одно и то же время (видимо работает кэш) --Total query runtime: 4828 ms. --2224 rows retrieved. EXPLAIN ANALYZE по запросу со старой таблицей "GroupAggregate (cost=241769.67..243151.99 rows=42533 width=40) (actual time=43435.108..44419.309 rows=2224 loops=1)" " -> Sort (cost=241769.67..241876.00 rows=42533 width=40) (actual time=43434.668..43846.874 rows=258575 loops=1)" " Sort Key: accanl.id, locbranch.charcod" " -> Hash Join (cost=41205.24..237564.67 rows=42533 width=40) (actual time=13816.126..42273.569 rows=258575 loops=1)" " Hash Cond: (restanl_old.idaccanl = accanl.id)" " -> Bitmap Heap Scan on restanl_old (cost=32869.89..215972.52 rows=2053175 width=24) (actual time=3597.128..30812.620 rows=1824364 loops=1)" " Recheck Cond: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Bitmap Index Scan on idx13 (cost=0.00..32356.60 rows=2053175 width=0) (actual time=3576.962..3576.962 rows=1824364 loops=1)" " Index Cond: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Hash (cost=8320.36..8320.36 rows=1199 width=32) (actual time=10218.953..10218.953 rows=2224 loops=1)" " -> Hash Left Join (cost=98.06..8320.36 rows=1199 width=32) (actual time=86.268..10215.382 rows=2224 loops=1)" " Hash Cond: (accanl.idlocbranch = locbranch.id)" " -> Nested Loop (cost=85.59..8299.32 rows=1199 width=24) (actual time=86.188..10211.567 rows=2224 loops=1)" " -> Bitmap Heap Scan on accanl (cost=85.59..4951.53 rows=1342 width=16) (actual time=39.763..6831.005 rows=2251 loops=1)" " Recheck Cond: ((accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[])) OR (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[])))" " Filter: ((accanl_fund = 56537) AND ((dateclose >= '2006-07-01'::date) OR (dateclose IS NULL)) AND (dateopen <= '2006-07-31'::date))" " -> BitmapOr (cost=85.59..85.59 rows=4518 width=0) (actual time=2.349..2.349 rows=0 loops=1)" " -> Bitmap Index Scan on idx30 (cost=0.00..54.80 rows=3336 width=0) (actual time=1.598..1.598 rows=3330 loops=1)" " Index Cond: (accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[]))" " -> Bitmap Index Scan on idx31 (cost=0.00..30.11 rows=1181 width=0) (actual time=0.747..0.747 rows=1116 loops=1)" " Index Cond: (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[]))" " -> Index Scan using idx_dia_1 on fvaluedia (cost=0.00..2.48 rows=1 width=8) (actual time=1.221..1.498 rows=1 loops=2251)" " Index Cond: (fvaluedia.idrow = accanl.id)" " Filter: ((idfeature = 749630) AND ((fvalue)::text <> ALL (('{Накопительный,"Счет КБК"}'::character varying[])::text[])) AND (idfeature IS NOT NULL))" " -> Hash (cost=11.10..11.10 rows=110 width=24) (actual time=0.054..0.054 rows=6 loops=1)" " -> Seq Scan on locbranch (cost=0.00..11.10 rows=110 width=24) (actual time=0.037..0.041 rows=6 loops=1)" "Total runtime: 44429.273 ms" тоже с новой "GroupAggregate (cost=42118.93..43344.27 rows=37703 width=60) (actual time=217102.431..217933.799 rows=2224 loops=1)" " -> Sort (cost=42118.93..42213.18 rows=37703 width=60) (actual time=217101.956..217351.461 rows=258575 loops=1)" " Sort Key: accanl.id, locbranch.charcod" " -> Nested Loop (cost=98.06..38148.05 rows=37703 width=60) (actual time=257.351..215724.877 rows=258575 loops=1)" " Join Filter: (public.restanl.idaccanl = accanl.id)" " -> Nested Loop (cost=98.06..8859.36 rows=1199 width=32) (actual time=3.238..148.988 rows=2224 loops=1)" " -> Hash Left Join (cost=98.06..4973.59 rows=1342 width=24) (actual time=3.147..71.506 rows=2251 loops=1)" " Hash Cond: (accanl.idlocbranch = locbranch.id)" " -> Bitmap Heap Scan on accanl (cost=85.59..4951.53 rows=1342 width=16) (actual time=3.092..64.353 rows=2251 loops=1)" " Recheck Cond: ((accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[])) OR (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[])))" " Filter: ((accanl_fund = 56537) AND ((dateclose >= '2006-07-01'::date) OR (dateclose IS NULL)) AND (dateopen <= '2006-07-31'::date))" " -> BitmapOr (cost=85.59..85.59 rows=4518 width=0) (actual time=2.146..2.146 rows=0 loops=1)" " -> Bitmap Index Scan on idx30 (cost=0.00..54.80 rows=3336 width=0) (actual time=1.539..1.539 rows=3330 loops=1)" " Index Cond: (accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[]))" " -> Bitmap Index Scan on idx31 (cost=0.00..30.11 rows=1181 width=0) (actual time=0.603..0.603 rows=1116 loops=1)" " Index Cond: (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[]))" " -> Hash (cost=11.10..11.10 rows=110 width=24) (actual time=0.036..0.036 rows=6 loops=1)" " -> Seq Scan on locbranch (cost=0.00..11.10 rows=110 width=24) (actual time=0.021..0.025 rows=6 loops=1)" " -> Index Scan using idx_dia_1 on fvaluedia (cost=0.00..2.88 rows=1 width=8) (actual time=0.024..0.030 rows=1 loops=2251)" " Index Cond: (fvaluedia.idrow = accanl.id)" " Filter: ((idfeature = 749630) AND ((fvalue)::text <> ALL (('{Накопительный,"Счет КБК"}'::character varying[])::text[])) AND (idfeature IS NOT NULL))" " -> Append (cost=0.00..24.33 rows=8 width=44) (actual time=15.042..96.799 rows=116 loops=2224)" " -> Index Scan using rstanl_idx1 on restanl (cost=0.00..1.28 rows=1 width=44) (actual time=0.011..0.011 rows=0 loops=2224)" " Index Cond: ((public.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = public.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m01_idx2 on rstanl_y2006m01 restanl (cost=0.00..3.17 rows=1 width=24) (actual time=12.406..12.406 rows=0 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m02_idx2 on rstanl_y2006m02 restanl (cost=0.00..3.25 rows=1 width=24) (actual time=2.007..14.875 rows=17 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m03_idx2 on rstanl_y2006m03 restanl (cost=0.00..3.32 rows=1 width=24) (actual time=2.198..14.314 rows=20 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m04_idx2 on rstanl_y2006m04 restanl (cost=0.00..3.28 rows=1 width=24) (actual time=1.837..13.475 rows=19 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m05_idx2 on rstanl_y2006m05 restanl (cost=0.00..3.32 rows=1 width=24) (actual time=2.601..13.485 rows=20 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m06_idx2 on rstanl_y2006m06 restanl (cost=0.00..3.34 rows=1 width=24) (actual time=2.218..12.811 rows=21 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m07_idx2 on rstanl_y2006m07 restanl (cost=0.00..3.36 rows=1 width=24) (actual time=2.517..15.324 rows=21 loops=2224)" " Index Cond: ((data.restanl.idaccanl = accanl.id) AND (fvaluedia.idrow = data.restanl.idaccanl))" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" "Total runtime: 217937.207 ms" есть у меня подозрение, что я либо 1) слишком мелко поделил таблицу (возможно имеет смысл поделить ее по годам, если принять во внимание то, что запросы на стыке лет бывают редко) 2) поделил таблицу не по тому полю (большинство связей в запросах используют idaccanl, но всегда имеется условие либо период, либо на дату) 3) запрос никуда не годится, либо для новой таблицы его нужно переписать - но как? подскажите, что делать - может вернуть все обратно для этой таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 13:09 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
constraint_exclusion = on ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 13:45 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
show constraint_exclusion on ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 13:59 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Хотя вроде включен, но вообще странно, . Запрос написан ужасно - настолько запутанная конструкция не поддается никакой отладке. Попробуйте сделать пошаговую обработку данных, как минимум, станет ясно, где узкое место, а возможно, сразу будет работать быстрее http://postgrestips.blogspot.com/2007/07/temp.html P.S. Для указанного типа запроса и объема данных время выполнения 43985 ms просто огромное, пора создавать функционалы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:08 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Думаю, что запрос по исходной таблицы работает быстрее только за счет кэша. А разделение по месяцам здесь вполне нормально, разделять нужно именно по условию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:18 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Ужасный запрос - это следствие ужасной структуры данных в Diasoft Bank4х4. Большинство признаков объектов у них - являются прицепленными классификаторами и хранятся в разных таблицах, причем классификатором может быть конкретное значение или его отсутствие. Обновлять данные приходится минимум 2 раза в день. Поэтому самый быстрый способ без всякой логики заливать данные в таблицы-аналоги, а потом пытаться связать все вместе. Вьюхи я пробовал - быстродействия они , в моем случае, не прибавляли. Но я готов попробовать упростить этот конкретный запрос. О результатах сообщу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:21 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Есть такое подозрение, что медленно запрос выполняется из-за группировки - часть данных отсеивается не до, а после выполнения группировки. Но точно сказать не могу, поскольку не понимаю логику обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:42 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Чудеса - сделал две вьюхи CREATE OR REPLACE VIEW data.t_acc_charcod AS SELECT accanl.id AS idaccanl, locbranch.charcod FROM accanl LEFT JOIN locbranch ON accanl.idlocbranch = locbranch.id WHERE accanl.accanl_fund = 56537 AND (accanl.dateclose >= '2006-07-01'::date OR accanl.dateclose IS NULL) AND accanl.dateopen <= '2006-07-31'::date AND ((accanl.accsin1 = ANY (ARRAY['401'::bpchar, '402'::bpchar, '403'::bpchar, '404'::bpchar, '405'::bpchar, '406'::bpchar, '407'::bpchar])) OR (accanl.accsin2 = ANY (ARRAY['40802'::bpchar, '40804'::bpchar, '40805'::bpchar, '40806'::bpchar, '40807'::bpchar]))); ALTER TABLE data.t_acc_charcod OWNER TO postgres; и CREATE OR REPLACE VIEW data.t_fvalue AS SELECT fvaluedia.idrow FROM fvaluedia WHERE fvaluedia.idfeature = 749630 AND (fvaluedia.fvalue::text <> ALL (ARRAY['Накопительный'::character varying, 'Счет КБК'::character varying]::text[])); ALTER TABLE data.t_fvalue OWNER TO postgres; результаты поразительные /* select data.t_acc_charcod.idaccanl,restanl.turndebnc,restanl.turncrenc from data.t_acc_charcod left join data.t_fvalue on data.t_fvalue.idrow=data.t_acc_charcod.idaccanl join restanl on restanl.idaccanl=data.t_acc_charcod.idaccanl where (restanl_date >'2006-1-31' and restanl_date <='2006-07-31') */ --Total query runtime: 38797 ms. --260805 rows retrieved. /* select data.t_acc_charcod.idaccanl,restanl_new.turndebnc,restanl_new.turncrenc from data.t_acc_charcod left join data.t_fvalue on data.t_fvalue.idrow=data.t_acc_charcod.idaccanl join restanl_new on restanl_new.idaccanl=data.t_acc_charcod.idaccanl where (restanl_date >'2006-1-31' and restanl_date <='2006-07-31') */ --Total query runtime: 2812 ms. --260805 rows retrieved. explain analyze: "Hash Join (cost=8878.42..74507.48 rows=42216 width=44) (actual time=96.485..4507.101 rows=260805 loops=1)" " Hash Cond: (public.restanl_new.idaccanl = accanl.id)" " -> Append (cost=2.28..51526.42 rows=1824368 width=44) (actual time=0.185..3234.344 rows=1824364 loops=1)" " -> Bitmap Heap Scan on restanl_new (cost=2.28..6.68 rows=3 width=44) (actual time=0.060..0.060 rows=0 loops=1)" " Recheck Cond: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Bitmap Index Scan on rstanl_idx2 (cost=0.00..2.28 rows=3 width=0) (actual time=0.056..0.056 rows=0 loops=1)" " Index Cond: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Index Scan using rstanl_y2006m01_idx1 on rstanl_y2006m01 restanl_new (cost=0.00..4.28 rows=1 width=24) (actual time=0.089..0.089 rows=0 loops=1)" " Index Cond: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m02 restanl_new (cost=0.00..7403.40 rows=262093 width=24) (actual time=0.033..275.149 rows=262093 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m03 restanl_new (cost=0.00..8665.17 rows=306811 width=24) (actual time=0.054..325.326 rows=306811 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m04 restanl_new (cost=0.00..8013.92 rows=283661 width=24) (actual time=0.053..303.852 rows=283661 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m05 restanl_new (cost=0.00..8767.59 rows=310506 width=24) (actual time=0.054..326.227 rows=310506 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m06 restanl_new (cost=0.00..9129.40 rows=323293 width=24) (actual time=0.056..338.307 rows=323293 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Seq Scan on rstanl_y2006m07 restanl_new (cost=0.00..9536.00 rows=338000 width=24) (actual time=0.053..352.677 rows=338000 loops=1)" " Filter: ((restanl_date > '2006-01-31'::date) AND (restanl_date <= '2006-07-31'::date))" " -> Hash (cost=8859.36..8859.36 rows=1342 width=8) (actual time=96.222..96.222 rows=2251 loops=1)" " -> Hash Left Join (cost=98.06..8859.36 rows=1342 width=8) (actual time=3.419..93.725 rows=2251 loops=1)" " Hash Cond: (accanl.idlocbranch = locbranch.id)" " -> Nested Loop Left Join (cost=85.59..8837.31 rows=1342 width=16) (actual time=3.367..90.748 rows=2251 loops=1)" " -> Bitmap Heap Scan on accanl (cost=85.59..4951.53 rows=1342 width=16) (actual time=3.204..50.242 rows=2251 loops=1)" " Recheck Cond: ((accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[])) OR (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[])))" " Filter: ((accanl_fund = 56537) AND ((dateclose >= '2006-07-01'::date) OR (dateclose IS NULL)) AND (dateopen <= '2006-07-31'::date))" " -> BitmapOr (cost=85.59..85.59 rows=4518 width=0) (actual time=2.257..2.257 rows=0 loops=1)" " -> Bitmap Index Scan on idx30 (cost=0.00..54.80 rows=3336 width=0) (actual time=1.590..1.590 rows=3330 loops=1)" " Index Cond: (accsin1 = ANY ('{401,402,403,404,405,406,407}'::bpchar[]))" " -> Bitmap Index Scan on idx31 (cost=0.00..30.11 rows=1181 width=0) (actual time=0.664..0.664 rows=1116 loops=1)" " Index Cond: (accsin2 = ANY ('{40802,40804,40805,40806,40807}'::bpchar[]))" " -> Index Scan using idx_dia_1 on fvaluedia (cost=0.00..2.88 rows=1 width=8) (actual time=0.013..0.015 rows=1 loops=2251)" " Index Cond: (fvaluedia.idrow = accanl.id)" " Filter: ((idfeature = 749630) AND ((fvalue)::text <> ALL (('{Накопительный,"Счет КБК"}'::character varying[])::text[])))" " -> Hash (cost=11.10..11.10 rows=110 width=8) (actual time=0.035..0.035 rows=6 loops=1)" " -> Seq Scan on locbranch (cost=0.00..11.10 rows=110 width=8) (actual time=0.021..0.025 rows=6 loops=1)" "Total runtime: 4607.482 ms" Будут комментарии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:49 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Вообщето по explain видно что до вьюх набор из 7 месяцев поднимался с диска 2224 раза, а в последнем варианте только 1 раз. Видимо в этом дело - поправьте меня, если вру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 14:54 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
При использовании группировок планировщик запроса часто себя ведет, скажем так, неадекватно. Потому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро. P.S. Кстати, при использовании функционалов подобный анализ проводится за десятки миллисекунд :-) На машине целерон 2,4 ГГц, ОЗУ 256 Мб, таблица 5 миллионов записей. На вашем железе можно терабайтные базы гонять. P.P.S. Продолжать будем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:08 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Пожалуй нет, только вопрос параметризовать вьюхи я так понимаю нельзя? Стало быть мне нужно использовать во вьюхах хранимые процедуры и переписывать запросы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:11 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Только не это!!! Нужно из хранимых процедур создавать виды с нужными параметрами, но ни в коем случае нельзя в видах использовать хранимки. Это особенность постгреса, на которой часто спотыкаются ораклисты. Именно потому я и говорил о временных видах - запустил процедуру с нужными параметрами, она создала временные виды с этими параметрами, потом из видов берем данные, а после завершения транзакции или сессии виды автоматически удаляются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:21 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
То есть, примерно то же самое, что я делаю сейчас при помощи CREATE TEMP TABLE TMP_TABLE ...; SELECT ... FROM TMP_TABLE ...; DROP TABLE TMP_TABLE; А какая принципиальная разница между временными таблицами и видами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:29 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Ага. Только вот это не нужно: DROP TABLE TMP_TABLE; Практически важная разница между временными таблицами и видами указана в статье по ссылочке выше: "В большинстве случаев следует использовать временные виды, если сомневаетесь, создавайте именно их. Временные таблицы полезны тогда, когда небольшая, но ресурсоемкая выборка используется многократно." Ну а принципиально разница такая же, как между обычными таблицами и видами. Если что не понятно, спрашивайте, дополню статью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:42 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34646050&tid=2005296]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 385ms |

| 0 / 0 |
