
S
06.09.2018
16:06:09
чем другая?

Alexey
06.09.2018
16:06:21
Тем, что я не сохраняю никуда и потом не читаю

S
06.09.2018
16:06:30
сдрастье
->> это сохранение в память, а ::numeric это чтение из памяти

Google

S
06.09.2018
16:07:11
там теже функции вызываются что при pg_dump

Alexey
06.09.2018
16:07:30

S
06.09.2018
16:07:35
только вместо файла — строка в памяти
ага

Darafei
06.09.2018
16:08:03

Alexey
06.09.2018
16:08:16

Darafei
06.09.2018
16:08:20
осталось доказать что оба преобразования не теряют данные

Alexey
06.09.2018
16:08:39
Я понял, что с jsonb могут быть проблемы, так как он хранит как числа

S
06.09.2018
16:09:36
для json должно быть норм, там же нет двойного преобразования, просто однократный numeric из текста

Alexey
06.09.2018
16:09:50

Darafei
06.09.2018
16:10:25
как минимум json::text::numeric::text != json::text

S
06.09.2018
16:10:54
угу

Alexey
06.09.2018
16:10:57
Окей, не спорю здесь

Google

S
06.09.2018
16:21:30

Darafei
06.09.2018
16:22:44
одна, а не две, стрелочки

S
06.09.2018
16:23:00
а, ясно

Yaroslav
06.09.2018
16:58:35

Alexey
06.09.2018
16:59:24
Проблемы могут быть в преобразовании jsonb->text->numeric.
Если я правильно понял, то мы все сошлись, что json->text->numeric норм.

Yaroslav
06.09.2018
17:00:45

Alexey
06.09.2018
17:01:33
Соответсвенно два примера:
select ('{"a":1e-379}'::json->>'a')::numeric;
select ('{"a":1e-379}'::jsonb->>'a')::numeric;

Yaroslav
06.09.2018
17:03:37

Alexey
06.09.2018
17:03:59
Эмм... я сказал, что "могут быть". Примера я такого не знаю.

Yaroslav
06.09.2018
17:04:48

Alexey
06.09.2018
17:07:15
Вот была такая фраза. Я зацепился за неё.
вот и я про json. оно неявно конвертировало числа сначала в текст, а потом в число. что чревато проблемами как раз с плавающей точкой

Yaroslav
06.09.2018
17:08:16

Alexey
06.09.2018
17:08:40

Yaroslav
06.09.2018
17:10:35

Alexey
06.09.2018
17:10:59
jsonb мы здесь просто так затронули

Google

Alexey
06.09.2018
17:12:22
Вообщем я понял, что тот Алексей Копытов сначала сказал о какой-то страшной проблеме. А потом всё свёл к тому, что есть доп. преобразования, которые замедляют работу. Хотя изначально посыл был такой, что там есть проблемы с плавающей точкой.

Yaroslav
06.09.2018
17:17:00

Alexey
06.09.2018
17:17:17
Чатик ru_mysql.

Yaroslav
06.09.2018
17:19:20

Darafei
06.09.2018
17:21:03
c json в куче мест есть проблема с тем, что число там в большинстве имплементаций - double

Yaroslav
06.09.2018
17:21:29
Ну а PostgreSQL-то тут причём? ;)

Darafei
06.09.2018
17:22:01
ну вот драйвер постгреса в ноде такой

Alexey
06.09.2018
17:22:51
а PostgreSQL тут при том, что умеет конвертировать float8 -> text, float8 -> numeric и обратно только с потерями. подробности здесь: https://www.postgresql.org/message-id/flat/5A937D7E.60305%40anastigmatix.net

Darafei
06.09.2018
17:24:18

Alexey
06.09.2018
17:24:34
речь про jsonb естественно

Alexey
06.09.2018
17:25:07
конечно там разговор был вовсе не об этом

Yaroslav
06.09.2018
17:25:26
ну вот драйвер постгреса в ноде такой
Проблемы "ноды", нет? ;) Вообще, если какой-то "клиентский" язык / API не умеет преобразовывать типы из базы в свои 1:1 (не имеет таких типов), но всё равно делает это (а не пользуется текстовым/бинарным представлением) — это они совсем зря. :(

Darafei
06.09.2018
17:25:28

Yaroslav
06.09.2018
17:27:29


Alexey
06.09.2018
17:32:15
и вот прямо по этой ссылочке написано: "This specification allows implementations to set limits on the range
and precision of numbers accepted. Since software that implements
IEEE 754-2008 binary64 (double precision) numbers [IEEE754] is
generally available and widely used, good interoperability can be
achieved by implementations that expect no more precision or range
than these provide, in the sense that implementations will
approximate JSON numbers within the expected precision."
так что, numeric хоть и не противоречит стандарту, но влечёт "interoperability problems"
хотя да, снимаю свои комментарии про точность. проблема с производительностью остаётся актуальной до pg11

Yaroslav
06.09.2018
17:34:30

Google

Alexey
06.09.2018
17:37:45

Yaroslav
06.09.2018
17:38:48

Alexey
06.09.2018
17:41:23
о том и речь

Alexey
06.09.2018
17:48:24
Да, я перечитал. Там действительно разговор был про jsonb. Просто иногда в примеры писались с json, что меня смутило.

Yaroslav
06.09.2018
17:49:33
о том и речь
Ну так СУБД зачастую разрабатывают те, кому нравятся более мощные типы...
(И, по идее, они даже умеют с ними работать.) ;)

Alexey
06.09.2018
18:50:34
<и тут должен быть холивар на тему "мощности" numeric и определения "мощности" типов данных вообще, но лень>

Yaroslav
06.09.2018
18:52:52
Неужели Вы из этого смогли бы устроить holywar? ;)

Alexey
06.09.2018
18:55:04
<и здесь должен быть холивар про холивар, но лень>

‡•¡•‡
07.09.2018
00:17:12
https://www.bestchange.ru/?p=817980

Alexander
07.09.2018
00:26:52
#spam

Terminator
07.09.2018
04:06:33
@shahzodshafizod будет жить. Поприветствуем!

Shahzod
07.09.2018
04:07:34
интересный бот

Eagle Owl
07.09.2018
07:42:19
Извиняюсь если оффтоп немного. Есть MySQL InnoDB таблица с 23 миллионами записей и 16 гигами на винчестере. У неё десяток с лишним полей имеют тип longtext, и на них full-text индексы. Если делать поиск только по одному из этих полей, работает ок. Если я полнотекстовый поиск комбинирую, например с WHERE ID > 20000, в лучшем случае 2 минуты запрос занимает, в худшем, вылетает с ошибкой, что не хватает памяти. Тут можно что-нибудь сделать, или надо переходить на NoSQL?
Вот тут более подробно https://dba.stackexchange.com/questions/216978/mysql-innodb-full-text-search-is-very-slow-when-combined-with-other-filters

Terminator
07.09.2018
07:43:51
Mike будет жить. Поприветствуем!

Ilia
07.09.2018
07:45:17

Eagle Owl
07.09.2018
07:45:43
А в какую сторону копать тогда?


Ilia
07.09.2018
07:51:13
Извиняюсь если оффтоп немного. Есть MySQL InnoDB таблица с 23 миллионами записей и 16 гигами на винчестере. У неё десяток с лишним полей имеют тип longtext, и на них full-text индексы. Если делать поиск только по одному из этих полей, работает ок. Если я полнотекстовый поиск комбинирую, например с WHERE ID > 20000, в лучшем случае 2 минуты запрос занимает, в худшем, вылетает с ошибкой, что не хватает памяти. Тут можно что-нибудь сделать, или надо переходить на NoSQL?
Суть в том, что если ты ищешь по одному индексу, то у тебя (если всё ок) тупо работает поиск по индексу, который при хорошем стечении обстоятельств (большой селективности критерия отбора) даст тебе мало записей, и соотв. всё ок.
А если ты используешь два индекса, то во-первых, селективность критерия отбора разбивается на две части, и поскольку селективность совокупности критериев это произведение отдельных селективностей, а селективность части из совокупности критериев, наоборот, частное, то селективность в этом случае очень резко падает , т.е. критерий поиска по одному индексу даёт тебе резко (на порядки) больше записей.
во-вторых, поскольку используется несколько индексов, то даже если СУБД умеет использовать несколько индексов в запросе, то она должна сделать сначала поиск по одному, затем по другому, потом сделать пересечение двух множеств, производительность этой операции не самая лучшая в мире. Т.е. это всё будет медленно во всех случаях.
NoSQL тут ничего не решает, там всё то же самое, только без SQL.


Eagle Owl
07.09.2018
07:52:31
Понятно, спасибо. И это вообще никак не лечится? Там не знаю, SSD поставить, хадуп-кластер какой-нибудь.
Понятно, что наверно по железу вложиться придётся, раз база такая здоровая в плане текста.

Google


Ilia
07.09.2018
07:53:09
Суть в том, что если ты ищешь по одному индексу, то у тебя (если всё ок) тупо работает поиск по индексу, который при хорошем стечении обстоятельств (большой селективности критерия отбора) даст тебе мало записей, и соотв. всё ок.
А если ты используешь два индекса, то во-первых, селективность критерия отбора разбивается на две части, и поскольку селективность совокупности критериев это произведение отдельных селективностей, а селективность части из совокупности критериев, наоборот, частное, то селективность в этом случае очень резко падает , т.е. критерий поиска по одному индексу даёт тебе резко (на порядки) больше записей.
во-вторых, поскольку используется несколько индексов, то даже если СУБД умеет использовать несколько индексов в запросе, то она должна сделать сначала поиск по одному, затем по другому, потом сделать пересечение двух множеств, производительность этой операции не самая лучшая в мире. Т.е. это всё будет медленно во всех случаях.
NoSQL тут ничего не решает, там всё то же самое, только без SQL.
А если СУБД не умеет более одного индекса на таблицу использовать (это 80% всех СУБД), то у тебя будет браться один индекс, и одна из двух селективностей по нему, плохая, в соотв. с пунктом (1) вышеизложенного.
Тоже хреново.


Eagle Owl
07.09.2018
07:54:37
Всмысле не делать базы подобной структуры?)

Ilia
07.09.2018
07:56:44
Понятно, спасибо. И это вообще никак не лечится? Там не знаю, SSD поставить, хадуп-кластер какой-нибудь.
Обычно денормализуют данные, сваливают всё в одно поле, но так, чтобы можно было искать, естественно, и делают индек на неё.
Если о РБД говорить, то это был бы индекс на фукнцию использующий поля из двух таблиц.
А тут надо слить это в одно поле, но так, чтобы ты знал, где данные из какого, естественно.
Например, если это xml, то сделать два-три подкорневых элемента с именами подполей, отражающих имена исходных полей, и задействовать эти имена в поиске.

Eagle Owl
07.09.2018
07:57:20
Понял, спасибо огромное.

Артем
07.09.2018
07:59:20
Всем привет! А кто разбирается в блокировках таблиц у постгреса? Запускаю два процесса по очереди, в обоих стоит блокировка таблицы, в первом слип на 60 секунд, во втором - уже нет. Второй ждет секунд 30 и выполняется полностью, вносит запись в заблокированную таблицу, пока первый процесс спит, в итоге первичный ключ перескакивает одно значение.
вторая транзакция ждет первую, но не может дождаться
Как это решать?


Eagle Owl
07.09.2018
08:01:19
Обычно денормализуют данные, сваливают всё в одно поле, но так, чтобы можно было искать, естественно, и делают индек на неё.
Если о РБД говорить, то это был бы индекс на фукнцию использующий поля из двух таблиц.
А тут надо слить это в одно поле, но так, чтобы ты знал, где данные из какого, естественно.
Например, если это xml, то сделать два-три подкорневых элемента с именами подполей, отражающих имена исходных полей, и задействовать эти имена в поиске.
Последний глупый вопрос: я все поисковые поля солью в одну колонку, повешу индекс на неё, структурирую, допустим. А есть вторая колонка числовая Area. Получается, что отбор на две части разобьётся, и что в лоб, что по лбу будет.


Vadim
07.09.2018
08:01:21
ребят. Подскажите, как данный запрос можно оптимизировать для большого колличества записей
SELECT intAutoID AS intLastMessageID
FROM (
SELECT intAutoID, COUNT(1), MAX(datSentDate)
, intSenderID, intReceiverID, CONCAT(LEAST(intSenderID, intReceiverID), ":", GREATEST(intSenderID, intReceiverID)
)
AS roomkey FROM tblmessages
WHERE intSenderID != intReceiverID
GROUP BY roomkey ORDER BY intSenderID)
AS custom;

Ilia
07.09.2018
08:03:08
Понял, спасибо огромное.
Ну, кстати по полнотестовым индексам может быть всё с этим делом ещё хуже. Я как бы в уме НЕ держал, что полнотекстовый от простого отличается, когда отвечал.
Там может очень сильно ещё зависить от того, какой критерий поиска в итоге получится, и сможет ли он оптимизироваться.
Покажи применый запрос.

Eagle Owl
07.09.2018
08:04:45

Eugeny
07.09.2018
08:04:53

Vadim
07.09.2018
08:06:40
нужно получить уникальные записи по senderID и receiverID. Одну запись по intAutoID(уникальную). Запрос правильно работает. Но для больших данных очень долго


Ilia
07.09.2018
08:07:24
Последний глупый вопрос: я все поисковые поля солью в одну колонку, повешу индекс на неё, структурирую, допустим. А есть вторая колонка числовая Area. Получается, что отбор на две части разобьётся, и что в лоб, что по лбу будет.
Зависит от селективности критерия отбора.
Если селективность по полнотекстовому будет большая, а иначе и делать это всё бесссмысленно, то что там будет во вторичных фильтрах -- да по барабану. Ну выйдет у тебя из индекса не 10 строк, а 30, и 2/3 потом уберётся за счёт доп-условий. Ну, всё равно производительность хорошая будет.
ребят. Подскажите, как данный запрос можно оптимизировать для большого колличества записей
Для начала GROUB BY нормально напиши.
SELECT intAutoID, COUNT(1), MAX(datSentDate)
, intSenderID, intReceiverID, CONCAT(LEAST(intSenderID, intReceiverID), ":", GREATEST(intSenderID, intReceiverID)
)
AS roomkey FROM tblmessages
WHERE intSenderID != intReceiverID
GROUP BY roomkey ORDER BY intSenderID
Для начала GROUB BY нормально напиши.
SELECT intAutoID, COUNT(1), MAX(datSentDate)
, intSenderID, intReceiverID, CONCAT(LEAST(intSenderID, intReceiverID), ":", GREATEST(intSenderID, intReceiverID)
)
AS roomkey FROM tblmessages
WHERE intSenderID != intReceiverID
GROUP BY roomkey ORDER BY intSenderID
Парни, а что , такую лабуду PG даёт запускать?
Я что-то уже не помню, но мне казалось, что в PG с этим строго.