powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 500 джойнов и IN
25 сообщений из 88, страница 1 из 4
500 джойнов и IN
    #38492477
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladТаблоидчто такое "контекст" ?Во время выполнения запрос вычисляет и хранит состояние каждого потока данных (таблицы в простейшем случае).
Грубо говоря - текущую запись из каждого потока.
Операторы BLR принимают номера потоков (контекстов) как параметры.
Номер контекста кодируется 1 байтом, отсюда ограничение.
Т.е. если какой-нибудь генератор sql-кода сгенерит 256 джойнов одним селектом, то всё пропало?
Если это так, то можно ли отодвинуть это ограничение хотя бы до размера word?

У меня вот 175 джойнов генерится, при этом вытаскиваются 560 полей из примерно 30 таблиц. Это для печати отчёта. Лишних полей там нет, т.е. они либо печатаются, либо участвуют в вычислениях в отчёте. Это не табличный отчёт, а одностраничный документ с детальными характеристиками покупаемого изделия (много цифр, много букв).
И запрос уже на 45 килобайт... Простой селект одной записи с кучей джойнов.

И я вполне допускаю, что со временем система может перешагнуть и через 64K на этом запросе, и через 256 джойнов.
Я могу конечно запрос побить на два, причём прозрачно для отчётера (fastreport), на уровне кода сервера приложений. Но имхо универсальней будет убрать ограничение в дальние дали :)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492483
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

для Fb3 ограничение в 64K на длину запроса сняли. А вот ограничения на контексты не трогали.

dimitr, hvlad

интересно а вот в таком запросе

Код: sql
1.
select * from sp_myproc(1) 



количество контекстов будет равно 1 или 1 + количество контекстов из ХП?
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492493
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> Т.е. если какой-нибудь генератор sql-кода сгенерит
NickDee> 256 джойнов одним селектом, то всё пропало?

Почему всё пропало? Ни с сервером, ни с БД
ничего не происходит, а запрос не выполнится, да.

Симонов Денис> количество контекстов будет равно 1
Симонов Денис> или 1 + количество контекстов из ХП?

По логике вещей должно быть, конечно, 1,
ибо внутри ХП - свой отдельный контекст.
Иначе мы все давно наступили бы на это
ограничение из-за больших/вложенных ХП.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492503
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladNickDeeможно ли отодвинуть это ограничение хотя бы до размера word?Нет.
Что-то поломается?
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492522
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамNickDee> Т.е. если какой-нибудь генератор sql-кода сгенерит
NickDee> 256 джойнов одним селектом, то всё пропало?

Почему всё пропало? Ни с сервером, ни с БД
ничего не происходит, а запрос не выполнится, да.

Вот представь, что у тебя есть табличка, в которой среди прочих есть четыре поля: FirstDocId, SecondDocId, ThirdDocId, FourthDocId (ссылаются на одну табличку Docs). И у тебя есть вьюшка по таблице.
И вот тебе говорят, что во вьюшку нужно добавить четыре поля:
FirstDocId.ManagerId.ServerId.DealerId.CountryId.Name
SecondDocId.ManagerId.ServerId.DealerId.CountryId.Name
ThirdDocId.ManagerId.ServerId.DealerId.CountryId.Name
FourthDocId.ManagerId.ServerId.DealerId.CountryId.Name

Каждое такое поле развернётся в 5 joins, итого +20.

Понятно что имея инструмент, который позволяет строить такие вьюшки на раз-да, без написания sql вручную, то можно вполне наступить на ограничение в 256 joins на сложных базах.
У меня база совсем не сложная по структуре, а 175 joins на запрос уже есть.
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492525
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeВот представь, что у тебя есть табличка, в которой среди прочих есть четыре
поля: FirstDocId, SecondDocId, ThirdDocId, FourthDocId (ссылаются на одну табличку Docs).
И у тебя есть вьюшка по таблице.
"Вот представь, что у разработчика БД нет головного мозга, совсем. А у программиста
приложения руки растут из задницы."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492535
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> Вот представь

Зачем? Способов создать себе проблемы я итак больше тебя знаю.

Не надо плодить плохие вьюшки/ХП, а если наплодил - не
надо удивляться, что они потом плохо/медленно работают.
AFAIU, основной "законный" способ получить сабж - это
различные графические построители запросов/отчетов, но
лично я на это ограничение и там не натыкался - юзеры,
видимо, тоже не могут удержать в голове/на экране такое
количество инфы, колонок, полей и пр.

Повторюсь, ничего не "пропало". Запрос не сработает, да.
Сервер не упадёт, БД не порушится. Ура. А недовольные
пользователи вызовут "программиста", который налабает
им SQL-запрос, работающий на два порядка быстрее их
мышетыкательного варианта, даже если бы он взлетел.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492623
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамNickDee> Вот представь

Зачем? Способов создать себе проблемы я итак больше тебя знаю.

Проблем нет, пока ты не наступаешь на ограничение.
Вот начинаешь работать с движком БД, а там - то ограничение на количество элементов в IN, то на размер стейтмента, то на размер таблицы, то на длину имени поля, то на суммарный размер всех полей в таблице.

Лично я наступил на ограничение с IN, на размер стейтмента, на ограничение длины поля. Пришлось выкручиваться.

Спрашиваешь - почему бы не изменить такое поведение? В ответ получаешь телегу как правильно писать. В том-то и дело, что писать надо так, чтобы не создавать глупых ограничений :) А если они унаследованы из чужого кода, и пользователи просят изменить ограничение пока никто не наступил, то почему это просто не сделать?
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492627
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeА если они унаследованы из чужого кода, и пользователи просят изменить ограничение пока никто не наступил, то почему это просто не сделать?Может потому, что это НЕ просто сделать ?
Может потому, что это нужно 1% тех самых пользователей ?
Может потому, что нужно научиться работать с чем-то, и не наступать на ограничения, как остальные 99% ?
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492629
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeСпрашиваешь - почему бы не изменить такое поведение? В ответ получаешь телегу как правильно писать
дай вам волю, вы процедуры по 10 мегабайт писать будете.

NickDeeто почему это просто не сделать?
потому что ряд подобных изменений требует изменений в движке, которые могут повлиять неизвестно на что. И потому что не бывает софта без ограничений. Всегда есть какой-то лимит, и всегда на этот лимит кто-то наступит, обязательно.
Есть лимиты старые, которые можно или легко или с определенными усилиями изменить. И они меняются. Например, 36 гиг на одну таблицу, разрядность генератора, Next transaction, ... Ну растут данные, что поделать. Но есть определенные лимиты, которые выходят за здравый смысл.
Например, размер оператора. В ЯП ведь уже много лет есть правило - размер процедуры не должен превышать размер экрана (допустим, 120 строк). Почему в SQL это можно "нарушать"?
А с IN - насколько бы тебе его увеличить хотелось? 2500? 5000? 10000? Я гарантирую, что после увеличения до 10к обязательно тут же кто то на это наступит.
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492645
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvNickDeeСпрашиваешь - почему бы не изменить такое поведение? В ответ получаешь телегу как правильно писать
дай вам волю, вы процедуры по 10 мегабайт писать будете.

И что конкретно тебя в этом пугает? :) Ну будут у меня стейтменты по 10 мегабайт, или по сто. Мне так удобно, и мне с ними жить :)
Почему я должен быть ограничен константой в коде? Просто потому что кто-то решил что конкретного N должно хватить на все задачи, доступные к осознанию того кто ставит этот N? :) А если некоторые задачи не подвластны его осознанию? :)

kdvNickDeeто почему это просто не сделать?
потому что ряд подобных изменений требует изменений в движке, которые могут повлиять неизвестно на что. И потому что не бывает софта без ограничений. Всегда есть какой-то лимит, и всегда на этот лимит кто-то наступит, обязательно.
Есть лимиты старые, которые можно или легко или с определенными усилиями изменить. И они меняются. Например, 36 гиг на одну таблицу, разрядность генератора, Next transaction, ... Ну растут данные, что поделать. Но есть определенные лимиты, которые выходят за здравый смысл.
Например, размер оператора. В ЯП ведь уже много лет есть правило - размер процедуры не должен превышать размер экрана (допустим, 120 строк). Почему в SQL это можно "нарушать"?

Потому что стейтменты могут быть сгенерённые. Собственно при генерации кода для триггера я и наступил на ограничение.

kdvА с IN - насколько бы тебе его увеличить хотелось? 2500? 5000? 10000? Я гарантирую, что после увеличения до 10к обязательно тут же кто то на это наступит.
Я наступил на 1500. И естественно это была автогенерация кода :) Пользователь в гриде выделял записи, и я их для групповой обработки вставлял в "where ID in (...)".
Ограничение должно быть как можно выше, и я бы не стал ограничиваться размером WORD. Пусть работает медленней, пусть противоречит чьей-то девелоперской совести, но пусть работает... это уже будет выбор того, кто это использует.
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492684
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee,

Ну так возьми да и сделай, раз все так просто.
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492688
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПользователь в гриде выделял записи, и я их для групповой обработки вставлял
в "where ID in (...)".
Потому что использовать для этого временную таблицу у тебя не хватило... чего?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492704
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeПользователь в гриде выделял записи, и я их для групповой обработки вставлял
в "where ID in (...)".
Потому что использовать для этого временную таблицу у тебя не хватило... чего?

Ты сейчас спрашиваешь о том, почему я вместо того чтобы написать простой "where ID in (...)", не создал временную таблицу, потом не сделал в неё N инсертов, а потом не написал "where Id in select from ..."? :) Ты сейчас про это спрашиваешь? :)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492725
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeТы сейчас про это спрашиваешь? :)

Именно так. Только не in, а join.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492743
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeТы сейчас про это спрашиваешь? :)

Именно так. Только не in, а join.

если делать с джойном, то тогда лучше без временной таблицы. Мы это тут обсуждали пять лет назад: 6343890 :)
Но это настоящий изврат, правда меньший чем с инсертами :) Быстро работает, да. Но изврат :)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492750
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeесли делать с джойном, то тогда лучше без временной таблицы.
Нет, не лучше. Во-первых, более сложный код на клиенте. Во-вторых, более сложный код на
сервере.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492769
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeесли делать с джойном, то тогда лучше без временной таблицы. Мы это тут обсуждали пять лет назад: 6343890 :)
Но это настоящий изврат, правда меньший чем с инсертами :) Быстро работает, да. Но изврат :)0xFF.
2 NickDee: ты там разбиваешь список ИДшников на "слова" и выдаёшь из процедуры наружу отдельные ИДшники - я правильно понимаю ?
Что делает с входным блобом (IntStr) твоя УДФ CreateIntList(IntStr, ListId, Cnt) ? И откудова вытаскивает ID'шник вот эта штука: ValueInList(ListId, I, V) ? (ListId - это же integer, а не блоб... я слабо как-то понимаю тамошний код...)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492887
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeПользователь в гриде выделял записи
ой, опять про выделение пользователем в гриде полутора тысяч записей....
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492916
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> ой, опять про выделение пользователем в гриде полутора тысяч записей....

Да на самом деле там где-нибудь "выделить все" или
выделить диапазон, а обработать нормально это дело
автору лень, нехай сервер трудится, он же железный.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492922
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидNickDeeесли делать с джойном, то тогда лучше без временной таблицы. Мы это тут обсуждали пять лет назад: 6343890 :)
Но это настоящий изврат, правда меньший чем с инсертами :) Быстро работает, да. Но изврат :)0xFF.
2 NickDee: ты там разбиваешь список ИДшников на "слова" и выдаёшь из процедуры наружу отдельные ИДшники - я правильно понимаю ?
Да.
ТаблоидЧто делает с входным блобом (IntStr) твоя УДФ CreateIntList(IntStr, ListId, Cnt) ?
Она создаёт из блоба IntStr список чисел, возвращает ассоциированный с этим списком ListId, и возвращает в Cnt количество элементов в списке.
ТаблоидИ откудова вытаскивает ID'шник вот эта штука: ValueInList(ListId, I, V) ? (ListId - это же integer, а не блоб... я слабо как-то понимаю тамошний код...)
Она вытаскивает их из списка, который ассоциирован с ListId.
Кстати Blob это же реально Int64, привязанный к данным, и имеющий методы работы с этими данными :) Вот тут по аналогии: ListId привязан к списку, и есть методы работы с этим списком.
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492926
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамkdv> ой, опять про выделение пользователем в гриде полутора тысяч записей....
Да на самом деле там где-нибудь "выделить все" или
выделить диапазон, а обработать нормально это дело
автору лень, нехай сервер трудится, он же железный.

Ну ты знаешь, у меня код в скриптах прописан, и достаточно сильно абстрагирован от грида.
Там (в скрипте) торчит функция, типа GetMarkedIdList: TIntegerDynArray.
С моей точки зрения именно список Id из грида и является теми данными, которые ожидает скриптовая процедура обработки, желающая обработать отмеченные записи :) Я так и реализовал.
Я эту функцию вызываю, получаю список отмеченных Id, и в скрипте пишу например такой sql-запрос: "update T set IsProcessed = 1 where Id in (' + IntListToStr(GetMarkedIdList) + ')".
Почти одной строчкой. Все шаги очевидны и понятны. А вы что предлагаете? :)

Я sql-серверу на его собственном языке говорю: поставь IsProcessed = 1, для записей у которых Id принадлежит указанному множеству значений.
Чего не так? :)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492938
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDeeЯ эту функцию вызываю, получаю список отмеченных Id, и в скрипте пишу
например такой sql-запрос: "update T set IsProcessed = 1 where Id in (' +
IntListToStr(GetMarkedIdList) + ')".
Почти одной строчкой. Все шаги очевидны и понятны. А вы что предлагаете? :)
Две строки:
Код: sql
1.
2.
SaveListToTempTable(GetMarkedIdList);
merge into t using select Id from TempTable when matched set IsProcessed=1;


Все шаги очевидны и понятны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492954
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNickDeeЯ эту функцию вызываю, получаю список отмеченных Id, и в скрипте пишу
например такой sql-запрос: "update T set IsProcessed = 1 where Id in (' +
IntListToStr(GetMarkedIdList) + ')".
Почти одной строчкой. Все шаги очевидны и понятны. А вы что предлагаете? :)
Две строки:
Код: sql
1.
2.
SaveListToTempTable(GetMarkedIdList);
merge into t using select Id from TempTable when matched set IsProcessed=1;


Все шаги очевидны и понятны.

Это я понимаю.
Можно, чтобы не переписывать существующий sql-код, пойти ещё дальше - распарсить sql, вытащить из него элементы IN, вставить их во временную таблицу, исправить sql на join или merge, и отдать серверу :)
Будет почти универсальный воркэраунд для IN. Но это и есть изврат :)
...
Рейтинг: 0 / 0
500 джойнов и IN
    #38492973
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickDee> Ну ты знаешь, у меня код в скриптах прописан,
NickDee> и достаточно сильно абстрагирован от грида.
NickDee> С моей точки зрения именно список Id из грида

При чём тут скрипты и код? Пользователи как 1500
записей в гриде выбирают?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / 500 джойнов и IN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]