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