Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Из-за чего ограничивается число выбираемых строк? / 8 сообщений из 8, страница 1 из 1
07.07.2020, 10:47
    #39976977
kochka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
Доброе утро! В наличие есть таблица diagnosis на 15 млн строк и таблица icd на 14 тыс строк.
Делаю следующий запрос в лоб
Код: sql
1.
2.
select d.id, d.diagnosis_text, d.case_id, d.icd_id from diagnosis d, icd i
where d.diagnosis_text = i.code


получаю следующий план при explain analyze

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Gather  (cost=2185362.07..2987301.73 rows=7542750 width=135) (actual time=284169.008..284788.535 rows=131 loops=1)
  Workers Planned: 2
  Workers Launched: 0
  ->  Merge Join  (cost=2184362.07..2232026.73 rows=3142812 width=135) (actual time=284168.144..284787.139 rows=131 loops=1)
        Merge Cond: (d.diagnosis_text = (i.code)::text)
        ->  Sort  (cost=2184206.16..2200801.94 rows=6638313 width=135) (actual time=283963.525..284723.545 rows=182001 loops=1)
              Sort Key: d.diagnosis_text
              Sort Method: external merge  Disk: 2312416kB
              ->  Parallel Seq Scan on diagnosis d  (cost=0.00..524421.13 rows=6638313 width=135) (actual time=0.090..15305.432 rows=15979947 loops=1)
        ->  Materialize  (cost=0.29..417.49 rows=14926 width=5) (actual time=4.649..25.333 rows=15002 loops=1)
              ->  Index Only Scan using icd_code_idx on icd i  (cost=0.29..380.18 rows=14926 width=5) (actual time=4.611..22.196 rows=14926 loops=1)
                    Heap Fetches: 0
Planning Time: 9.326 ms
Execution Time: 285353.417 ms



На этапе Merge Join получается 131 строка, хотя таких строк в таблице больше, счет на тысячи.

Немного меняю запрос
Код: sql
1.
2.
select d.id, d.diagnosis_text, d.case_id, d.icd_id from diagnosis d
where d.diagnosis_text = any(select code from icd)



получаю
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Hash Join  (cost=747.00..742671.28 rows=7437788 width=135) (actual time=12163.727..18892.721 rows=131 loops=1)
  Hash Cond: (d.diagnosis_text = (icd.code)::text)
  ->  Seq Scan on diagnosis d  (cost=0.00..617357.51 rows=15931951 width=135) (actual time=0.041..10691.065 rows=15980582 loops=1)
  ->  Hash  (cost=563.94..563.94 rows=14645 width=5) (actual time=29.844..29.844 rows=14645 loops=1)
        Buckets: 16384  Batches: 1  Memory Usage: 668kB
        ->  HashAggregate  (cost=417.49..563.94 rows=14645 width=5) (actual time=19.786..26.004 rows=14645 loops=1)
              Group Key: (nsi_icd.code)::text
              ->  Index Only Scan using icd_code_idx on icd  (cost=0.29..380.18 rows=14926 width=5) (actual time=0.065..11.894 rows=14926 loops=1)
                    Heap Fetches: 0
Planning Time: 25.003 ms
Execution Time: 18893.499 ms



и снова выборка ограничена 131 строкой.

Не могу понять из-за чего так происходит. Возможно, я что-то упускаю?
...
Рейтинг: 0 / 0
07.07.2020, 11:48
    #39977014
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
kochka,

'хотя таких строк в таблице больше, счет на тысячи.' - каких "таких строк"
и как вы это проверяли?
...
Рейтинг: 0 / 0
07.07.2020, 12:48
    #39977059
kochka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
Maxim Boguk,строк попадающих под условие.
Код: sql
1.
d.diagnosis_text = i.code


дело в том, что эти запросы мне нужны для сложного update, который использует несколько таблиц. Для этого мною написана отдельная процедура, которая потом запускается в цикле в анонимном блоке. Изначально на запросы выше был еще повешен limit 1000, для того чтобы обновления происходили пачками и не перегружали базу. Но позже, когда скорость выполнения процедуры в цикле существенно замедлилась, я решила остатки таких строк залить во временную таблицу, чтобы использовать ее. Тут я и заметила, что выборка происходит только на 131 строку. При включение raise notice для Id изменяемых строк это подтвердилось. То есть за одну итерацию цикла он выбирает 131 строку, и таких итераций было, после того как заметила это ограничение, уже больше 2000.
...
Рейтинг: 0 / 0
07.07.2020, 13:00
    #39977066
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
kochka
Maxim Boguk,строк попадающих под условие.
Код: sql
1.
d.diagnosis_text = i.code


дело в том, что эти запросы мне нужны для сложного update, который использует несколько таблиц. Для этого мною написана отдельная процедура, которая потом запускается в цикле в анонимном блоке. Изначально на запросы выше был еще повешен limit 1000, для того чтобы обновления происходили пачками и не перегружали базу. Но позже, когда скорость выполнения процедуры в цикле существенно замедлилась, я решила остатки таких строк залить во временную таблицу, чтобы использовать ее. Тут я и заметила, что выборка происходит только на 131 строку. При включение raise notice для Id изменяемых строк это подтвердилось. То есть за одну итерацию цикла он выбирает 131 строку, и таких итераций было, после того как заметила это ограничение, уже больше 2000.

Тогда собирайте доказательную базу и пишите в "хакерс" что "Ваш оптимизатор не работает".
Глядишь - прославитесь как "починитель мега бага"

И статистику надо бы пересобрать.
Код: sql
1.
2.
3.
rows=7542750 actual rows=131 
  Workers Planned: 2
  Workers Launched: 0


хрень какая-то
...
Рейтинг: 0 / 0
07.07.2020, 13:19
    #39977082
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
kochka
Maxim Boguk,строк попадающих под условие.
Код: sql
1.
d.diagnosis_text = i.code


дело в том, что эти запросы мне нужны для сложного update, который использует несколько таблиц. Для этого мною написана отдельная процедура, которая потом запускается в цикле в анонимном блоке. Изначально на запросы выше был еще повешен limit 1000, для того чтобы обновления происходили пачками и не перегружали базу. Но позже, когда скорость выполнения процедуры в цикле существенно замедлилась, я решила остатки таких строк залить во временную таблицу, чтобы использовать ее. Тут я и заметила, что выборка происходит только на 131 строку. При включение raise notice для Id изменяемых строк это подтвердилось. То есть за одну итерацию цикла он выбирает 131 строку, и таких итераций было, после того как заметила это ограничение, уже больше 2000.


ну тогда находитe строку которая должна быть в запросе
показываете ее данные
и показываете что запрос ее не отдает (можно на этом форуме)...
пока это все даже не bug report а просто жалобы непонятно на что

Т.е. от вас
есть строка в diagnosis с такими то полями
есть строка в icd с такими то полями
вот такой запрос ее не отдает хотя должен (пример запроса и проверка что этой строки там таки действительно нет)

меня слегка смущает конструкция d.diagnosis_text = (i.code)::text а какие типы данных у вас там на обоих сторонах равенства?
...
Рейтинг: 0 / 0
07.07.2020, 14:11
    #39977103
Guzya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
Покажите так же процедуру и цикл, которыми обновляете.
Может у Вас там условие отбора кривое и Вы одни и те же данные постоянно обновляете.
...
Рейтинг: 0 / 0
07.07.2020, 14:12
    #39977104
kochka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
Всем спасибо за внимание! Нашлась ошибка в данных.
...
Рейтинг: 0 / 0
07.07.2020, 15:16
    #39977127
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Из-за чего ограничивается число выбираемых строк?
kochka
Всем спасибо за внимание! Нашлась ошибка в данных.


Вот так вот происходит в 99.99% случаев когда говорят что база глючит или некорректно что то выводит ;).
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Из-за чего ограничивается число выбираемых строк? / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]