Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Две таблицы. В первой - сотни миллионов записей. Во второй - миллионы. В обоих имеется поле типа text с уникальным индексом по нему. Задача: нужно из третьей таблицы (тоже имеет поле типа text с уникальным индексом) выбрать записи, где значение этого поля не встречается ни в первой, ни во второй таблицах. Я делаю: SELECT field1 FROM table3 WHERE not EXISTS (SELECT 1 FROM table1 WHERE field1 = table3.field1) AND NOT EXISTS (SELECT 1 FROM table2 WHERE field1 = table3.field1) Выполняется ну очень долго, когда в 3-й таблице десятки тысяч записей. Прекрасно понимаю, что запрос очень тяжелый, но, возможно, есть возможность его изменить/оптимизировать... Подскажите, как. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 02:05 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
может OUTER JOIN потом проверка на NULL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 02:31 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
SELECT field1 FROM table3 t3 left join table1 t1 using(field1) left join table2 t2 using(field1) where not t1.field1 is null and not t2.field1 is null; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 02:37 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
ещё вот так можно: http://www.postgresql.org/docs/current/static/queries-union.html Код: plaintext 1. 2. 3. 4. 5. 6. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 02:58 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Думаю DIASER имел в виду Код: plaintext 1. 2. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 12:02 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
нет там NULL вообще. абсолютно точно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 12:21 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
tier.ruнет там NULL вообще. абсолютно точно. Когда LEFT JOIN сделаете -- появятся. И как раз в тех случаях, когда я для table3 нет записи в table1 и/или table2. http://www.postgresql.org/docs/current/static/queries-table-expressions.html#QUERIES-FROM PostgreSQL Documentation LEFT OUTER JOIN First, an inner join is performed. Then, for each row in T1 that does not satisfy the join condition with any row in T2, a joined row is added with null values in columns of T2. Thus, the joined table unconditionally has at least one row for each row in T1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 14:34 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
А еще, пожалуста,покжите планы (explain analyze select ...) , и вашего запроса, и тех что посоветовали! Интересно посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2008, 15:40 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Ни один из советов, к сожалению, не помог ускорить запрос. Все тесты запускал для table3 с 20K записей. Мой вариант выполняется строго ~10 мин. План (уже для table3 со 100 записями): QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------- Seq Scan on table3 (cost=0.00..9572.40 rows=25 width=83) (actual time=151.129..3649.923 rows=89 loops=1) Filter: ((NOT (subplan)) AND (NOT (subplan))) SubPlan -> Index Scan using table1_field1_key on table1 (cost=0.00..87.28 rows=1 width=0) (actual time=25.057..25.057 rows=0 loops=100) Index Cond: (field1 = $0) -> Index Scan using table2_field1_key on table2 (cost=0.00..8.42 rows=1 width=0) (actual time=11.428..11.428 rows=0 loops=100) Index Cond: (field1 = $0) Total runtime: 3650.167 ms (8 rows) Теперь посоветованные. Итак: select field1 from table3 except ( select field1 from table2 union select field1 from table1 ) это - очевидная чушь. памяти надо занять многие гигабайты, чтобы выполнить подзапрос. все-таки запускал для эксперимента. окончания не дождался за час. плана не будет. перестартанул pg для чистоты эксперимента. Следующий: SELECT field1 FROM table3 t3 left join table1 t1 using(field1) left join table2 t2 using(field1) where t1.field1 is null and t2.field1 is null; Не дождался окончания за 30 мин. обрубил. Но, для меньшего размера (100 записей) table3 работает . привожу план: QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------ Nested Loop Left Join (cost=0.00..5202.47 rows=25 width=83) (actual time=1069.094..13140.841 rows=89 loops=1) Filter: (t1.field1 IS NULL) -> Nested Loop Left Join (cost=0.00..837.76 rows=50 width=83) (actual time=263.194..3885.419 rows=100 loops=1) Filter: (t2.field1 IS NULL) -> Seq Scan on table3 t3 (cost=0.00..3.00 rows=100 width=83) (actual time=0.034..0.215 rows=100 loops=1) -> Index Scan using table2_field1_key on table2 t2 (cost=0.00..8.34 rows=1 width=74) (actual time=38.847..38.847 rows=0 loops=100) Index Cond: (t3.field1 = t2.field1) -> Index Scan using table1_field1_key on table1 t1 (cost=0.00..87.28 rows=1 width=66) (actual time=92.548..92.548 rows=0 loops=100) Index Cond: (t3.field1 = t1.field1) Total runtime: 13141.092 ms (10 rows) Ну что, господа, есть еще идеи, что можно тут сделать? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2008, 21:30 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Тут оптимизация запросов врядли поможет. Хотелось бы увидеть планы выполения, только без analyze. Analyze -- дело случая, от нагрузки на сервер и прочего зависит. Просто explain покажет самый быстрый запрос. По тем планами, что вы показали, ваш запрос действительно быстрее. Ускорить его врядли получится. Надо менять саму базу. Какие индескы у вас используются? b-tree? Попробуйте создать hash-индесы для table1.field1 и table2.field1. http://www.postgresql.org/docs/current/static/indexes-types.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2008, 04:12 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
tier.ruВсе тесты запускал для table3 с 20K записей. Мой вариант выполняется строго ~10 мин.покажите explain analyze этого запроса tier.ruПлан (уже для table3 со 100 записями)планы для таблиц гораздо меньшего размера не интересны tier.ruэто - очевидная чушь. памяти надо занять многие гигабайты, чтобы выполнить подзапрос.вы разработчик постгреса? знаете какие данные надо держать в памяти, а какие можно свопить на диск, и т.д.? tier.ruвсе-таки запускал для эксперимента. окончания не дождался за час. плана не будет. ... Не дождался окончания за 30 мин. обрубил.в этом случае показывайте explain без analyze DAISERТут оптимизация запросов врядли поможет.-1 DAISERХотелось бы увидеть планы выполения, только без analyze.просто не читайте данные "(actual ...)", вот и будет explain без analyze ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2008, 10:18 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Собственное исследование: 3 таблицы. table1, table2, table3. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. "table2" и "table3" аналогичной структуры. Все поля в таблицах заполнены. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Запрос автора темы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Мой запрос: Код: 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. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Funny_Falcon: Код: 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. Создаем hash-индексы Код: plaintext 1. 2. 3. 4. 5. 6. Запрос автора: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Мой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Результаты выполнения других двух запросов тоже не изменились. Так что с индексами я погорячился. Что ещё можно попробовать? P.S.: у меня запрос tier.ru выполнялся 1.5-2.5 сек (50 000 записей в table3). Конфигурация, только не смейтесь, P-III 800MHz/384Mb/OpenSUSE 10.2. PostgreSQL 8.3.4, work_mem = 8MB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2008, 20:29 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
я чё-то не понял, почему вы hash-индексы по полю id создаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 10:24 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
DAISERМой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. лучше получить результаты тестов от автора, они могут отличаться от ваших, потому что например таблицы замусорены удаленными строками или статистика не собрана или собрана менее подробно или по другим причинам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 11:09 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Вообще фигня какая-то в тестах DAISER. Почему во всех ваших запросах фигурирует поле-счетчик id, в то время как у меня - текстовое поле field1? \d table1 Table "public.table1" Column | Type | Modifiers --------------+-----------------------------+---------------------------------------------------------- id | integer | not null default nextval('table1_id_seq'::regclass) field1 | text | field2 | text | cdate | timestamp without time zone | default now() field3 | text | flags | integer | default 0 status | smallint | not null default (-10) field4 | text | pr | integer | field5 | integer | default 0 Indexes: "table1_pkey" PRIMARY KEY, btree (id) "table1_field1_key" UNIQUE, btree (field1) "table1_field3_index" UNIQUE, btree (field3) "table1_status_index" btree (status) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 11:46 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
OFFTOPIC: DAISER, для ускорения этих запросов надо избавиться от HashJoin по t1 и от MergeJoin по t2 в пользу NestedLoop DAISERМой запрос: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Funny_Falcon: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 11:52 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
tier.ru, почему не показываете explain analyze? LeXa NalBat tier.ruВсе тесты запускал для table3 с 20K записей. Мой вариант выполняется строго ~10 мин.покажите explain analyze этого запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 11:54 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
показал же. чтоб не искали в предыдущих постах, вот ще раз: QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------- Seq Scan on table3 (cost=0.00..9572.40 rows=25 width=83) (actual time=151.129..3649.923 rows=89 loops=1) Filter: ((NOT (subplan)) AND (NOT (subplan))) SubPlan -> Index Scan using table1_field1_key on table1 (cost=0.00..87.28 rows=1 width=0) (actual time=25.057..25.057 rows=0 loops=100) Index Cond: (field1 = $0) -> Index Scan using table2_field1_key on table2 (cost=0.00..8.42 rows=1 width=0) (actual time=11.428..11.428 rows=0 loops=100) Index Cond: (field1 = $0) Total runtime: 3650.167 ms (8 rows) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 12:00 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
tier.ruпоказал же... actual rows=89 ...не то. обещали "20K записей" и "~10 мин". как я писал, "планы для таблиц гораздо меньшего размера не интересны". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 12:04 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
Я не настолько силен в базах данных, но по-моему, это один х. Но, все-таки покажу щас. Подождите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 12:16 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------- Seq Scan on table3 (cost=0.00..1928003.20 rows=5000 width=70) (actual time=100781.649..490673.590 rows=61 loops=1) Filter: ((NOT (subplan)) AND (NOT (subplan))) SubPlan -> Index Scan using table1_field1_key on table1 (cost=0.00..87.99 rows=1 width=0) (actual time=22.942..22.942 rows=1 loops=19999) Index Cond: (field1 = $0) -> Index Scan using table2_field1_key on table2 (cost=0.00..8.38 rows=1 width=0) (actual time=1.580..1.580 rows=0 loops=20000) Index Cond: (field1 = $0) Total runtime: 490673.753 ms (8 rows) И теперь, если не трудно, объясните мне, малограмотному, чем вас не устроил план запроса по 100 записям и зачем надо было выполнять его еще по 20K? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 12:42 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
tier.ru-> Index Scan using table1_field1_key on table1 (actual time=22.942..22.942 rows=1)кажется, что поиск по индексу работает медленно. попробуйте drop index table1_field1_key, vacuum full table1, create index table1_field1_key. и покажите получившийся explain analyze. tier.ruИ теперь, если не трудно, объясните мне, малограмотному, чем вас не устроил план запроса по 100 записям и зачем надо было выполнять его еще по 20K?в частности для того, чтобы разбираясь с проблемой, щупать её саму, а не тестовый пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 12:58 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
vacuum full такой огромной таблицы даже на нашем очень мощном железе занимает дня два. уже пробовал. даже бэкап/рестор всей базы и то быстрее (часов за 6 делается). maintenance_work_mem = 512MB postgresql-8.3.3 а это продакшн-система. так что, неосуществимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 13:27 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
возможно, медленно работает поиск по индексу table1_field1_key из-за того, что вследствии update и delete накопилось много устаревших версий строк в таблице или индексе. как идет работа с таблицами table1 и table2, строки в них только добавляются или еще и изменяются и удаляются? покажите пожалуйста статистику: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. tier.ruvacuum full такой огромной таблицы даже на нашем очень мощном железе занимает дня два. уже пробовал. даже бэкап/рестор всей базы и то быстрее (часов за 6 делается).пересоздать индекс тоже никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 15:27 |
|
||
|
помогите оптимизировать запрос
|
|||
|---|---|---|---|
|
#18+
покажите ещё пожалуйста explain analyze SELECT field1 FROM table3 WHERE not EXISTS (SELECT 1 FROM table1 WHERE field1 = table3.field1); explain analyze SELECT field1 FROM table3 WHERE not EXISTS (SELECT 1 FROM table2 WHERE field1 = table3.field1); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2008, 15:36 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35567838&tid=2003996]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 251ms |
| total: | 407ms |

| 0 / 0 |
