|
|
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeМожно, чтобы не переписывать существующий sql-код, пойти ещё дальше - распарсить sql, вытащить из него элементы IN, вставить их во временную таблицу, исправить sql на join или merge, и отдать серверу :) Назачем? "Нормальные герои всегда идут в обход"? (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2013, 23:37:53 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПри чём тут скрипты и код? Пользователи как 1500 записей в гриде выбирают? Наример так: загружают данные за период (условие в where), затем средствами devex-грида фильтруют-сортируют как им вздумается (это уже локально), затем в отфильтрованом выбирают либо инсертом (если им нужно отметить несколько записей), либо нажатием * (инвертировать выделение) с последующим деселектом ненужных записей. Дальше жмётся кнопка, которая делает определённые действия для отмеченых записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 00:45:05 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDee> либо нажатием * (инвертировать выделение) NickDee> Дальше жмётся кнопка Ч.Т.Д. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 00:56:25 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПользователи как 1500 записей в гриде выбирают? поскольку эта песня с 1500 записей вылезает регулярно уже несколько лет, насколько я помню, были следующие объяснения: неправдоподобное - пользователь кликает несколько часов в гриде на чекбоксы правдоподобное - пользователь кликает на элемент группы, автоматически чекаются все "товары подгруппы", таким образом, если 1 клик выбирает 300 элементов, за 5 кликов элементарно набрать 1500 элементов. Но тут не очень непонятно, почему нужно выбирать по элементам, а не по группам. В одной системе через ФБСканер мы отловили ситуацию, когда пользователь своими действиями генерил тучу версий, которые превращались в мусор - типа, набрать заказ, что-то сделать с ним, потом копирнуть результат в другой заказ, а набранный целиком удалить. Т.е. полезное действие мелкое, а версий плодится немеряно. Разработчики не ожидали, что пользователь так будет использовать их функционал, в результате переписали код, по-моему как процедуры, так и приложение. Чтобы оставить пользователю возможность, но не насиловать сервер бессмысленными операциями. Кстати, вот у MS SQL написано Включение очень большого количества значений (много тысяч) в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632. Чтобы избежать этой проблемы, храните элементы списка IN в таблице . при скольких элементах ошибка возникает - не указано. У Оракла (как минимум версии 8) ORA-01795 maximum number of expressions in a list is 1000 у PostgreSQL я вообще не нашел какого-либо описания IN. может ослеп, не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 01:04:44 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDee, понял. Тем не менее, лучи ненависти можешь аналогично посылать Ораклу и Микрософту (см. предыдущее сообщение). И Микрософт тоже говорит - переписывайте на объединение таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 01:05:59 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамNickDee> либо нажатием * (инвертировать выделение) NickDee> Дальше жмётся кнопка Ч.Т.Д. Человеку нужны все документы за период, кроме документов менеджера Иванова, менеджера Петрова, и менеджера Сидорова, и нужно исключить документы без номера. Он выставляет период, снимает в devex-овском фильтре по столбцу "Менеджер" три соответствующих чекбокса, ставит значение "(Не пустые)" в фильтре по столбцу "Номер", и получает на экране то, что ему нужно обработать. Это может быть как 10 записей, так и 10000. Дальше жмёт * и жмёт кнопку обработки. Дальше ты знаешь что происходит :) Особо обращаю твоё внимание, что локальный фильтр в devex-гриде может быть очень навороченым, настолько, что не смапится на sql-условие. А если ещё учесть, что он может быть сделан по вычисляемым на клиенте полям, то задача конвертации фильтра в sql-условие становится в общем виде нерешаемой. Так что остаётся только список ID :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 01:40:19 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
kdvNickDee, понял. Тем не менее, лучи ненависти можешь аналогично посылать Ораклу и Микрософту (см. предыдущее сообщение). И Микрософт тоже говорит - переписывайте на объединение таблиц. Мда... :) Оптимизатору есть из чего догадаться, что вместо развёртывания IN на OR-ы эффективней сделать джойн? А можно ли сделать так, что до 1500 элементов оно работает как сейчас, а после - не падает с ошибкой, а делает виртульный джойн (если он возможен)? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 02:21:10 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeОптимизатору есть из чего догадаться, что вместо развёртывания IN на OR-ы эффективней сделать джойн? с "таблицей в памяти"? Представь себе, что ты вместо ФБ работаешь с Ораклом. И обламываешься на 1000 элементах. Твои действия? p.s. не грузи разработчиков ФБ фигней. У них есть другие, более важные дела. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 02:53:57 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeГаджимурадов РустамNickDee> либо нажатием * (инвертировать выделение) NickDee> Дальше жмётся кнопка Ч.Т.Д. Человеку нужны все документы за период, кроме документов менеджера Иванова, менеджера Петрова, и менеджера Сидорова, и нужно исключить документы без номера. Он выставляет период, снимает в devex-овском фильтре по столбцу "Менеджер" три соответствующих чекбокса, ставит значение "(Не пустые)" в фильтре по столбцу "Номер", и получает на экране то, что ему нужно обработать. Это может быть как 10 записей, так и 10000. Дальше жмёт * и жмёт кнопку обработки. Дальше ты знаешь что происходит :) Особо обращаю твоё внимание, что локальный фильтр в devex-гриде может быть очень навороченым, настолько, что не смапится на sql-условие. А если ещё учесть, что он может быть сделан по вычисляемым на клиенте полям, то задача конвертации фильтра в sql-условие становится в общем виде нерешаемой. Так что остаётся только список ID :) Встречал такую фигню еще у фокспрошников в налоговой. Очень удобно - выбираешь все четные дома улицы + еще два дома + всех Петровых в квартале + одного конкретного Сидорова. Попробуй на досуге представить это в виде IN. Во временной таблице - только ID лицевых счетов. и это работало еще до Путина! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 09:21:17 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeПочему я должен быть ограничен константой в коде? Просто потому что кто-то решил что конкретного N должно хватить на все задачи, доступные к осознанию того кто ставит этот N? :) А если некоторые задачи не подвластны его осознанию? :) т.е. другие причины введения этого ограничения, кроме как природной ограниченности этого "кого-то", ты не мыслишь? Скажем, что могут быть ограничения реализации, связанные с рекурсивностью обработки и статическим ограничением размера стека процесса сервера? И что если этот лимит тупо убрать, то сервер начнет тупо падать. Тебе же оттуда виднее, как лучше, ага. Все вокруг враги, один я д'Артаньян? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 15:47:24 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDee> Человеку нужны все документы за период, кроме NickDee> документов менеджера Иванова, менеджера Петрова, NickDee> и менеджера Сидорова, и нужно исключить документы без номера. Значит, нужно сгенерить соотв. SQL-выражение. NickDee> Это может быть как 10 записей, так и 10000. Именно. Повысив с 1500 до 3000 - упрёшься снова. NickDee> Особо обращаю твоё внимание, что локальный фильтр NickDee> в devex-гриде может быть очень навороченым, настолько, NickDee> что не смапится на sql-условие. А если ещё учесть, что он NickDee> может быть сделан по вычисляемым на клиенте полям, Вообще говоря, это враньё. Не говоря уже о том, что фильтр по локальным полям на клиенте никакого отношения к фильтру по ID на сервере не имеет. Но если лень делать через Where-фильтр, то делай через таблицу, как подсказывают. Или не делай и продолжай вопить дальше. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2013, 16:54:10 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамИменно. Повысив с 1500 до 3000 - упрёшься снова.странно, в форуме давно опубликован "костыль" ака list_to_rows, в котором сей предел задвинут "в хрензнаткуда", а обсуждение несчастного IN все так же горячо. Гаджимурадов РустамПри чём тут скрипты и код? Пользователи как 1500 записей в гриде выбирают?У нас есть фанаты маркетологи, которые могут именно больше тыщи записей в гриде нах***** (простите мой аглицкий, но другое слово хрен подберешь) именно никак не формализуемых записей и потом назначить им "ценовую акцию" или там параметры какие подправить, шоб "продавались веселей". in у нас не канает совсем. Пометки живут в нормальной стационарной (не gtt) таблице, чтоб не потерять "годы труда" на случай если связь глюканет или там клиент по каким-то причинам сдохнет или автор решит "продолжить завтра". фильтров каких только не наделали, вот буквально в пятницу закоммитил очередной патч по фильтрации, но все едино натюкивают тонны записей руками. В общем токмо джойны, только хардкор, никаких полумер ака in !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 10:35:20 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
А что мешает уважаемому NickDee использовать вместо одного несколько in ? Если уж так хочется. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2013, 17:21:33 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDee пишет: > Человеку нужны все документы за период, кроме документов менеджера > Иванова, менеджера Петрова, и менеджера Сидорова, и нужно исключить > документы без номера. Процитированное - это "всё, кроме указанных" А получение результата указанием списка ID - это "только указанные". Как бы 2 большие разницы. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 16:58:42 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Сисдба Мастеркеевич> Процитированное - это "всё, кроме указанных" > А получение результата указанием списка ID - это "только указанные". Это ты знаешь, человек. А программа ИИ не обладает, каким образом сформированы галочки в гриде она не знает (и даже тупо NOT IN не может сделать), посему ТС пошёл по пути меньшего сопротивления. Просто это неуместный плач Ярославны и проблемы не сервера, а тупых горе-пользователей и ленивого разработчика, который хочет переложить проблемы со своих плеч на сервер или кого бы то ни было. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 20:29:34 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов РустамПросто это неуместный плач Ярославны и проблемы не сервера, а тупых горе-пользователей и ленивого разработчика, который хочет переложить проблемы со своих плеч на сервер или кого бы то ни было. Разработчик действительно ленив. Горе-пользователи действительно тупы. Проблемы сервера тут действительно нет :) Почему 256 джойнов? Потому что в байте 8 бит, а восемью битами можно закодировать только 256 значений. Это не ограничение сервера, это ограничение в архитектуре байта :) Тут dmitry недавно д'артаньяна вспоминал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 21:45:38 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDee> Тут dmitry недавно д'артаньяна вспоминал :) В зеркало не пробовал посмотреться? Объясняю ещё раз, последний: 1. Ресурсы не бесконечны, ограничение всё равно будет. Если увеличить с 1500 до 3000 или даже 10000 - это не поможет и лишь уменьшит частоту втыкания в потолок. 2. Есть несколько и нормальных решений и воркэраундов, ты их то ли не видишь/не слышишь, то ли пытаешься проявить какую-то упёртость - с этим сразу в сад. 3. Твоё решение в данном конкретном случае ещё и невыгодно пользователям (с т.з. производительности) - я не проверял, но IN на 10000 в любом случае должен проиграть нормальному Where-фильтру, даже плохо индексированному. Разработчику (тебе) - да, удобно и выгодно, тупо по SelectedRows пробежался, IDшечки в запрос собрал (без параметров, кстати) и готово. Вместо того, чтобы наращивать функциональность фильтров и поисков. У тебя фильтр "в найденном" есть хотя бы, кстати? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 22:13:23 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
> невыгодно пользователям (с т.з. производительности) - > я не проверял, но IN на 10000 в любом случае должен > проиграть нормальному Where-фильтру, даже плохо индексированному Впрочем, нет, тут надо у ДЕ уточнять. Скорее всего, сервер просто соберёт битмап и пройдёт одним проходом. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 22:16:02 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам, не будет одного прохода, будут тормоза :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 22:28:21 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
dimitr> не будет одного прохода, будут тормоза :-) А почему нельзя собрать всё за один (или пачками) проход? А сами записи уже потом извлекать и проверять. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 22:37:36 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Гаджимурадов Рустам Вернёмся к джойнам. Ты представляешь себе что имеет право существовать система из двух таблиц, в которой есть 500 справочников? Все справочники находятся в одной таблице... Наверняка представляешь. А можешь себе представить вторую таблицу, в которой 500 FK на таблицу справочников (или 10 таблиц по 50 полей, но связаных друг с другом по ID 1:1)? А можешь себе представить, что нужно селектнуть запись из таблички с 500 FK, но не просто селектнуть, а с соответствующими значениями из таблицы справочника, причём не какие-то несколько полей, а все 500? Не можешь себе представить как у одной сущности может быть 500FK? Не было таких задач? Не представляешь кому может пригодиться сразу 500 значений? А если представляешь, то знаешь как обойти ограничение в 255 джойнов? Двумя запросами? :) А как это должна обходить какая-нибудь ORM-система с автогенерацией SQL? Никак? А кто сделал больше 255 FK, тот идиот, и задачи у него заведомо идиотские? :) А до скольки FK он ещё не идиот? :) До 255? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 23:17:44 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeА можешь себе представить вторую таблицу, в которой 500 FK на таблицу справочников (или 10 таблиц по 50 полей, но связаных друг с другом по ID 1:1)? Я уверен, что Рустам на своём модераторском веку повидал достаточно идиотов, так что представить себе такого, который не знает как делается связь N:M, он, определённо, сумеет. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 23:22:41 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovNickDeeА можешь себе представить вторую таблицу, в которой 500 FK на таблицу справочников (или 10 таблиц по 50 полей, но связаных друг с другом по ID 1:1)? Я уверен, что Рустам на своём модераторском веку повидал достаточно идиотов, так что представить себе такого, который не знает как делается связь N:M, он, определённо, сумеет. Я про ограничения FB. А ты про что? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 23:39:56 |
|
||
|
500 джойнов и IN
|
|||
|---|---|---|---|
|
#18+
NickDeeЯ про ограничения FB. А ты про что? :) А я про анацефала - проектировщика БД. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.12.2013, 23:51:15 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38500662&tid=1564057]: |
0ms |
get settings: |
9ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
180ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 485ms |

| 0 / 0 |
