Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Извините, случайно запостил недописанное сообщение. Повторяюсь. Переносим БД из MSSQL. С PostgreSQL недавно начал работать, причём наскоком, толком и изучать некогда было. До сих пор достаточно успешно боролся с возникающими препятствиями, но сейчас поставлен в тупик. Есть две таблицы (упрощу для наглядности, но ключи и связи такие же): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Сейчас в этих таблицах щедящие тестовые данные - в родительской 300, в дочерней 12000000. Записи дочерней почти равномерно распределены между родительскими. В MSSQL никогда с этим кодом проблем не было при любом обёме данных - для каждой родительской строки по два перехода по индексу к крайним значениям второго поля справа и слева. Времени практически не занимает-миллисекуды. В PostgreSQL идёт долгое и нудное сканирование индекса на основе ограничения уникальности - 2 раза. Времени - две минуты на свежайших статистиках. А чуть погодя - до двадцати минут. Ни в какие ворота не лезет. Я уже и так и эдак.. Различные комбинации индексов, различные варианты запросов пробывал. Кто-нибудь значет, что тут можно подкрутить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 13:10 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Для postgres<8.2, Код: plaintext 1. 2. 3. 4. 5. 6. 7. Если не ошибаюсь, postgres 8.2 сам по себе будет производить такую трансформацию (min -> order by+limit). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 13:24 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Конечно же я так пробывал - ещё дольше работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 14:46 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
to Vladimir Sitnikov >> MSSQL тоже преобразует min() и max() в top 1 с одной и с другой стороны. Но делает это элегантно - сразу берёт по одной записи индекса. Postgres же, при использовании min() и max() просто сканирует индекс, а при использовании order by .. limit 1/ order by .. desc limit 1 выдаёт совсем уж грустный план - сперва выбирает всё, потом сортирует, потом берёт верхнюю строку.. :-( Может индекс какой хитрый построить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 15:07 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Да, забыл сказать, у меня "Линтер-ВС" - СУБД на основе PostgreSQL 7.4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 15:09 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Сергей АБДа, забыл сказать, у меня "Линтер-ВС" - СУБД на основе PostgreSQL 7.4. Тогда вопросы к Линтеру - что они внутри накосячили такого, что индексы не работают. П.С. Кстати, не все линтеры сделаны на базе Постгреса. Об этом даже на данном форуме писали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 15:10 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
а может подумать о версии 8.1? все таки отличия есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 15:13 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Сергей АБto Vladimir Sitnikov >> MSSQL тоже преобразует min() и max() в top 1 с одной и с другой стороны. Но делает это элегантно - сразу берёт по одной записи индекса. Postgres же, при использовании min() и max() просто сканирует индекс, а при использовании order by .. limit 1/ order by .. desc limit 1 выдаёт совсем уж грустный план - сперва выбирает всё, потом сортирует, потом берёт верхнюю строку.. :-( Может индекс какой хитрый построить? постройте для проверки _явные_ индексы по (id_t1, col1) и (id_t1, (-col1)) (7.3 может потребовать оборачивания (-col1) в ф-ю) и соответственно вместо order by .. desc limit 1 пишите order by (-col1) limit 1 (или ф-ю, если обернули). и приведите таки планы запросов, а то ить не ясно, какие именно индексы использует постгрес (а то вже ж "обычный" индекс у него не используется для Like-оф 'xxxxx%', могабыть и индекс уникьев не годен для выборок, кто их знаить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 16:13 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
to 4321ё >> Явные индексы тоже создавал, и составные, и по-отдельности - не помогает. Только вот с минусом не пробывал - щас проверил, так PostgreSQL использует для обоих сортировок, и в одну, и в другую сторону, индекс, который с минусом :-) Ничего не понимаю.. В планах индекс по ограничению уникальности используется, как и явные индексы, когда они есть, но присходит для каждой строки родительской таблицы сканирование всех записей по условию связывания. То есть в конечном итоге сканируется все 12000000 записей, по два раза, и то не за один проход. Вот план для варианта только с ограничениями уникальности, и при использовании min/max (в плане тоже подправил имена объектов, чтобы похоже было на пример): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 17:33 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Кувалдин Роман Тогда вопросы к Линтеру - что они внутри накосячили такого, что индексы не работают. П.С. Кстати, не все линтеры сделаны на базе Постгреса. Об этом даже на данном форуме писали. Самому интересно, почему так туго с индексами. А другой Линтер тоже пользовали, тот вообще - обнять и плакать.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 17:43 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
думаицца это проблема высокоинтелектуальности оптимизатора. попробуйте набмануть оптимизатор примерно такими модификациями Vladimir Sitnikov [fix]select t1.col1, t1.col2, t1.col3, t1.col4, (select t2.col1 from t2 where t2.id_t1 > t1.id_t1-1 order by t2.id_t1, t2.col1 limit 1) as t2_col1_begin, (select t2.col1 from t2 where t2.id_t1 < t1.id_t1 +1 order by t2.id_t1 DESC, t2.col1 DESC limit 1) as t2_col1_end from t1 [/fix] (надеюс, дробных значений в целом поле не бываит. хотя от >< и DESC можно уйти, в т.ч. используя индек с "-") только не все применяйте сразу. пробуйте частями. (сначала только в ордер бай) ЗЫ. и для 7.4. незачем приводить план запроса с max (и тестировать макс) Ибо про 7.4. заведомо известно, что max он не раскрывает в LIMIT (сам), а использует "агрегирование". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 17:57 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. поправляю форматирование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:01 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Честно говоря, про 7.x сказать ничего не могу. 8-ка (8.1, вроде) явно выдаёт backward index scan на предложенной схеме, и, думаю, это один запрос к индексу (+проверка существования записи). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.10.2006, 18:25 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Сергей АБА другой Линтер тоже пользовали, тот вообще - обнять и плакать.. Можно поинтересоваться, что заставило Вас плакать при работать с ЛИНТЕР? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 13:43 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
pavelvp Сергей АБА другой Линтер тоже пользовали, тот вообще - обнять и плакать.. Можно поинтересоваться, что заставило Вас плакать при работать с ЛИНТЕР? Стопудово вопросы, сязанные с сертификацией по безопасности. ЛИНТЕР это единственная СУБД, имеющая 2 класс защищенности. Кстати, если это так, то к постгресу ваша СУБД никакого отношения не имеет. Это совсем другой продукт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:08 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманКстати, если это так, то к постгресу ваша СУБД никакого отношения не имеет. Это совсем другой продукт. Слова разработчика Кстати, по поводу ЛИНТЕР-а рекомендую обратиться прямо к pavelvp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:23 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
По всему видно, что коллеги, высказывающие опасения по поводу причастности "моего Линтера" к PostgreSQL, в глаза не видели "не-Postgre-Линтер". Сразу оговорюсь - речь идёт о "Линтер-ВС" 6.0. Напутать что либо здесь невозможно - есть два Линтера-ВС, и они абсолютно разные - не перепутаешь, хотя даже цифры одинаковые! Так вот "мой Линтер" запускается командой service postgresql start :-) Первая, если можно так сказать, версия СУБД Линтер-ВС (Вооружённые Силы) была разработана в годах 2003-2004 ЗАО НПП "РЕЛЭКС", на базе Линтер 5.7, в Министерство Обороны поставлялась от имени ВНИИНС (НПО, институт, фирма?? -не помню). Затем году в 2004-2005 произошла подмена этой СУБД на совершенно другую, разработаную в самой ВНИИНС на базе PostgreSQL 7.4. pavelvp - разработчик того, первого Линтера-ВС. Здравствуйте, pavelvp. Тот топик, на который нас отправляет Кувалдин Роман - Кувалдин Роман Слова разработчика Кстати, по поводу ЛИНТЕР-а рекомендую обратиться прямо к pavelvp инициирован мною же, в далёком 2004. Тогда отмазаться от перехода с MSSQL на Линтер удалось, сейчас же пришло время вернуть долги, но переходом уже на новый Линтер-ВС. pavelvp, плакать нам тогда пришлось от осознания, какой же объём работы предстояло бы выполнить при миграции с SQL Server 2000, и ещё не известно, получилось ли бы. У Вас замечательный продукт, но очень специфичен. Я уже не помню всех тонкостей, но помню неподдельную радость в глазах и чуство, что теперь-то горы свернём, когда нам принесли "новую версию" Линтера-ВС, по сути - Постгрес. С ним тоже немало заморочек, но всё решаемо. P.S. С проблемой, давшей начало данному разговору, я решил не заморачиваться. При выборе от одной (что чаще всего), до пары десятков строк из родительской таблицы, время доступа приемлемое. А когда нужно всё прочитать (что тоже не редкость) - придётся ждать, что ж делать - пока ничего не помогло, а дальше время тратить - непозволительная роскошь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 23:49 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Ж-) Я - дятел. И не посмотрел, кто топик начинал :-( ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 01:53 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Сергей АБЗдравствуйте, pavelvp. Приветствую!У Вас замечательный продукт, Спасибо :-) но очень специфичен. Я уже не помню всех тонкостей... Вот это как раз самое интересное. Очень жаль что Вы уже не помните тонкостей... Мне не понятно что в ЛИНТЕР такого специфичного. ИМХО PostgreSQL намного более специфичен. По крайней мере начать работать с ЛИНТЕР можно гораздо быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 15:22 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
Извините за вопрос. Я в постгресе абсолютный новичек. В оракле соображаю. Имеется ли в постгресе возможность секционирования таблиц (или что-то подобное разбиению на разделы как в оракле). Начальник достал вобще, а копаться и искать времени нет. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 11:30 |
|
||
|
Как ускорить запрос?
|
|||
|---|---|---|---|
|
#18+
VAKisИзвините за вопрос. Я в постгресе абсолютный новичек. В оракле соображаю. Имеется ли в постгресе возможность секционирования таблиц (или что-то подобное разбиению на разделы как в оракле). Начальник достал вобще, а копаться и искать времени нет. Заранее спасибо. использовать поиск по форуму? посмотреть документацию (5.9. Partitioning)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2006, 13:40 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2006015]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
56ms |
get topic data: |
7ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 346ms |

| 0 / 0 |
