@pgsql

Страница 971 из 1062
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
->> это сохранение в память, а ::numeric это чтение из памяти
Вообще говоря это преобразование из text в numeric

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

ага

Darafei
06.09.2018
16:08:03
Alexey
06.09.2018
16:08:16
из jsonb в text, из text в numeric
Нет, не jsonb, а json

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

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

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

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
Darafei
06.09.2018
16:22:44
а как их использовать?
('{"a":5.678e-05}'::jsonb->'a')::numeric;

одна, а не две, стрелочки

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
Соответсвенно два примера: select ('{"a":1e-379}'::json->>'a')::numeric; select ('{"a":1e-379}'::jsonb->>'a')::numeric;
Хмм... одинаковые результаты, на первый взгляд. Я чего-то не вижу?

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:10:35
Вот тут про JSON. Не jsonb
И всё равно я не понимаю, о каком случае речь. :( И, далее, причём тут вообще JSONB. ;)

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

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

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

Yaroslav
06.09.2018
17:19:20
Чатик ru_mysql.
Да, вижу, спасибо!

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

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 (не имеет таких типов), но всё равно делает это (а не пользуется текстовым/бинарным представлением) — это они совсем зря. :(

Yaroslav
06.09.2018
17:27:29
речь про jsonb естественно
Да, там используется numeric. Причём тут вообще float?

ну вообще говоря json родом из javascript, так что то, что его иногда имплементируют не так, как в ноде, ещё вопрос чья проблема :)
Ну а PostgreSQL реализует https://tools.ietf.org/html/rfc7159 , так что, к счастью, от плохой наследственности мы избавлены. ;)

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
так что, numeric хоть и не противоречит стандарту, но влечёт "interoperability problems"
Эти проблемы (почти) всегда есть. Типы в базах зачастую вообще "круче", чем в языках программирования общего назначения. Просто во многих приложениях на это широко закрывают глаза. ;)

Google
Yaroslav
06.09.2018
17:38:48
а сколько языков программирования, где есть numeric?
Понятия не имею, естественно. ;) Но вот нет numeric-а очень много где.

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 будет жить. Поприветствуем!

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 и выполняется полностью, вносит запись в заблокированную таблицу, пока первый процесс спит, в итоге первичный ключ перескакивает одно значение. вторая транзакция ждет первую, но не может дождаться Как это решать?

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
Ну, кстати по полнотестовым индексам может быть всё с этим делом ещё хуже. Я как бы в уме НЕ держал, что полнотекстовый от простого отличается, когда отвечал. Там может очень сильно ещё зависить от того, какой критерий поиска в итоге получится, и сможет ли он оптимизироваться. Покажи применый запрос.
SELECT * FROM robjects WHERE MATCH(type) AGAINST ('commercial' IN BOOLEAN MODE) LIMIT 10 Вот так быстро работает SELECT * FROM robjects WHERE MATCH(type) AGAINST ('commercial' IN BOOLEAN MODE) AND ID > 20000 LIMIT 10 Вот так уже на две минуты в зависон уходит. Если ещё один MATCH AGAINST добавить, то вообще трындец.

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

Страница 971 из 1062