Size: a a a

pgsql – PostgreSQL

2021 March 08

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladislav Vladislavsky
Всем привет.
Я делаю для коллег презентацию по оптимизации запросов и пытаюсь продемонстрировать связь между правильной работой планировщика и актуальностью статы по таблице. Хочу сделать пример построения неэффективного плана, который запорот из-за кривой статистики.

Сделал таблицу с 10 млн записей и индекс по ней, теперь пытаюсь сломать стату так, чтобы планировщик выполнял поиск 1 строки с фильтрацией вида "where value = x" через последовательный перебор, а не через индекс, т.е. чтобы построился неэффективный план.

Попробовал похимичить с кол-вами строк и страниц таблицы в pg_class, но это не помогло :/  Подскажите, что ещё можно попробовать?
А оценки-то Вам удалось "сломать"? И можете показать \d таблицы?
И вообще, это не самый лучший пример (т.е. если для подобного запроса PostgreSQL использует seq.scan, то он почти наверняка делает правильный выбор).
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
Yaroslav Schekin
А оценки-то Вам удалось "сломать"? И можете показать \d таблицы?
И вообще, это не самый лучший пример (т.е. если для подобного запроса PostgreSQL использует seq.scan, то он почти наверняка делает правильный выбор).
Разве поиск одной строки по значению в колонке с нормальным распределением в таблице с 10 млн строк не будет быстрее по индексу?
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
@vyegorov, спасибо, попробую
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladislav Vladislavsky
Разве поиск одной строки по значению в колонке с нормальным распределением в таблице с 10 млн строк не будет быстрее по индексу?
Именно с нормальным, серьёзно? ;)
Тогда, естественно, зависит от того, какой именно ключ / сколько всего разных значений.
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
Yaroslav Schekin
Именно с нормальным, серьёзно? ;)
Тогда, естественно, зависит от того, какой именно ключ / сколько всего разных значений.
Ясно, спасибо
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladislav Vladislavsky
Ясно, спасибо
Так оценки-то Вам удалось "сломать" или нет?
И да, лучше показывать \d текстом, а не вывод неведомых tools в картинках — они ещё и не так редко врут (но я сужу только по тому, что показывают тут и в других чатах / каналах).
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
Yaroslav Schekin
Так оценки-то Вам удалось "сломать" или нет?
И да, лучше показывать \d текстом, а не вывод неведомых tools в картинках — они ещё и не так редко врут (но я сужу только по тому, что показывают тут и в других чатах / каналах).
Сломать не удалось, по тексту понял, просто не привык работать через консоль
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladislav Vladislavsky
Сломать не удалось, по тексту понял, просто не привык работать через консоль
Хмм... а если попробовать [очень] неравномерное распределение значений, уменьшить statisitics target поля до минимума:
ALTER TABLE something ALTER COLUMN "value" SET STATISTICS 1;
И выполнять ANALYZE, пока не "повезёт" (а это должно случиться быстро почти наверняка)?
источник

VV

Vladislav Vladislavs... in pgsql – PostgreSQL
Yaroslav Schekin
Хмм... а если попробовать [очень] неравномерное распределение значений, уменьшить statisitics target поля до минимума:
ALTER TABLE something ALTER COLUMN "value" SET STATISTICS 1;
И выполнять ANALYZE, пока не "повезёт" (а это должно случиться быстро почти наверняка)?
Выглядит многообещающе, спасибо, попробую)
источник

YZ

Yuriy Zykin in pgsql – PostgreSQL
прошу помочь, как "распарсить" json до координат? Не могу сообразить, как тут использовать json_array_elements

with w as (
 select '{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[52.0967564,59.4503427],[52.2689509,59.416844],[52.442522,59.383044],[52.6673693,59.4035124],[52.5773728,59.4228868],[52.5796804,59.4287556],[52.4305758,59.4661864],[52.4478745,59.5075522],[52.3150655,59.5344411],[52.1945329,59.5202917],[52.0967564,59.4503427]]]}, "properties": {"osm_id": -3790402, "admin_level": 8, "parents": "-382779,-115100,-1075831,-60189", "name": "Светлополянское городское поселение", "local_name": "Светлополянское городское поселение", "name_en": null}}]}'::jsonb as j
)
SELECT
 j -> 'features' -> 'properties' ::TEXT,
 j -> 'features' -> 'properties' -> 'name'::TEXT,
 j -> 'features' -> 'properties' -> 'local_name'::TEXT,
 j -> 'features' -> 'properties' -> 'admin_level'::TEXT
FROM w;
источник
2021 March 09

VN

Vladislav Nezhutin in pgsql – PostgreSQL
Yuriy Zykin
прошу помочь, как "распарсить" json до координат? Не могу сообразить, как тут использовать json_array_elements

with w as (
 select '{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[52.0967564,59.4503427],[52.2689509,59.416844],[52.442522,59.383044],[52.6673693,59.4035124],[52.5773728,59.4228868],[52.5796804,59.4287556],[52.4305758,59.4661864],[52.4478745,59.5075522],[52.3150655,59.5344411],[52.1945329,59.5202917],[52.0967564,59.4503427]]]}, "properties": {"osm_id": -3790402, "admin_level": 8, "parents": "-382779,-115100,-1075831,-60189", "name": "Светлополянское городское поселение", "local_name": "Светлополянское городское поселение", "name_en": null}}]}'::jsonb as j
)
SELECT
 j -> 'features' -> 'properties' ::TEXT,
 j -> 'features' -> 'properties' -> 'name'::TEXT,
 j -> 'features' -> 'properties' -> 'local_name'::TEXT,
 j -> 'features' -> 'properties' -> 'admin_level'::TEXT
FROM w;
так попробуй


with w as (
 select '{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[52.0967564,59.4503427],[52.2689509,59.416844],[52.442522,59.383044],[52.6673693,59.4035124],[52.5773728,59.4228868],[52.5796804,59.4287556],[52.4305758,59.4661864],[52.4478745,59.5075522],[52.3150655,59.5344411],[52.1945329,59.5202917],[52.0967564,59.4503427]]]}, "properties": {"osm_id": -3790402, "admin_level": 8, "parents": "-382779,-115100,-1075831,-60189", "name": "Светлополянское городское поселение", "local_name": "Светлополянское городское поселение", "name_en": null}}]}'::jsonb as j
)
SELECT
 f -> 'properties',
 f -> 'properties' ->> 'name',
 f -> 'properties' ->> 'local_name',
 f -> 'properties' ->> 'admin_level'
FROM w, jsonb_array_elements(w->'features') f;
источник

VN

Vladislav Nezhutin in pgsql – PostgreSQL
если есть постгис и нужна геометрия то можно добавить select st_geomfromgeojson(f ->> ‘geometry’)
источник

YZ

Yuriy Zykin in pgsql – PostgreSQL
Vladislav Nezhutin
так попробуй


with w as (
 select '{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Polygon","coordinates":[[[52.0967564,59.4503427],[52.2689509,59.416844],[52.442522,59.383044],[52.6673693,59.4035124],[52.5773728,59.4228868],[52.5796804,59.4287556],[52.4305758,59.4661864],[52.4478745,59.5075522],[52.3150655,59.5344411],[52.1945329,59.5202917],[52.0967564,59.4503427]]]}, "properties": {"osm_id": -3790402, "admin_level": 8, "parents": "-382779,-115100,-1075831,-60189", "name": "Светлополянское городское поселение", "local_name": "Светлополянское городское поселение", "name_en": null}}]}'::jsonb as j
)
SELECT
 f -> 'properties',
 f -> 'properties' ->> 'name',
 f -> 'properties' ->> 'local_name',
 f -> 'properties' ->> 'admin_level'
FROM w, jsonb_array_elements(w->'features') f;
Владислав, отлично! но что то с типами ещё, разобраться с ходу не смог
источник

VN

Vladislav Nezhutin in pgsql – PostgreSQL
Yuriy Zykin
Владислав, отлично! но что то с типами ещё, разобраться с ходу не смог
Я перепутал, там надо j->'features' вместо w
источник

YZ

Yuriy Zykin in pgsql – PostgreSQL
Vladislav Nezhutin
Я перепутал, там надо j->'features' вместо w
Заработало! Спасибо! 👍👍👍 Координаты да надо, сейчас повытаскиваю с помощью кода выше 👍 Да, st_geomfromgeojson работает как надо 🙏🙏🙏
источник

s

shoxrux in pgsql – PostgreSQL
Как сделать так чтобы join был по определенному ключу если подвыражение возвратит 1 ?
У меня несколько подвыражений, которые должны соединяться каждый по другому с main table
источник

s

shoxrux in pgsql – PostgreSQL
select (select a from table_a where expression) b
from main_table
join sec_table on a.id = (case b is KRED then b.id)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
Как сделать так чтобы join был по определенному ключу если подвыражение возвратит 1 ?
У меня несколько подвыражений, которые должны соединяться каждый по другому с main table
Лучше так не делать, по-хорошему (т.е. это почти наверняка неудачная схема БД).
А так — покажите пример таблиц или как-то подробнее объясните, что именно нужно.
источник