|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Доброго вечера,подскажите пожалуйста как сделать запрос типо такого Код: plsql 1.
Нужно чтобы в результирующем наборе были только те записи,чей channel_type удовлетворяет строго всем типам из входящих аргументов,а не одному из как было бы в случае с таким запросом Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2021, 19:50 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79 Доброго вечера,подскажите пожалуйста как сделать запрос типо такого Код: plsql 1.
Нужно чтобы в результирующем наборе были только те записи,чей channel_type удовлетворяет строго всем типам из входящих аргументов,а не одному из как было бы в случае с таким запросом Код: plsql 1.
из вашего не очень понятного описания я бы предположил такой вариант Код: sql 1. 2. 3. 4. 5.
-- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 00:06 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk, такой вариант не подойдет,так как на вход в фильтр подается список значений тоесть в результирующем наборе должны быть только те записи,которые имеют все перечисленные в списке типы и заранее никто не знает количество элементов в этом списке ,только тип - строка. Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:48 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79 на вход в фильтр подается список значений Это строка типа Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:51 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
court asv79 на вход в фильтр подается список значений Это строка типа Код: sql 1.
? нет,это набор строковых значений- передается из java в формате List<String> тоесть будет Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 09:57 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Сейчас я изобразил вот такой вариант Код: plsql 1. 2. 3.
где на вход будет подаваться 'SMS,PUSH,EMAIL,....etc' в виде строки но мне это не очень подходит изза постфильтра - записей достаточно много и тащить их все из бд,затем накладывать having не очень хорошая идея ну и конечно не хочется преобразоывать список в строку типа 'SMS,PUSH,EMAIL,....etc' - проблем с этим нет,но это тоже не очень привествуется ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:02 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79 Maxim Boguk, такой вариант не подойдет,так как на вход в фильтр подается список значений тоесть в результирующем наборе должны быть только те записи,которые имеют все перечисленные в списке типы и заранее никто не знает количество элементов в этом списке ,только тип - строка. Код: plsql 1.
Какие то проблемы сгенерировать нужное количество EXISTS в запросе? Основной вопрос - вам вообще на производительность запроса наплевать? Если на скорость работы наплевать то вариантов много можно придумать конечно. Если нет то вариант с N exits будет скорее всего самым быстрым. Ну и вопрос вам вообще что хочется - минимальный обьем програмирования или максимальная производительность в целом? -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:09 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Вариант с exists выглядит очень даже. Просто в джава-коде надо пришедший список с channel_type не передавать в запрос как есть, а для каждого элемента делать and exists в запросе. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:10 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk asv79 Maxim Boguk, такой вариант не подойдет,так как на вход в фильтр подается список значений тоесть в результирующем наборе должны быть только те записи,которые имеют все перечисленные в списке типы и заранее никто не знает количество элементов в этом списке ,только тип - строка. Код: plsql 1.
Какие то проблемы сгенерировать нужное количество EXISTS в запросе? Основной вопрос - вам вообще на производительность запроса наплевать? Если на скорость работы наплевать то вариантов много можно придумать конечно. Если нет то вариант с N exits будет скорее всего самым быстрым. Ну и вопрос вам вообще что хочется - минимальный обьем програмирования или максимальная производительность в целом? -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru производительность на первом месте ,подскажите пожалуйста как это будет выглядеть с генерацией EXISTS при условии что будет подаваться на вход List<String> либо вы предлагаете сделать это в джава коде?в джава коде проблем вроде быть не должно с этим спасибо за идею ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:21 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Предполагаю, что channel_type буквально десяток в прыжке разных. Если есть уникальный индекс person_channel (person_id, channel_type) то можно сделать Код: sql 1. 2. 3.
offset по числу значений в списке -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 10:29 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Melkij Предполагаю, что channel_type буквально десяток в прыжке разных. Если есть уникальный индекс person_channel (person_id, channel_type) то можно сделать Код: sql 1. 2. 3.
offset по числу значений в списке -1 супер работает все отлично а можно обьяснить принцип по которому данный запрос отрабатывает - я смотрю на него и не очень врубаюсь-тоесть сначала он находит те записи в которых есть хотя бы одно значение из списка ,потом смотрит число вхождений по офсету и выдает совпадение наверх? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:12 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Melkij Предполагаю, что channel_type буквально десяток в прыжке разных. Если есть уникальный индекс person_channel (person_id, channel_type) то можно сделать Код: sql 1. 2. 3.
offset по числу значений в списке -1 а что по производительности? если в таблице будет миллион персон это будет 1 млн подзапросов? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:25 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Melkij Предполагаю, что channel_type буквально десяток в прыжке разных. Если есть уникальный индекс person_channel (person_id, channel_type) то можно сделать Код: sql 1. 2. 3.
offset по числу значений в списке -1 по аналитике не очень этот запрос даже на 800 персонах и всего 10 каналах 2 мс время выполнения правда planning time 0.277 Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 11:40 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79, В ветке по бд все равно что там у вас в java. Вам надо либо сгенерить строку в in. Либо передать таблицу list в хранимку Либо сгенерить временную таблу в сессии бд и заджойнить ее с основной. Смотрите по нагрузочному тесту. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 12:47 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79 а можно обьяснить принцип по которому данный запрос отрабатывает - я смотрю на него и не очень врубаюсь-тоесть сначала он находит те записи в которых есть хотя бы одно значение из списка ,потом смотрит число вхождений по офсету и выдает совпадение наверх? при наличии уникального индекса при условии in (N элементов) после offset N-1 может остаться строка только в том случае, если каждый из N элементов присутствует в выборке. Если хоть даже одно нет - то offset всё проглотит, 0 строк в подзапросе, получим exists() = false asv79 по аналитике не очень этот запрос даже на 800 персонах и всего 10 каналах 2 мс время выполнения Добавьте данных. Ну миллионов 10 строк хотя бы. На таких "объёмах" не имеет смысла ничего смотреть. Если же вам важны именно доли мс и 2мс уже медленно - то клиент-серверные субд вам вовсе не подходят. Латентность сети уже больше времени выполнения самих запросов получается. asv79 если в таблице будет миллион персон это будет 1 млн подзапросов? А зачем вам может понадобиться считать быстро весь миллион персон? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:07 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Melkij, +1 абстрактное время ни о чем не говорит. Да еще без реального набора данных по ТЗ. Самой проблемы пока не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:19 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, на надо ничего там никуда джоинить и тд Код: plsql 1. 2. 3.
динамически буду строить такой запрос в зависимости от количества элементов в ходящем списке и получаю вот такие показатели и что не маловажно в других запросах идет seq сканироание ,в этом же примере оно идесное собственно время меня удовлетворяет и я выберу этот вариант Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:27 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79, >на надо ничего там никуда джоинить и тд = странный вы. Вам дали 4 варианта решения. Джойнить был 4ый. Вы ВЗЯЛИ ПЕРВЫЙ и сказали "не надо ничего там... ))))) LOL ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:33 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79, >собственно время меня удовлетворяет и я выберу этот вариант = выше вам написали, что записей надо поболее. Но вам виднее. Проблем нет. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:37 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Melkij asv79 если в таблице будет миллион персон это будет 1 млн подзапросов? А зачем вам может понадобиться считать быстро весь миллион персон? не понял вопроса? есть миллион записей в таблице и вот мне подсказали ,что запрос ,который вы посоветовали будет делать столько же подзапросов,сколько в таблице записей речь вот про этот ваш запрос Код: java 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:47 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
PetroNotC Sharp asv79, >собственно время меня удовлетворяет и я выберу этот вариант = выше вам написали, что записей надо поболее. Но вам виднее. Проблем нет. Удачи! Так я из того что вы написали вообще ничего не понял вот это например ->надо либо сгенерить строку в in Я понял что вы хотите чтобы я из списка сделал строку типо 'SMS,EMAIL....etc' это не проблема ,а где запрос сам куда это подставить? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 14:54 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79, Дак зачем если ничего не понял отвечать словом НЕТ? )))) Первый пункт это динамический sql Склеиваешь любой запрос. Или в in условие Или Куски подзапросов Код: sql 1. 2. 3.
И так далее. Можно и вьюху генерить на событие вставки записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 16:19 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
asv79, Пятый вариант триггер поставить и перечень SMS,EMAIL....etc' будет всегда автоматом в табле person Смотря что по бизнесу надо. OLAP/OLTP ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2021, 16:21 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Так еще можно попробовать. Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2021, 00:50 |
|
Селект с фильтром,который выдаст только те записи котороые удовлетворяют условию
|
|||
---|---|---|---|
#18+
Maxim Boguk ... вариант с N exits будет скорее всего самым быстрым. это сомнительное утверждение для произвольного N До какого-то порога (допустим, N ~ 7-8) так и будет. Потом я бы ожидал перехода первенства к какому-то другому варианту. Но не факт, что оказавшийся следующим победителем, сохранит лидерство для "слишком больших" N и person_channel Код: sql 1. 2. 3. 4. 5.
здесь exists может либо использоваться в качестве фильтра, либо преобразуется в join В первом случае быстрее начнут "отдаваться строки", во втором, по вероятности, запрос в целом отработает быстрее, при наличии подходящих индексов. Смотрите, функционально этот запрос эквивалентен такому: (а при трансформации в джойн как-то так и будет, с точностью до перестановки порядка таблиц) Код: sql 1. 2. 3. 4. 5. 6.
тогда при добавлении третьего элемента поиска получается вот что: Код: sql 1. 2. 3. 4. 5. 6. 7.
Даже при наличии индексов, деградация производительности такого соединения по мере роста списка поиска, растёт достаточно быстро, чтобы проиграть, в конце концов, какому-то из альтернативных вариантов. Скорее всего, построенному на группировке тем или иным способом.... имхо... PS (типа, в коллекцию) среди вариантов записи реляционного деления встречается и вариант, который в данном случае мог бы быть выписан в таком роде: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
визуально он не похож на многообещающий в плане производительности. Хотя, на средних размерах данных и средней длине списка, может оказаться не сильно и хуже прочих. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2021, 02:38 |
|
|
start [/forum/topic.php?fid=53&msg=40078286&tid=1993940]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 403ms |
0 / 0 |