Re: [pgsql-ru-general] индекс по полю JSON без функции

Lists: pgsql-ru-general
From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: индекс по полю JSON без функции
Date: 2013-09-24 22:05:10
Message-ID: 20130924220510.GE2828@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general


есть в табличке JSON-чик

там неопределенный набор полей в хеше поэтому JSON
но поле time в JSON есть почти всегда

хочу построить по нему индекс

CREATE INDEX ON "table" (("field"->>'time'))
WHERE ("field"->>'time') IS NOT NULL;

но поскольку в SQL запросах хочется оперировать полем time именно как
TIMESTAMP (а там CHECKER еще накинут на то что проверяет что time
это либо null либо timestamp).
то соответственно хочется индекс строить по типу timestamp (иначе
после приведения этот индекс не используется)

CREATE INDEX ON "table" ((("field"->>'time')::timestamp(0)))
WHERE ("field"->>'time') IS NOT NULL;

ругается что должно быть immutable.

функцию выделенную делать не хочется.

как быть?
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: Саша Александров <elequtree(at)gmail(dot)com>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: индекс по полю JSON без функции
Date: 2013-09-24 22:42:34
Message-ID: 20130924224234.GF2828@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

> Нельзя поле time вынести из JSON, если оно почти всегда есть?

можно, но не хочется этого делать ибо этот хешик как самостоятельная
сущность и она очень красиво в отдельном поле смотрится.
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Nikolay Samokhvalov <samokhvalov(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] индекс по полю JSON без функции
Date: 2013-09-25 16:06:01
Message-ID: CANNMO++17YsLxEUH6xPveUa5MNOw1Bw+fFyX0Qf+6yijWFgwyg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

что, если использовать тип данных timestamp without timezone?

2013/9/24 Dmitry E. Oboukhov <unera(at)debian(dot)org>

>
> есть в табличке JSON-чик
>
> там неопределенный набор полей в хеше поэтому JSON
> но поле time в JSON есть почти всегда
>
> хочу построить по нему индекс
>
> CREATE INDEX ON "table" (("field"->>'time'))
> WHERE ("field"->>'time') IS NOT NULL;
>
>
> но поскольку в SQL запросах хочется оперировать полем time именно как
> TIMESTAMP (а там CHECKER еще накинут на то что проверяет что time
> это либо null либо timestamp).
> то соответственно хочется индекс строить по типу timestamp (иначе
> после приведения этот индекс не используется)
>
> CREATE INDEX ON "table" ((("field"->>'time')::timestamp(0)))
> WHERE ("field"->>'time') IS NOT NULL;
>
> ругается что должно быть immutable.
>
> функцию выделенную делать не хочется.
>
> как быть?
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlJCDJYACgkQq4wAz/jiZTerDwCgwQ6czkLG8RhabD5tM3WAMHoo
> yiYAnjFD5Wfz6h0g5nOI5EPCARvBQAHC
> =JLzA
> -----END PGP SIGNATURE-----
>
>


From: Sergey Konoplev <gray(dot)ru(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] индекс по полю JSON без функции
Date: 2013-09-25 20:36:51
Message-ID: CAL_0b1vtHJ74DbxULcENYy-vov8PFAus85u1J+htydv3HeRvmQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

2013/9/24 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
> хочу построить по нему индекс
>
> CREATE INDEX ON "table" (("field"->>'time'))
> WHERE ("field"->>'time') IS NOT NULL;
>
> но поскольку в SQL запросах хочется оперировать полем time именно как
> TIMESTAMP (а там CHECKER еще накинут на то что проверяет что time
> это либо null либо timestamp).
> то соответственно хочется индекс строить по типу timestamp (иначе
> после приведения этот индекс не используется)
>
> CREATE INDEX ON "table" ((("field"->>'time')::timestamp(0)))
> WHERE ("field"->>'time') IS NOT NULL;
>
> ругается что должно быть immutable.

immutable cast из text в timestamp(tz) в postgres нет, т.к. результат
зависит от внешних факторов, таких как time zone сервера (если без tz)
и DateStyle. Можно написать функцию, например,
full_iso8601_to_timestamp(text), где будет проверка на то что текст в
полном ISO 8601 формате (со всем чем можно и таймзоной), тогда это
будет действительно immutable, и это смело можно будет применять в
индексах. Либо в соответствии с какой-то другой договорённостью,
главное чтобы небыло неоднозначностей.

--
Kind regards,
Sergey Konoplev
PostgreSQL Consultant and DBA

http://www.linkedin.com/in/grayhemp
+1 (415) 867-9984, +7 (901) 903-0499, +7 (988) 888-1979
gray(dot)ru(at)gmail(dot)com


From: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
To: Sergey Konoplev <gray(dot)ru(at)gmail(dot)com>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: Re: [pgsql-ru-general] индекс по полю JSON без функции
Date: 2013-09-25 22:20:06
Message-ID: 20130925222006.GB4400@vdsl.uvw.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

>> хочу построить по нему индекс
>>
>> CREATE INDEX ON "table" (("field"->>'time'))
>> WHERE ("field"->>'time') IS NOT NULL;
>>
>> но поскольку в SQL запросах хочется оперировать полем time именно как
>> TIMESTAMP (а там CHECKER еще накинут на то что проверяет что time
>> это либо null либо timestamp).
>> то соответственно хочется индекс строить по типу timestamp (иначе
>> после приведения этот индекс не используется)
>>
>> CREATE INDEX ON "table" ((("field"->>'time')::timestamp(0)))
>> WHERE ("field"->>'time') IS NOT NULL;
>>
>> ругается что должно быть immutable.

> immutable cast из text в timestamp(tz) в postgres нет, т.к. результат
> зависит от внешних факторов, таких как time zone сервера (если без tz)
> и DateStyle. Можно написать функцию, например,
> full_iso8601_to_timestamp(text), где будет проверка на то что текст в
> полном ISO 8601 формате (со всем чем можно и таймзоной), тогда это
> будет действительно immutable, и это смело можно будет применять в
> индексах. Либо в соответствии с какой-то другой договорённостью,
> главное чтобы небыло неоднозначностей.

у меня в тех JSON время хранится с зоной

POSIX::strftime('%F %T %z', localtime)

Постгрис зону тут отлично распознает

я просто функцию не хотел городить выделенную.
функции вещь - хреново документируемая.
--

. ''`. Dmitry E. Oboukhov
: :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537


From: Sergey Konoplev <gray(dot)ru(at)gmail(dot)com>
To: "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org>
Cc: pgsql-ru-general <pgsql-ru-general(at)postgresql(dot)org>
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] индекс по полю JSON без функции
Date: 2013-09-25 22:34:55
Message-ID: CAL_0b1uPj-+pWy0yUrvecD3FxTb6=3TaOOBme1yGK7xuD1STdw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-ru-general

2013/9/25 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
>>> CREATE INDEX ON "table" ((("field"->>'time')::timestamp(0)))
>>> WHERE ("field"->>'time') IS NOT NULL;
>>>
>>> ругается что должно быть immutable.
>
>> immutable cast из text в timestamp(tz) в postgres нет, т.к. результат
>> зависит от внешних факторов, таких как time zone сервера (если без tz)
>> и DateStyle. Можно написать функцию, например,
>> full_iso8601_to_timestamp(text), где будет проверка на то что текст в
>> полном ISO 8601 формате (со всем чем можно и таймзоной), тогда это
>> будет действительно immutable, и это смело можно будет применять в
>> индексах. Либо в соответствии с какой-то другой договорённостью,
>> главное чтобы небыло неоднозначностей.
>
> у меня в тех JSON время хранится с зоной
> POSIX::strftime('%F %T %z', localtime)
> Постгрис зону тут отлично распознает
> я просто функцию не хотел городить выделенную.

К сожалению этого не избежать.

--
Kind regards,
Sergey Konoplev
PostgreSQL Consultant and DBA

http://www.linkedin.com/in/grayhemp
+1 (415) 867-9984, +7 (901) 903-0499, +7 (988) 888-1979
gray(dot)ru(at)gmail(dot)com