|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
есть запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
или грубо говоря where А+B+C+D+E для каждых отдельных групп условий есть подходящие индексы, которые перестают работать в случае с OR (стоимость запроса в результате неслабо растет с каждым новым добавлением нового OR) подсказка: разрешено считать отдельными кусками например Код: sql 1. 2. 3. 4. 5. 6. 7.
или грубо говоря where А*B*E который сработает достаточно быстро (AND прекрасно работает по индексам) кто сможет составить алгоритм счета что бы все сработало по индексам и был точный count) сразу скажу что кто догадается то сможет для любого количества OR составить уровнение ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 17:47 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
на вскидку.... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 18:11 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
fte хорошее начало для двух условий, но у вас будет перебор по общему количеству, в случае если есть общие пересечения-) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 18:15 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
нет, вот так правильно.... Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 18:28 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Legushka, `count(*) FILTER (WHERE …)` ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 18:31 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Виноват не intersect a union distinct ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 18:31 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
ладно по двум условиям без лишних pkay: fte ваш способ изначальный был очень близок, поэтому его и берем) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
грубо говоря считаем отдельно: количество строк в таблице А + количество строк в таблице Б минус количество строк в пересечении АиБ слабо теперь решить задачу из шапки? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.09.2017, 19:09 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Legushka, вы предлагаете такой огород городить? а какая у вас примерно селективность условий, т.е. какой процент строк таблицы им удовлетворяет ? нельзя как-то планировщик bitmapor заставить использовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2017, 08:26 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Alexius, вы хитрец и вы тоже уловили фишку) но ладно раскрою секрет более простого решения, что бы огород не был таким страшным) для одного уловия А для двух А + B - AB для трех условий А + B + C - AB - AC - BC + ABC для четырех условий А + B + C + D - AB - AC - BC - AD - BC - BD - CD + ABC + ABD + BCD - ABCD и тд, где например А это отдельно посчитанные count по группе условий А, АB это отдельно посчитанные count по условию А and B АBC это отдельно посчитанные count по условию А and B and C и тд видно что нечетные переборы условий всегда суммируем, четные вычитаем, с каждым новым добавлением OR количество переборов нехило возрастает, но это не так страшно, ведь все условия работают через AND, OR не используется, если есть подходящие индексы то запрос будет летать) удачного всем дня ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2017, 15:05 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
LegushkaAlexius, вы хитрец и вы тоже уловили фишку) но ладно раскрою секрет более простого решения, что бы огород не был таким страшным) ну ты, мальчик, де-Билл. написал то же самое, только в кривых необщепризнанных обозначениях, и радости полные штаны ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2017, 16:02 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Вот прямо сейчас такой запрос полетит. Пять запросов в начальном условии. Пусть каждое условие коснется ~5% данных с возможным небольшим пересечением. При подсчете в лоб читается вся таблица для подсчета ~25% строк. Каждый блок читается один раз. А теперь подглядеть сколько чтений потребуется при предлагаемом хитрож хитроумном подходе с обязательным использованием индексов, и постигаем дзен. Я уж не говорю про поддержку такого кода. Для пятничной задачки еще бы сошло. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.09.2017, 17:58 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Sergei.Agalakov, а если 1% в итоге ? там пж либо пустится в битмап--оры, что решает задачу, теоретиццки -- в ту же цену, и даже дешевле (все эти юнион--иксепты и прочие интерсеки они не задаром). , либо ошибется с планированием, и упадет в фулл-скан. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2017, 10:37 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Я, собственно, спорил с утверждением, что вот такой запрос при наличии индексов просто обязан летать . Ну очень зависит от данных. Вполне возможно построить пример где такой запрос будет быстрее, но как серебрянная пуля для решения поставленной задачи он не годится вообще. Ключевые слова из начального условия 'группа несвязанных условий'. Для произвольных условий, да еще если можно новую группу добавить... Единственное универсальное решение - фулл скан, расслабиться и получить удовольствие. Для частных и фиксированных случаев можно попробовать найти более оптимальное частное решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2017, 19:41 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Sergei.Agalakov, он полетит тогда, когда пж не сумеет учесть неявной корреляции меж условиями. обычно например время факта растет почти монотонно и почти синхронно с суррогатным ид -- счетчиком. и т.п. а пж будет пользоваться моделью независимых условий. и очень быстро вылетит в прогнозах на порядки. а то и порядки порядков.(хотя бы двоичных). и припустится фуллсканить. и ещё у ТС наверняка не всё сказано -- там очень могут где--то лимиты быть в рукаве, при необъявленных, но явно подразумеваемых аппендах по партициям. которые по битмап--орам не просовываются в мердж-аппенды, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.09.2017, 20:29 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
qwwq, Ты исходишь из того, что все условия изначально избирательные. Достаточно одного условия где фулл скан выгоднее, и все остальное уже неважно. Пример с неявной корреляцией работает против индексов. Вот у тебя условие ABCDE, где у каждой колонки избирательность 25%. Постгрес радостно насчитывает что ему надо вернуть 1/1024 от общего количества записей, и промахивается на пару порядков, поскольку в реальности колонки сильно коррелируют. В общем, как я уже говорил, такой подход можно использовать в очень частных случаях заранее известных условий и распределения данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 02:40 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Sergei.Agalakovqwwq, Ты исходишь из того, что все условия изначально избирательные. Достаточно одного условия где фулл скан выгоднее, и все остальное уже неважно. Пример с неявной корреляцией работает против индексов. Вот у тебя условие ABCDE, где у каждой колонки избирательность 25%. Постгрес радостно насчитывает что ему надо вернуть 1/1024 от общего количества записей, и промахивается на пару порядков, поскольку в реальности колонки сильно коррелируют. В общем, как я уже говорил, такой подход можно использовать в очень частных случаях заранее известных условий и распределения данных. это в рамочку и на стену. если не понятно -- смотрим ещё раз на условие OR , а не AND (для которого пж именно так бы и поступил, и сделал бы верно). я понимаю, что вы от быстродумия, а не со зла или по недоумию но радует , как чаплин в луже теперь ещё раз -- для неккорелированных оров пж всё так же считал бы радостно малыми не объединения, а пересечения, т.е. по сути складывал бы прогнозы по орам. когда их 10--ки , и они, на деле сильно кореллированы -- т.е. пересекаются почти полностью -- прогноз ошибёцца в эти самые почти десять раз. (набрать много больше нам вряд ли удасцо). с заключением про частность и заранеесть соглпасен более чем полностью. именно поэтому такие штуки в норме (но пока не в пж) должен делать сам оптимайзер. но, чудится мне, у ТС-а там ещё какие--то часные особости есть, которых мы не знаем. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 11:13 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
qwwq, как зоркей сокол, признаю, что у тс в старте написано не вообще об запросах, но только о count(). полагаю, он имел в виду IOS по хорошо отмапленным(без хип--фетчей) и прогретым индексам . тогда переход на битмап--ор приведет к обязательным хип--фетчам (хотя бы на речек), которые могут быть холодными. и речь, возможно, вообще не про разницу с фулл-сканом, а про смену с IOS на IS+BitmapOr всё имхо, могу врать ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 11:24 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
qwwqSergei.Agalakovqwwq, Ты исходишь из того, что все условия изначально избирательные. Достаточно одного условия где фулл скан выгоднее, и все остальное уже неважно. Пример с неявной корреляцией работает против индексов. Вот у тебя условие ABCDE, где у каждой колонки избирательность 25%. Постгрес радостно насчитывает что ему надо вернуть 1/1024 от общего количества записей, и промахивается на пару порядков, поскольку в реальности колонки сильно коррелируют. В общем, как я уже говорил, такой подход можно использовать в очень частных случаях заранее известных условий и распределения данных. это в рамочку и на стену. если не понятно -- смотрим ещё раз на условие OR , а не AND (для которого пж именно так бы и поступил, и сделал бы верно). И с чего бы это я должен смотреть на OR, когда у автора в решении AND? 20826902 qwwqдля четырех условий А + B + C + D - AB - AC - BC - AD - BC - BD - CD + ABC + ABD + BCD - ABCD и тд, где например А это отдельно посчитанные count по группе условий А, АB это отдельно посчитанные count по условию А and B АBC это отдельно посчитанные count по условию А and B and C и тд qwwqя понимаю, что вы от быстродумия, а не со зла или по недоумию... :^) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 17:49 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Sergei.Agalakov, tsдля каждых отдельных групп условий есть подходящие индексы, которые перестают работать в случае с OR (стоимость запроса в результате неслабо растет с каждым новым добавлением нового OR ) аффтар многа что написаль но вот те "унд" которые у вас -- у него проиндексированы, типа. а вот те "ор" которые у меня -- они у тс в шапке темы, ага. и в стартовом посте, например. т.ч. давайте уже, не задерживайтесь, чоле. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 22:06 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
ps нашел настоящую задачу "на зосыпку" 5052714 посчитать обратную матрицу чистым SQL . с with recursive; filter в window-fun и lateral --ами оно кажеццо уже д.б. близко. всего то 3--уровня лупов надо реализовать. начать с 5050997 дополнить расчетным столбцом E --диагональной, и пихать по жордану свою в диагональ, а E в искомую. есть дартаньяны ? насколь скл стал полным языком коддинга, проверить. а то большие матрички в питоне не считаются. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2017, 22:21 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
Legushkaдля каждых отдельных групп условий есть подходящие индексы, которые перестают работать в случае с ORНе перестают. BitmapOr отлично работает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2017, 14:42 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
LeXa NalBat, там разница в буферах набегает для IOS vs IS Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
для холодных данных это весьма будет заметно ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2017, 16:15 |
|
задача на засыпку, count работающий по индексам (в where есть несколько условий через OR)
|
|||
---|---|---|---|
#18+
LeXa NalBat, а если в группе условий А, B, С... участвует subplan ? видимо из за этого в "моем" персональном случае использования буферов накрутило ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 10:26 |
|
|
start [/forum/topic.php?fid=53&fpage=65&tid=1996193]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 290ms |
total: | 476ms |
0 / 0 |