Size: a a a

pgsql – PostgreSQL

2021 March 11

Л

Ленивый Пандыч... in pgsql – PostgreSQL
Оптимизирую наши запросы. Сейчас переписал запрос с row_number() = 1 на self join. Explain показывает снижение затрат по времени выполнения в два раза.

Погуглив, наткнулся на такую фразу:
Avoid self-joins. Use a window (analytic) function instead.

Так что вопрос -  почему это считается плохо и не надо использовать self join?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Ленивый Пандыч
Оптимизирую наши запросы. Сейчас переписал запрос с row_number() = 1 на self join. Explain показывает снижение затрат по времени выполнения в два раза.

Погуглив, наткнулся на такую фразу:
Avoid self-joins. Use a window (analytic) function instead.

Так что вопрос -  почему это считается плохо и не надо использовать self join?
Потому что они зачастую оптимизируются лучше, вот и всё.
Но иногда — намного хуже, учтите (а некоторые запросы на window functions и вовсе не перепишешь).
Т.е. планы нужно смотреть (или примерно представлять, как это всё работает), по-хорошему.
источник

SM

Setplus Mac in pgsql – PostgreSQL
Так
Всем большое спасибо!
источник

SM

Setplus Mac in pgsql – PostgreSQL
Оказалось, что проблема действительно в диске: при RpM = 7200 макс. кол-во иопсов - 120-130, и при включённом fsync'е и получал достижение порогового значения при 10 инсертах в секунду
источник

K

Konstantin in pgsql – PostgreSQL
Народ, подскажите плз, как поправить
Есть поле  varchar(128)
если вставляю на английском строку 128 символов - все ок, если пытаюсь вставить кириллицу то пишет слишком длинное значение
value too long for type character varying(128)
думаю дело в кодировке но не знаю куда копать
источник

СГ

Сергей Голод... in pgsql – PostgreSQL
Yaroslav Schekin
Хмм... а запрос-то Вы показывали, в самом деле (и \d+ таблицы, и версию PostgreSQL)?
Описывали, как он вызывается (т.е. что и как делает эти 10 INSERT)?

Я, может, пропустил, конечно.
не), не было
источник

МШ

Михаил Шурутов... in pgsql – PostgreSQL
Konstantin
Народ, подскажите плз, как поправить
Есть поле  varchar(128)
если вставляю на английском строку 128 символов - все ок, если пытаюсь вставить кириллицу то пишет слишком длинное значение
value too long for type character varying(128)
думаю дело в кодировке но не знаю куда копать
В выхлопе команды psql -l столбцы Кодировка | LC_COLLATE  |  LC_CTYPE
источник

МШ

Михаил Шурутов... in pgsql – PostgreSQL
Ну и вдогон про варчар(N): https://ru-postgres.livejournal.com/65930.html
источник

ZE

Zhanibek Ergaliev in pgsql – PostgreSQL
Всем привет, подскажите пожалуйста как правильно написать такой запрос? Я хочу проверять если ли пустые адреса в таблице order_item где order_id = 658202
Очень буду благодарен
источник

ZE

Zhanibek Ergaliev in pgsql – PostgreSQL
Zhanibek Ergaliev
Всем привет, подскажите пожалуйста как правильно написать такой запрос? Я хочу проверять если ли пустые адреса в таблице order_item где order_id = 658202
Очень буду благодарен
SELECT (SELECT oi.address FROM order_item oi WHERE oi.address IS NULL) FROM order_item AS oi WHERE order_id = 658202
Вот запрос если кому не видно
источник

GV

G V in pgsql – PostgreSQL
Всем привет, пишу запрос:

select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 )
 order by  d.source_time desc limit 100 ;


Получаю результат:

Время             |Скорость|Расход   |
------------------|--------|---------|
021-03-03 13:19:08|    2.80|         |
021-03-03 13:19:08|        |659136.04|
021-03-03 12:59:08|    2.84|         |
021-03-03 12:59:08|        |691019.57|
021-03-03 12:39:08|    2.70|         |
021-03-03 12:39:08|        |548477.84|
021-03-03 12:19:08|    2.67|         |


Но не получается объединить строки по времени, если добавить group by,
то вылезает ошибка:
"SQL Error [42803]: ОШИБКА: столбец "d.archive_itemid" должен фигурировать в предложении
 GROUP BY или использоваться в агрегатной функции"

Для объединения пишу такой запрос

select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 )
 group by d.source_time
 order by  d.source_time desc limit 100 ;


Подскажите пожалуйста, куда двигаться надо,
что бы значения полей с одинаковым временем объединились ?
источник

s

shoxrux in pgsql – PostgreSQL
Zhanibek Ergaliev
SELECT (SELECT oi.address FROM order_item oi WHERE oi.address IS NULL) FROM order_item AS oi WHERE order_id = 658202
Вот запрос если кому не видно
select count(*) from order_item oi where order_id = 658202 and oi.address is null
источник

ZE

Zhanibek Ergaliev in pgsql – PostgreSQL
shoxrux
select count(*) from order_item oi where order_id = 658202 and oi.address is null
Ля ты лучший, спасибо)))
источник

GM

Gennady Moiseychenko in pgsql – PostgreSQL
G V
Всем привет, пишу запрос:

select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 )
 order by  d.source_time desc limit 100 ;


Получаю результат:

Время             |Скорость|Расход   |
------------------|--------|---------|
021-03-03 13:19:08|    2.80|         |
021-03-03 13:19:08|        |659136.04|
021-03-03 12:59:08|    2.84|         |
021-03-03 12:59:08|        |691019.57|
021-03-03 12:39:08|    2.70|         |
021-03-03 12:39:08|        |548477.84|
021-03-03 12:19:08|    2.67|         |


Но не получается объединить строки по времени, если добавить group by,
то вылезает ошибка:
"SQL Error [42803]: ОШИБКА: столбец "d.archive_itemid" должен фигурировать в предложении
 GROUP BY или использоваться в агрегатной функции"

Для объединения пишу такой запрос

select  to_timestamp((d.source_time - 116444736000000000)::float / 10000000 ) as Время,
 case  when d.archive_itemid = 18  then Round( d.value::numeric , 2) end as Скорость,
 case  when d.archive_itemid = 17  then Round( d.value::numeric , 2) end as Расход
 from  public.data_raw d  where d.status_code = 0 and layer =0 AND (d.archive_itemid = 18 OR d.archive_itemid = 17 )
 group by d.source_time
 order by  d.source_time desc limit 100 ;


Подскажите пожалуйста, куда двигаться надо,
что бы значения полей с одинаковым временем объединились ?
не совсем понятно что Вы хотите получить в результате. У Вас есть 3 колонки, одну из которых вы хотите группировать, а с остальными что делать? Либо по ним тоже группировать надо, но тогда смыла в этом нет, либо использовать на них какие-то агрегатные функции: sum, avg и т.п.
источник

K

Kino Recovery in pgsql – PostgreSQL
у меня возник интересный вопрос, а что случиться если на клиенте у меня 11я версия библиотеки а сервер 12. а в запросах активно участвует jsonpath
источник

GM

Gennady Moiseychenko in pgsql – PostgreSQL
Gennady Moiseychenko
не совсем понятно что Вы хотите получить в результате. У Вас есть 3 колонки, одну из которых вы хотите группировать, а с остальными что делать? Либо по ним тоже группировать надо, но тогда смыла в этом нет, либо использовать на них какие-то агрегатные функции: sum, avg и т.п.
если мы используем group by на колонку "Время", то в вашем примере из 7ми строк должна остаться одна, но что тогда выводить в колонках Скорость и Расход, учитывая что там для разных строк изначально разные значения?
источник

GV

G V in pgsql – PostgreSQL
Gennady Moiseychenko
если мы используем group by на колонку "Время", то в вашем примере из 7ми строк должна остаться одна, но что тогда выводить в колонках Скорость и Расход, учитывая что там для разных строк изначально разные значения?
Исходно все лежит в таком формате:

layer|archive_itemid|source_time       |server_time|status_code|value             |s_value|
-----|--------------|------------------|-----------|-----------|------------------|-------|
   0|            18|132548425838890000|          0|          0|               0.0|       |
   1|            18|132548425838890000|          0|          0|               0.0|       |
   2|            18|132548425838890000|          0|          0|               0.0|       |
   0|            17|132548425838890000|          0|          0|               0.0|       |
   1|            17|132548425838890000|          0|          0|               0.0|       |
   2|            17|132548425838890000|          0|          0|               0.0|       |


То есть время одинаковое для нескольких archive_itemid
Соответственно при таком выводе, второе и третье поле имеет NULL


Хочу такой результат:

Время             |Скорость|Расход   |
------------------|--------|---------|
021-03-03 13:19:08|    2.80|659136.04|
021-03-03 12:59:08|    2.84|691019.57|
021-03-03 12:39:08|    2.70|548477.84|    Строки со временем одинаковые
источник

K

Konstantin in pgsql – PostgreSQL
Михаил Шурутов
В выхлопе команды psql -l столбцы Кодировка | LC_COLLATE  |  LC_CTYPE
Спасибо, разобрался
у базы стояла кодировка SQL_ASCII, пересоздал с UTF8 и заработало
источник

GV

G V in pgsql – PostgreSQL
G V
Исходно все лежит в таком формате:

layer|archive_itemid|source_time       |server_time|status_code|value             |s_value|
-----|--------------|------------------|-----------|-----------|------------------|-------|
   0|            18|132548425838890000|          0|          0|               0.0|       |
   1|            18|132548425838890000|          0|          0|               0.0|       |
   2|            18|132548425838890000|          0|          0|               0.0|       |
   0|            17|132548425838890000|          0|          0|               0.0|       |
   1|            17|132548425838890000|          0|          0|               0.0|       |
   2|            17|132548425838890000|          0|          0|               0.0|       |


То есть время одинаковое для нескольких archive_itemid
Соответственно при таком выводе, второе и третье поле имеет NULL


Хочу такой результат:

Время             |Скорость|Расход   |
------------------|--------|---------|
021-03-03 13:19:08|    2.80|659136.04|
021-03-03 12:59:08|    2.84|691019.57|
021-03-03 12:39:08|    2.70|548477.84|    Строки со временем одинаковые
То есть по сути, я переворачиваю таблицу, но как схлопнуть строки с одинаковым временем не понимаю
источник

s

shoxrux in pgsql – PostgreSQL
G V
То есть по сути, я переворачиваю таблицу, но как схлопнуть строки с одинаковым временем не понимаю
используйте агрегатные  функции с group by
источник