Size: a a a

pgsql – PostgreSQL

2020 December 22

IK

Ivan Karniyenka in pgsql – PostgreSQL
всем привет. имею такую ошиьбку
operator does not exist: numrange = numeric
вот такой код
AND (field_range ,field_range, field_range) IN %(sizes)s
sizes - массив массивов. я знаю, что для извленчения из рейнджа пользуется конструкция вида
range_field @> your_input
. но можно ли его использовать с массивом массивов найти не могу нигде использование
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
всем привет. имею такую ошиьбку
operator does not exist: numrange = numeric
вот такой код
AND (field_range ,field_range, field_range) IN %(sizes)s
sizes - массив массивов. я знаю, что для извленчения из рейнджа пользуется конструкция вида
range_field @> your_input
. но можно ли его использовать с массивом массивов найти не могу нигде использование
у тебя под IN стоит список триплетов?
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
всем привет. имею такую ошиьбку
operator does not exist: numrange = numeric
вот такой код
AND (field_range ,field_range, field_range) IN %(sizes)s
sizes - массив массивов. я знаю, что для извленчения из рейнджа пользуется конструкция вида
range_field @> your_input
. но можно ли его использовать с массивом массивов найти не могу нигде использование
После подстановки что вместо %(sizes) получается?
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
Ilia Zviagin
После подстановки что вместо %(sizes) получается?
в sizes что то вроде ((1,3,2), (5,8,9))
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
в sizes что то вроде ((1,3,2), (5,8,9))
Что-то вроде, или именно это?
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
Ilia Zviagin
Что-то вроде, или именно это?
'sizes': ((Decimal('0.100000'), Decimal('0.100000'), Decimal('0.100000'), 0), (Decimal('10.000000'), Decimal('10.000000'), Decimal('10.000000'), 1), (Decimal('0.328084'), Decimal('0.328084'), Decimal('0.328084'), 2), (Decimal('3.937008'), Decimal('3.937008'), Decimal('3.937008'), 3), (Decimal('100.000000'), Decimal('100.000000'), Decimal('100.000000'), 4)) - вот это точно приходит
источник

N

Nikita in pgsql – PostgreSQL
Не подскажете какой индекс в данном случае накинуть?
select 
 *
from
 table t
where
 t.Start is not null
 and t.duration is not null
 and TIMESTAMP '2020-12-22 14:15:04' between t.Start and t.Start + make_interval(hours => t.duration)
 limit 10

(start, duration)
(start, (t.Start + make_interval(hours => t.duration))
не катят, а я где-то дуб
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
'sizes': ((Decimal('0.100000'), Decimal('0.100000'), Decimal('0.100000'), 0), (Decimal('10.000000'), Decimal('10.000000'), Decimal('10.000000'), 1), (Decimal('0.328084'), Decimal('0.328084'), Decimal('0.328084'), 2), (Decimal('3.937008'), Decimal('3.937008'), Decimal('3.937008'), 3), (Decimal('100.000000'), Decimal('100.000000'), Decimal('100.000000'), 4)) - вот это точно приходит
там 4 члена, а не три. В этом и проблема.
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
Nikita
Не подскажете какой индекс в данном случае накинуть?
select 
 *
from
 table t
where
 t.Start is not null
 and t.duration is not null
 and TIMESTAMP '2020-12-22 14:15:04' between t.Start and t.Start + make_interval(hours => t.duration)
 limit 10

(start, duration)
(start, (t.Start + make_interval(hours => t.duration))
не катят, а я где-то дуб
http://tatiyants.com/pev/#/plans/new вот тут можно поиграться
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
Ilia Zviagin
там 4 члена, а не три. В этом и проблема.
в sql тоже 4 я просто убрал названия полей. и случайно подтерлось одно из них
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
в sql тоже 4 я просто убрал названия полей. и случайно подтерлось одно из них
AND (field_range ,field_range, field_range)  - три
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Ivan Karniyenka
в sql тоже 4 я просто убрал названия полей. и случайно подтерлось одно из них
Если 4ре, то проблем быть не должно.
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
Ilia Zviagin
AND (field_range ,field_range, field_range)  - три
AND (packaging_length, width , height, size_unit) IN %(sizes)s
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Nikita
Не подскажете какой индекс в данном случае накинуть?
select 
 *
from
 table t
where
 t.Start is not null
 and t.duration is not null
 and TIMESTAMP '2020-12-22 14:15:04' between t.Start and t.Start + make_interval(hours => t.duration)
 limit 10

(start, duration)
(start, (t.Start + make_interval(hours => t.duration))
не катят, а я где-то дуб
Тут надо переписать условие between
источник

N

Nikita in pgsql – PostgreSQL
Ilia Zviagin
Тут надо переписать условие between
в обычные условия?
источник

N

Nikita in pgsql – PostgreSQL
Ivan Karniyenka
http://tatiyants.com/pev/#/plans/new вот тут можно поиграться
источник

IK

Ivan Karniyenka in pgsql – PostgreSQL
не вижу план. если мне надо проверить корректный ли индекс, я просто беру таблицу, без индексов или с индексами уже стоящими. и получаю план. потом вставляю куда хочу индекс, или акк мне кажется, который сработает и делаю еще один план, потом сверяю планы.
то есть, план я использую не как абслютный показатель - быстрее/мделеннее, а как относительный для исходного кода.
возможно, это не лучший вариант. но мне как то помогал сократить время запроса
источник

N

Nikita in pgsql – PostgreSQL
Ivan Karniyenka
не вижу план. если мне надо проверить корректный ли индекс, я просто беру таблицу, без индексов или с индексами уже стоящими. и получаю план. потом вставляю куда хочу индекс, или акк мне кажется, который сработает и делаю еще один план, потом сверяю планы.
то есть, план я использую не как абслютный показатель - быстрее/мделеннее, а как относительный для исходного кода.
возможно, это не лучший вариант. но мне как то помогал сократить время запроса
перепробовал разные комбинации по полям и выражением, указанным в запросе. в любом случае фулскан идет
источник

IZ

Ilia Zviagin in pgsql – PostgreSQL
Nikita
Не подскажете какой индекс в данном случае накинуть?
select 
 *
from
 table t
where
 t.Start is not null
 and t.duration is not null
 and TIMESTAMP '2020-12-22 14:15:04' between t.Start and t.Start + make_interval(hours => t.duration)
 limit 10

(start, duration)
(start, (t.Start + make_interval(hours => t.duration))
не катят, а я где-то дуб
and  t.Start <= TIMESTAMP '2020-12-22 14:15:04'  and t.Start <= TIMESTAMP '2020-12-22 14:15:04' + make_interval(hours => t.duration)

что-то типа того. МОг наврать
источник

N

Nikita in pgsql – PostgreSQL
Ilia Zviagin
and  t.Start <= TIMESTAMP '2020-12-22 14:15:04'  and t.Start <= TIMESTAMP '2020-12-22 14:15:04' + make_interval(hours => t.duration)

что-то типа того. МОг наврать
в плане он собственно так и выглядит. да и в доке написано, что индексы норм с between дружать с какой-то версии
источник