Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Попробую вникнуть самостоятельно. Большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 15:58 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Решил сделать так 1. Создать хранимые процедуры на более общие моменты, типа "ID и код филиала счетов клиентов по валюте, существовавшие в период с ... по, в счетах I порядка [ или II порядка]" CREATE OR REPLACE FUNCTION data.new_tmpview_acc_charcod(idfund bigint, date_b bpchar, date_e bpchar, accsin1 bpchar, accsin2 bpchar, name_new_tmpview bpchar) RETURNS character AS $BODY$select 'CREATE OR REPLACE TEMP VIEW '||$6||' AS SELECT accanl.id AS idaccanl, locbranch.charcod FROM accanl LEFT JOIN locbranch ON accanl.idlocbranch = locbranch.id WHERE accanl.accanl_fund = '||$1||' AND (accanl.dateclose >= '''||$2||'''::date OR accanl.dateclose IS NULL) AND accanl.dateopen <= '''||$3||'''::date AND ((accanl.accsin1 = ANY (''{'||$4||'}''::bpchar[]))'||CASE WHEN char_length($5)=0 THEN '' ELSE ' OR (accanl.accsin2 = ANY (''{'||$5||'}''::bpchar[]))' END||'); ALTER TABLE '||$6||' OWNER TO postgres;'$BODY$ LANGUAGE 'sql' VOLATILE; большинство ограничений в запросах описываются этой формулой 2. Затем в коде VB(VBA) получаю по нужным мне параметрам строку с запросом на создание нужной мне вьюхи: 'создаются временные VIEW rs.Open "select data.new_tmpview_acc_charcod(56537, " & date_beg & ", " & date_end & ", '401,402,403,404,405,406,407', '40802,40804,40805,40806,40807', 'acc_id_char') as strsql;", cn strsql = rs!strsql rs.Close rs.Open "select data.new_tmp_view_fvalue_id_and_cond(749630,'and fvaluedia.fvalue not in (''Накопительный'',''Счет КБК'')','tmp_fvalue') as strsql;" strsql = strsql & rs!strsql rs.Close rs.Open strsql, cn ' теперь они есть, используем strsql = "select acc_id_char.charcod,sum(abs(turndebnc)) as td,sum(abs(turncrenc)) as tc from restanl join " _ & "acc_id_char on (restanl.idaccanl=acc_id_char.idaccanl) left join tmp_fvalue on (tmp_fvalue.idrow=acc_id_char.idaccanl) " _ & " where (restanl_date >=" & date_beg_hyb & " and restanl_date <=" & date_end & ") group by acc_id_char.idaccanl,acc_id_char.charcod" rs.Open strsql, cn, adOpenForwardOnly, adLockReadOnly Надо будет конечно много чего переделать, но зато на будущее большинство вопросов снимется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2007, 20:04 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Еще одна неприятность - раньше простой и быстрый запрос: select restanl_date from restanl where restanl_date<='2007-07-01' order by restanl_date desc limit 1 теперь выполняется жутко долго, пробовал ограничить снизу месяцем: select restanl_date from restanl where restanl_date>'2007-06-01' and restanl_date<='2007-07-01' order by restanl_date desc limit 1 но и тут как-то не блестяще: Limit (cost=66764.25..66764.25 rows=1 width=4) -> Sort (cost=66764.25..67886.39 rows=448857 width=4) Sort Key: public.restanl.restanl_date -> Result (cost=2.28..13665.79 rows=448857 width=4) -> Append (cost=2.28..13665.79 rows=448857 width=4) -> Bitmap Heap Scan on restanl (cost=2.28..6.68 rows=3 width=4) Recheck Cond: ((restanl_date > '2007-06-01'::date) AND (restanl_date <= '2007-07-01'::date)) -> Bitmap Index Scan on rstanl_idx2 (cost=0.00..2.28 rows=3 width=0) Index Cond: ((restanl_date > '2007-06-01'::date) AND (restanl_date <= '2007-07-01'::date)) -> Seq Scan on rstanl_y2007m06 restanl (cost=0.00..13188.21 rows=448477 width=4) Filter: ((restanl_date > '2007-06-01'::date) AND (restanl_date <= '2007-07-01'::date)) -> Bitmap Heap Scan on rstanl_y2007m07 restanl (cost=8.12..470.90 rows=377 width=4) Recheck Cond: ((restanl_date > '2007-06-01'::date) AND (restanl_date <= '2007-07-01'::date)) -> Bitmap Index Scan on rstanl_y2007m07_idx1 (cost=0.00..8.02 rows=377 width=0) Index Cond: ((restanl_date > '2007-06-01'::date) AND (restanl_date <= '2007-07-01'::date)) Проверять на точную дату не могу, остатки есть не за каждый день. Решение в общем-то есть - собрать в табличку существующие дни и искать в них, но может есть решение посимпатичнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 09:49 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
ignitorСтоит ли продолжать и смотреть в сторону кластеризации индексов? http://postgrestips.blogspot.com/2007/06/cluster.html... применяется операция кластеризации (cluster) таблиц по указанному индексу, которая упорядочивает индексы ... http://www.postgresql.org/docs/8.2/static/sql-cluster.htmlcluster a table according to an indexКластеризуется таблица, а не индекс. ignitorвыполняется по старой таблице --Total query runtime: 43985 ms. --2224 rows retrieved. по новой, распределенной таблице --Total query runtime: 231156 ms. --2224 rows retrieved. причем повторный запрос по обеим таблицам дает одно и то же время (видимо работает кэш) --Total query runtime: 4828 ms. --2224 rows retrieved. ignitorEXPLAIN ANALYZE по запросу со старой таблицей -> 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)) тоже с новой -> 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[])) -> 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))В этом сравнительном тесте вы допустили ошибку. Видимо "кэш сработал" не только при повторных запросах к обоим таблицам, но и например при запросе к новой таблице. Обратите внимание, что одинаковые части запроса выполняются на несколько порядков разное время: "Bitmap Heap Scan on accanl" 6831.005 против 64.353, и "Index Scan using idx_dia_1 on fvaluedia" 1.498 против 0.030. Для корректного тестирования надо смотреть время выполнения второго подряд запроса (данные уже загружены в кэш), либо "шаманством" очищать кэш. ignitorЧудеса - сделал две вьюхи результаты поразительные --Total query runtime: 38797 ms. --260805 rows retrieved. --Total query runtime: 2812 ms. --260805 rows retrieved. Вообщето по explain видно что до вьюх набор из 7 месяцев поднимался с диска 2224 раза, а в последнем варианте только 1 раз.Ничего не видно. :-) Что вы сравниваете? А: запрос с "group by", возвращающий 2224 строки, при котором "набор из 7 месяцев поднимался с диска 2224 раза" с Б: запросом с view, который без "group by", и возвращает 260805 строк? Нет уж, давайте сравнивать планы выполнения запросов, возвращающих одинаковые результаты. Для этого приведите пожалуйста план выполнения аналогичного запроса без view, к которому относится ваш комментарий "Total query runtime: 38797 ms. 260805 rows retrieved". MBGПри использовании группировок планировщик запроса часто себя ведет, скажем так, неадекватно. http://www.redivi.com/~bob/oscon2005_pgsql_pdf/OSCON_Explaining_Explain_Public.pdfYou are not smarter than the planner (where you != Tom):-) MBGПотому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро.Объясните пожалуйста подробнее этот "итерационный подход", если можно с примером. ignitorЕще одна неприятность - раньше простой и быстрый запрос: select restanl_date from restanl where restanl_date<='2007-07-01' order by restanl_date desc limit 1 теперь выполняется жутко долгоИнтересная проблема. Пока не могу придумать, как ее решить. :-( Разработчики оптимизировали запросы "order by limit", но не для партиционных таблиц с учетом условий check. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 12:32 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat http://postgrestips.blogspot.com/2007/06/cluster.html... применяется операция кластеризации (cluster) таблиц по указанному индексу, которая упорядочивает индексы ... http://www.postgresql.org/docs/8.2/static/sql-cluster.htmlcluster a table according to an indexКластеризуется таблица, а не индекс. Где-то в доках видел, что и файл индекса упорядочивается. LeXa NalBat MBGПотому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро.Объясните пожалуйста подробнее этот "итерационный подход", если можно с примером. Примеры были по ссылке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 12:50 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBG LeXa NalBatКластеризуется таблица, а не индекс.Где-то в доках видел, что и файл индекса упорядочивается.сомневаюсь MBG LeXa NalBat MBGПотому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро.Объясните пожалуйста подробнее этот "итерационный подход", если можно с примером.Примеры были по ссылке.Нету ссылки в вашем посте . :-O ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 13:04 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Очень грустно explain analyse select restanl_date as MaxRest from restanl where restanl_date>'2007-06-09' order by restanl_date desc limit 1 "Limit (cost=108264.63..108264.63 rows=1 width=4) (actual time=1826.053..1826.054 rows=1 loops=1)" " -> Sort (cost=108264.63..109945.94 rows=672525 width=4) (actual time=1826.043..1826.043 rows=1 loops=1)" " Sort Key: public.restanl.restanl_date" " -> Result (cost=76.13..26746.81 rows=672525 width=4) (actual time=0.362..1126.831 rows=412764 loops=1)" " -> Append (cost=76.13..26746.81 rows=672525 width=4) (actual time=0.360..802.623 rows=412764 loops=1)" " -> Bitmap Heap Scan on restanl (cost=76.13..369.56 rows=4114 width=4) (actual time=0.154..0.154 rows=0 loops=1)" " Recheck Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Index Scan on rstanl_idx2 (cost=0.00..75.11 rows=4114 width=0) (actual time=0.147..0.147 rows=0 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" " -> Index Scan using rstanl_y2007m06_idx1 on rstanl_y2007m06 restanl (cost=0.00..22610.03 rows=611870 width=4) (actual time=0.204..381.522 rows=318490 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Heap Scan on rstanl_y2007m07 restanl (cost=798.45..3767.22 rows=56541 width=4) (actual time=59.320..129.933 rows=94274 loops=1)" " Recheck Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Index Scan on rstanl_y2007m07_idx1 (cost=0.00..784.32 rows=56541 width=0) (actual time=39.765..39.765 rows=169637 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" "Total runtime: 1827.946 ms" Грустно explain analyse select Max(restanl_date) as MaxRest from restanl where restanl_date>'2007-06-09' "Aggregate (cost=28428.12..28428.13 rows=1 width=4) (actual time=905.358..905.359 rows=1 loops=1)" " -> Append (cost=76.13..26746.81 rows=672525 width=4) (actual time=0.222..731.128 rows=412764 loops=1)" " -> Bitmap Heap Scan on restanl (cost=76.13..369.56 rows=4114 width=4) (actual time=0.106..0.106 rows=0 loops=1)" " Recheck Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Index Scan on rstanl_idx2 (cost=0.00..75.11 rows=4114 width=0) (actual time=0.101..0.101 rows=0 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" " -> Index Scan using rstanl_y2007m06_idx1 on rstanl_y2007m06 restanl (cost=0.00..22610.03 rows=611870 width=4) (actual time=0.114..318.987 rows=318490 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Heap Scan on rstanl_y2007m07 restanl (cost=798.45..3767.22 rows=56541 width=4) (actual time=56.449..125.029 rows=94274 loops=1)" " Recheck Cond: (restanl_date > '2007-06-09'::date)" " -> Bitmap Index Scan on rstanl_y2007m07_idx1 (cost=0.00..784.32 rows=56541 width=0) (actual time=38.239..38.239 rows=169637 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" "Total runtime: 905.580 ms" Ностальгия explain analyse select restanl_date as MaxRest from restanl_old where restanl_date>'2007-06-09' order by restanl_date desc limit 1 "Limit (cost=0.00..0.98 rows=1 width=4) (actual time=146.714..146.715 rows=1 loops=1)" " -> Index Scan Backward using idx13 on restanl_old (cost=0.00..367432.40 rows=374515 width=4) (actual time=146.710..146.710 rows=1 loops=1)" " Index Cond: (restanl_date > '2007-06-09'::date)" "Total runtime: 146.774 ms" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 13:41 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat MBG LeXa NalBatКластеризуется таблица, а не индекс.Где-то в доках видел, что и файл индекса упорядочивается.сомневаюсь Возможно, что там немного замудренный английский и в глаза это не бросается. Но это легко проверить: 1. CREATE INDEX out_object_id_idx ON out USING btree (object_id); # md5sum 283800 02935d31392e749e166538a4639c9593 283800 2. cluster out_object_id_idx on out; # md5sum 283800 md5sum: 283800: No such file or directory # md5sum 283806 815f44f75474ebee39b8f4ff7308a693 283806 3. drop index out_object_id_idx; # md5sum 283806 md5sum: 283806: No such file or directory Как говорится, без комментариев :-) LeXa NalBat MBG LeXa NalBat MBGПотому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро.Объясните пожалуйста подробнее этот "итерационный подход", если можно с примером.Примеры были по ссылке.Нету ссылки в вашем посте . :-O http://postgrestips.blogspot.com/2007/07/temp.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 13:56 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
"During the cluster operation, a temporary copy of the table is created that contains the table data in the index order. Temporary copies of each index on the table are created as well. Therefore, you need free space on disk at least equal to the sum of the table size and the index sizes. " Думаю, вопрос с перестройкой индекса закрыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 14:00 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBGВозможно, что там немного замудренный английский и в глаза это не бросается. "During the cluster operation, a temporary copy of the table is created that contains the table data in the index order. Temporary copies of each index on the table are created as well. Therefore, you need free space on disk at least equal to the sum of the table size and the index sizes."О, великий и "замудренный" английский язык. :-) Можете перевести цитату, которую вы привели... Индексы перестраиваются, но не кластеризуются (как написал ignitor) и не упорядочиваются (как написали вы в своей статье). PS: не закрывайте вопросы раньше времени :-) MBG LeXa NalBat MBGПотому лучше итерационный подход - планировщик по отдельности оптимизирует выполнение каждого запроса и дело в шляпе. И запросы простые и работают быстро.Объясните пожалуйста подробнее этот "итерационный подход", если можно с примером.Примеры были по ссылке. http://postgrestips.blogspot.com/2007/07/temp.html Вы имеете в виду "пример использования временных объектов для построения отчета (выдернул из функции на pltcl)"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 15:23 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat MBGВозможно, что там немного замудренный английский и в глаза это не бросается. "During the cluster operation, a temporary copy of the table is created that contains the table data in the index order. Temporary copies of each index on the table are created as well. Therefore, you need free space on disk at least equal to the sum of the table size and the index sizes."О, великий и "замудренный" английский язык. :-) Можете перевести цитату, которую вы привели... Индексы перестраиваются, но не кластеризуются (как написал ignitor) и не упорядочиваются (как написали вы в своей статье). PS: не закрывайте вопросы раньше времени :-) Если индексы строятся упорядоченно и по кластеризованным данным, вы считаете, что они не кластеризованы? В цитате перечислены необходимые и достаточные условия кластеризованности индекса в строгом смысле (т.е. и сами данные тоже кластеризованы). LeXa NalBatВы имеете в виду "пример использования временных объектов для построения отчета (выдернул из функции на pltcl)"? Ага. Вместе с комментариями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 16:39 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Подразумеваю, что индексы кластеризованы по значениям данных, поскольку если функциональный индекс задается немонотонной функцией более ничего сказать нельзя. Ну а в простейшем случае и так все очевидно... Но нам и выборка требуется набора данных, а не набора индексов, так что абсолютно бесполезно было бы кластеризовать индекс по его собственным значениям - это привело бы к неоправданным затратам при построении итоговой выборки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 16:46 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBGПодразумеваю, что индексы кластеризованы по значениям данных, поскольку если функциональный индекс задается немонотонной функцией более ничего сказать нельзя. Ну а в простейшем случае и так все очевидно... Но нам и выборка требуется набора данных, а не набора индексов, так что абсолютно бесполезно было бы кластеризовать индекс по его собственным значениям - это привело бы к неоправданным затратам при построении итоговой выборки. Бррр. Я бы не стал относить термин "кластер" к хранению индекса. ИМХО это неверно по сути своей. Таблица может быть упорядачена по индексу, в таком случае индекс называется кластерным, а таблица кластеризированной. Но хранится он все равно в виде бинарного дерева со ссылками на страницы, в которых возможно есть данные. Скорее всего при перестроении произойдет перебалансиорвка дерева и индекс станет более аптимальным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 17:06 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Для начала переведу для вас. "Temporary copies of each index on the table are created as well." "Также создаются временные копии всех индексов таблицы." Перечитаем еще раз вместе "СОЗДАЮТСЯ КОПИИ ИНДЕКСОВ". И все, более ничего не написано касательно индексов. MBGЕсли индексы строятся упорядоченно и по кластеризованным данным, вы считаете, что они не кластеризованы?Не могу ответить на ваш вопрос, потому что не знаю, что такое "кластеризованный индекс". В постгресе обычно индексы это B-деревья. Я не вижу разницы, строить их "упорядоченно", или нет, все равно получится B-дерево. Как его можно кластеризовать? Не понимаю. MBGВ цитате перечислены необходимые и достаточные условия кластеризованности индекса в строгом смысле (т.е. и сами данные тоже кластеризованы).В цитате "в строгом смысле" лишь написано "СОЗДАЮТСЯ КОПИИ ИНДЕКСОВ". Какие-либо необходимые и достаточные условия неопределенного понятия "кластеризованность индекса" в ней отсутствуют. MBGПодразумеваю, что индексы кластеризованы по значениям данных... <В этом> случае и так все очевидно... Но нам и выборка требуется набора данных, а не набора индексов, так что абсолютно бесполезно было бы кластеризовать индекс по его собственным значениям - это привело бы к неоправданным затратам при построении итоговой выборки.Что такое "блабуда"? Это слово я только что придумал из "bla-bla-bla" и "лабуда". А вот что такое "индексы кластеризованы", "кластеризовать индекс"? Это вы придумали, вы и объясните пожалуйста. MBG"пример использования временных объектов для построения отчета (выдернул из функции на pltcl)" Вместе с комментариями.Я стараюсь искать решение на SQL, и чаще всего оно находится. Но, должен признать, иногда приходится использовать plpgsql или другие процедурные языки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 17:16 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
Andrey DaeronЯ бы не стал относить термин "кластер" к хранению индекса. ИМХО это неверно по сути своей. Таблица может быть упорядачена по индексу, в таком случае индекс называется кластерным, а таблица кластеризированной. Но хранится он все равно в виде бинарного дерева со ссылками на страницы, в которых возможно есть данные. Скорее всего при перестроении произойдет перебалансиорвка дерева и индекс станет более аптимальным. Дерево это логическая структура и на диске может храниться по-разному. Насчет терминологии замечу, что термин кластеризация может использоваться в смысле группировки по значению элемента данных, по значению индекса или группировки при записи на диск и для немонотонной функции индекса эти смыслы не совпадают для таблицы (последовательные значения элементов набора данных могут соответствовать "далеким" значениям индекса и наоборот). В том смысле, что "кластеризованная" таблица и "кластеризованная по индексу" не равноценные термины. Тем не менее, термин "кластеризованная" все же используется. А насчет индекса - может и на самом деле лучше звать его кластерным, так хотя бы видно, что' есть причина (порядок значений индекса), а что' - следствие (физическое хранение данных таблицы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 17:32 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat MBG"пример использования временных объектов для построения отчета (выдернул из функции на pltcl)" Вместе с комментариями.Я стараюсь искать решение на SQL, и чаще всего оно находится. Но, должен признать, иногда приходится использовать plpgsql или другие процедурные языки. И пользовательский интерфейс на sql пишите? Круто :-) В моем варианте БД пользовательские сессии хранятся в базе, так что функция на pltcl читает из сессии параметры и создает соответствующие виды и таблицы, которые нужны для вывода отчета. В итоге вся логика обработки данных хранится в базе, написать набор тестов для любого отчета пара пустяков (для требуемых наборов значений повторять: записать в сессию пользователя тестовые значения, вызвать функцию построения отчета, вычислить некий хэш для проверки правильности работы). Притом набор тестов также можно зашить в pltcl функцию и вызывать при необходимости. Так что прикладному программисту вряд ли удастся нарушить правильность работы системы, максимум, что удастся, это что функция создания отчета вернет ошибку (это если совсем уж ерунду в сессию записать). Приведенные примеры можно и из консоли напрямую вызвать, вовсе не обязательно из функции. Привел "как есть", чтобы было видно, куда какие условия подставляются. Но при желании можно заместо переменных забить тестовые значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 17:47 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBGНасчет терминологии замечу, что термин кластеризация может использоваться в смысле группировки по значению элемента данных, по значению индекса или группировки при записи на диск и для немонотонной функции индекса эти смыслы не совпадают для таблицы (последовательные значения элементов набора данных могут соответствовать "далеким" значениям индекса и наоборот).Давайте в разделе PostgreSQL этого форума придерживаться терминологии, принятой в постгресе... MBG"кластеризованная" таблица и "кластеризованная по индексу" не равноценные терминыВ постгресе это одно и то же, потому что нельзя кластеризовать таблицу иначе чем по индексу. ( PS: Можно кластеризовать таблицу, а потом удалить индекс. :-) Таблица останется кластеризованной. По функционалу, который соответствует индексу. ) MBGтак хотя бы видно, что есть причина (порядок значений индекса), а что - следствие (физическое хранение данных таблицы).Наконец-то. Позвольте стоя отдать должные аплодисменты вашему верному утверждению. MBGИ пользовательский интерфейс на sql пишите? Круто :-)Скорее наоборот. У нас много (возможно слишком много) логики находится в приложении. Но как-то (другой) программист написал функцию на plpgsql, с течением времени ее логику приходилось усложнять, потом еще. Потом поняли, что делать очередное усложнение средствами plpgsql слишком сложно, и перенесли ее в приложение переписав на perl, после чего нервы она больше не трепала. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 18:03 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat MBGИ пользовательский интерфейс на sql пишите? Круто :-)Скорее наоборот. У нас много (возможно слишком много) логики находится в приложении. Но как-то (другой) программист написал функцию на plpgsql, с течением времени ее логику приходилось усложнять, потом еще. Потом поняли, что делать очередное усложнение средствами plpgsql слишком сложно, и перенесли ее в приложение переписав на perl, после чего нервы она больше не трепала. :-) Когда-то сам писал на plpgsql, потом логика стала сложной и перешел на pltcl. А приложение переписали с perl на tcl и настало всеобщее счастье :-) Так, ради смеха - код на тикле код в три раза меньше перлового по объему сразу после переноса получился. Потом еще немного сократили. Держать логику в базе хорошо, поскольку и целостность данных в порядке, и быстродействие высокое, и код простой. А вот создание интерфейса, обработку действий пользователя, форматирование таблиц и построение графиков действительно удобно делать в приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 18:12 |
|
||
|
Вдруг стал медленно выполняться запрос:
|
|||
|---|---|---|---|
|
#18+
MBG Дерево это логическая структура и на диске может храниться по-разному. Факт. MBG Насчет терминологии замечу, что термин кластеризация может использоваться в смысле группировки по значению элемента данных, по значению индекса или группировки при записи на диск и для немонотонной функции индекса эти смыслы не совпадают для таблицы (последовательные значения элементов набора данных могут соответствовать "далеким" значениям индекса и наоборот). Если уж формализироваться, то Wiki . А у ПГ вообще маленький частный подслучай. Он даже не могет сам поддерживать степень клатеризированности таблицы. Наверно итог по теме кластеризации. После нее - таблице явно хорошеет индексу по которому прошла кластеризация таблицы - тоже. Все остальные индексы нервно курят в сторонке, с возможным ухудшением ситуации. Процесс кластеризации ИМХО происходит примерно так: 1. Делается копия таблицы - времянка. 2. Туда заливается ORDER BY [index] данные. 3. На времянку создаются индексы. 4. На времянку создаются (или может просто перекидываются) все стальные DDL объекты (вьюги, триггера, форейны, рули и т.д.) 5. Старая табла дропается каскадом/просто дроп. 6. Новая табла переименовывается 7. Коммит. И этого алгоритма все все достоинства и недостатки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2007, 21:18 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34647844&tid=2005296]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 214ms |
| total: | 370ms |

| 0 / 0 |
