
Leonid
23.12.2016
17:25:53

Quet
23.12.2016
17:26:27

Eugene
23.12.2016
17:37:38
Все, кто работал с такими движками подтвердят, что для русского только сфинск

Google

Quet
23.12.2016
17:38:33
ну нет конечно, эластик тоже нормально работает с русским языком

Pavel
23.12.2016
21:30:35

ros
24.12.2016
04:30:24

Pp
26.12.2016
06:39:55
каким способом быстрее делать выборки, через курсоры ("FETCH ...") или через "SELECT ... OFFSET ... LIMIT ..."?

Марк ☢
26.12.2016
07:04:23
Быстрее первое. Но наверно оно капец неудобнее

Vadim
26.12.2016
07:05:20
курсор неудобен? да ладно

Марк ☢
26.12.2016
07:05:48
Ну человеку наверняка надо фронтендик с пажинацией
А курсок надо между запросами из веба хранить гдето

Pp
26.12.2016
07:13:55
а насколько быстрее?
у меня не тот случай, когда фронтенд с пагинацией, но для этой задачи я бы передал курсор фронтенду при создании

Kirill
26.12.2016
07:20:44

Pp
26.12.2016
07:21:41

Kirill
26.12.2016
07:22:22
если вам нужна выборка с лимитом - используйте limit/offset

Google

Alex
26.12.2016
07:22:39
а нужен ли вам курсор ?

Pp
26.12.2016
07:24:23
надо же, столько тонкостей всплывает, я думал это простой вопрос

Kirill
26.12.2016
07:28:13
просто это как "тёплое с мягким"

Pp
26.12.2016
07:29:51

Kirill
26.12.2016
07:33:01
fetch - итератор, limit/offset, внезапно, выборка от и до

Pp
26.12.2016
07:38:56
ага, последовательность select ... offset ... limit ... можно использовать вместо итератора

Kirill
26.12.2016
07:41:23
вместо нельзя, можно вытащить данные кусками
вот смотрите, вы открыли курсор (он итератор) вы можете совершать с ним операции (ходить туда сюда по нему fetch пока его не закрыли (проще пока не закрыли транзакцию), limit/offset нужен когда вам нужно выбрать определенную пачку данных (самый явный пример постраничник или топ чего-то), т.е. достаточно короткая транзакция весь смысл которой получить n записей

Марк ☢
26.12.2016
07:49:11
В постгресе курсоры можно юзать после закрытия транзакции если флажок поставить
Ну и это. Лимит оффсет может несогласованные данные выдавать если делаются в разных трансах ибо между трансами данные могут наменять
С другой стороны, незакрытый курсор жрёт ресурсы
И при рестарте субд превращается в тыкву.
А оффсет и лимит работает всегда и не жрёт
Но опять же если это запрос поверх гроуп бая, то он каждый раз (обычно) будет полностью выполнять операцию перед проделыванием лимит ... офсет

Dmitry
26.12.2016
08:16:58
А можно подробнее про незакрытый курсор и превращение БД в тыкву? Откуда ноги у этой проблемы растут?

ros
26.12.2016
08:51:03
нормальная ли ситуация что запрос повисает навечно при этом жрет проц, если включает в IN подзапрос к несуществующим полям
т.е.
SELECT "F" FROM "Ta" WHERE "FTest" = true;
ERROR: column "FTest" does not exist
но этот висит
SELECT * FROM "Tb" WHERE "Ftb" IN (SELECT "F" FROM "Ta" WHERE "FTest" = true);

Vadim
26.12.2016
08:58:03
Tb большая?

ros
26.12.2016
08:58:56
до 1 млн строк
висело около часа
плюнул и прибил

Аггей
26.12.2016
09:02:00
шт тут использовать убийство ))

Google

ros
26.12.2016
09:02:22
размер "Tb" всего 198 MB

Аггей
26.12.2016
09:02:29
Join? Или Exists на худой конец

ros
26.12.2016
09:03:29
850000

Аггей
26.12.2016
09:04:22
Знаете как работает ваш второй запрос? Выполняется подзапрос - который возвращает тысяч так 100 записей... и каждая строка в таблице TB проверяется на соотвествие кадой строке в подзапросе - фактически это nested loop без оптимизаций

Vadim
26.12.2016
09:04:46

ros
26.12.2016
09:04:53
вообще с SELECT это пример мне изначально нужен был UPDATE "Tb"
при этом SELECT "F" FROM "Ta" WHERE "FTest" = true должен был вернуть около тысячи строк

Аггей
26.12.2016
09:05:27
А какая версия postgres?

Vadim
26.12.2016
09:06:53

ros
26.12.2016
09:07:27
в какая у вас версия pg?

Аггей
26.12.2016
09:08:14
Думаю не 9.6 ли с его параллелизмом?

ros
26.12.2016
09:08:32
у мну на 9.4 это вылезло

Vadim
26.12.2016
09:08:34
9.4.4 у меня

ros
26.12.2016
09:09:18
ii postgresql-9.4 9.4.6-1.pgdg70+1 amd64
попробую ещё на одном инстансе
воспроизводится и на более свежем
ii postgresql-9.4 9.4.7-1.pgdg70+1 amd64

Vadim
26.12.2016
09:12:02
запрос до стадии выполнения не должен доходить, на этапе анализа, какого-то там, падает, даже план запроса не строится

ros
26.12.2016
09:13:05
у мну и план строится)

Vadim
26.12.2016
09:13:09
я попробовал на 9.5.4 x86 другой платфоре. тож падает

Google

Vadim
26.12.2016
09:13:53
значит у тебя существует колонка
может когда запрос упал на другой бд случайно запустил

ros
26.12.2016
09:15:53
нет точно этого поля
пробую локально через psql
в другую БД не мог никак отправить
мож что связаное с типами полей
"Tb"."Ftb" и "Ta"."F" оба uuid
больше у меня мыслей пока нет

Vadim
26.12.2016
09:27:51
да, непонятно

ros
26.12.2016
09:32:36
во интересноее кино если чуть переписать подзапрос
было
SELECT * FROM "Tb" WHERE "Ftb" IN (SELECT "F" FROM "Ta" WHERE "FTest" = true);
стало
SELECT * FROM "Tb" WHERE "Ftb" IN (SELECT "F" FROM "Ta" WHERE "Ta"."FTest" = true);
то все нормально ошибку выхлопывает

Vadim
26.12.2016
09:33:16
ну это говорит лишь о том что ты не к той базе подключаешься
в psql пишешь \с имябд?
ой ступил, не бд же там а таблица сори

ros
26.12.2016
09:35:44
к той
вот реальные запросы
phone=# select * from "HistoryOfServiceTreatments" WHERE "ServiceTreatmentID" IN (SELECT "ServiceTreatmentID" FROM "HistoryOfChat_AppointedSpecs" WHERE "HistoryOfChat_AppointedSpecs"."AnyComments" = 't');
ОШИБКА: колонка HistoryOfChat_AppointedSpecs.AnyComments не существует
LINE 1: ...mentID" FROM "HistoryOfChat_AppointedSpecs" WHERE "HistoryOf...
^
phone=# select * from "HistoryOfServiceTreatments" WHERE "ServiceTreatmentID" IN (SELECT "ServiceTreatmentID" FROM "HistoryOfChat_AppointedSpecs" WHERE "AnyComments" = 't');
^CCancel request sent
второй отменен

Vadim
26.12.2016
09:37:34
значит у тебя поле FTest
есть в таблице основного запроса Tb

ros
26.12.2016
09:37:49
есть подозрение в "HistoryOfServiceTreatments" тоже есть поле "AnyComments"
собсно в него значения из старой таблицы и надо было перенести
но немного с миграции перестарались и удалили "AnyComments" из "HistoryOfChat_AppointedSpecs" ранше
@Cloud66, опередили)

Vadim
26.12.2016
09:38:17
да я проверил, парсинг запроса проходит если поле есть в другой таблице

ros
26.12.2016
09:38:46
так это считается ошибкой или я дурак?

Vadim
26.12.2016
09:39:15
вообще конечно косяк постгреса
я думал он ошибку выдавать должен, там вроде строго всегда надо было к колонке псевдоним таблицы указывать.
а оказывается нет

Google

Vadim
26.12.2016
09:41:03
именно из-за подзапроса видимо, если в одном запросе в куче джойнов будут одинаковые колонки то он ошибку выкинет навернго

ros
26.12.2016
09:42:21
ладно, спасибо
теперь буду старяться не пренебрегать алиасами

Аггей
26.12.2016
09:45:05
Точно так же поведет себя тот же oracle

Vadim
26.12.2016
09:45:45
потому что ранее такое поведение посчитали багом

Аггей
26.12.2016
09:46:15
Щас попробую )) Есть под рукой 11.2.0.4

Vadim
26.12.2016
09:46:40
хотя важен именно подзапрос
в жойнах точно будет ошибка

Аггей
26.12.2016
09:47:38
Щас сделаю именно как описано

Vadim
26.12.2016
09:56:25
да че там
да в оракле тоже нет ошибки)

Аггей
26.12.2016
09:58:19
https://gyazo.com/0be1ca5414ebb01b430dc67e2420af86

Vadim
26.12.2016
09:58:35
да, я и на 12ом проверил

Аггей
26.12.2016
09:58:41
https://gyazo.com/d6f319f62a02d968b25c965b828a6eff
А долго висит в постгре - как раз из-за NL

Vadim
26.12.2016
09:59:19
ну да, это понятно