|
SQL Foreach
|
|||
---|---|---|---|
#18+
А нет в SQL какого-нибудь аналога FOREACH? Грубо говоря - взять каждую строку таблицы, произвести с ней некоторые операции (вычисления полей) и засунуть новые значения обратно в эту строку. И так для каждой строки. Причем операции разные, в зависимости от данных в строке. И второй вопрос: что-то похожее, как я понимаю, делают курсоры. Но на СО почему-то к ответу про курсор (правда для другой БД) написано что надо всячески избегать их использования, т.к. они тормознутые. Как с этим в ФБ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:09 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp, В ФБ курсоры не тормозные, по крайней мере обычные. Двунаправленные будут жрать память, но они нужны крайне редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:23 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp А нет в SQL какого-нибудь аналога FOREACH alekcvp взять каждую строку таблицы, произвести с ней некоторые операции (вычисления полей) и засунуть новые значения обратно в эту строку Сюрприз ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:28 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp, собственно, "однонаправленный курсор" это обычный select (сюрприз). Тормозным он не может (и не должен) быть по определению. Под "тормозными курсорами" имееются в виду двунаправленные курсоры, в которых допускается позиционирование, то есть, где-то в памяти надо держать результат, по которому программист будет елозить туда-сюда, что потребляет ресурсы и тормозит выполнение. И то, действительно, "тормознутость" зависит от места применения. Короче, курсоры это - результат select на клиентской стороне - for select в процедурах и триггерах (в т.ч. for select ... as cursor) - declare cursor в процедурах и триггерах описание всех этих курсоров во всех версиях ФБ, на русском языке, тут - http://www.ibase.ru/develop/ ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:40 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
kdv Короче, курсоры это - результат select на клиентской стороне - for select в процедурах и триггерах (в т.ч. for select ... as cursor) - declare cursor в процедурах и триггерах Ну то есть если я в ХП запихну код типа: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Это нормальный подход? С учётом что эта процедура должна будет один раз в день выполняться на нескольких [десятках] тысячах записей? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:44 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvpНо на СО почему-то к ответу про курсор (правда для другой БД) написано что надо всячески избегать их использования, т.к. они тормознутые. Да, у MS SQL они тормозные. Но это его личные тараканы. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:44 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvpЭто нормальный подход? Это единственно работоспособный подход. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:47 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvpС учётом что эта процедура должна будет один раз в день выполняться на нескольких [десятках] тысячах записей? основной вопрос при таком использовании курсоров, это "стабильность курсора", т.е. остается-ли изменяемая запись в той же области видимости курсора, или выпадает оттуда, или меняется порядок записей курсора, и т.д. А это уже зависит от типа запроса и версии ФБ. Если используется версия ФБ где for select "нестабилен" в отношении update/delete себя, то там к запросу надо добавлять такой order by, чтобы у запроса был plan sort, т.е. чтобы результат запроса был "фиксированным". см. например https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/bk01ch09s06.html#rnfb30-dml-curstability однако, для for select ... suspend всё равно "стабильности" нет. https://firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30-psql-cursor-stablility.html ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 18:54 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
kdv основной вопрос при таком использовании курсоров, это "стабильность курсора", т.е. остается-ли изменяемая запись в той же области видимости курсора, или выпадает оттуда, или меняется порядок записей курсора, и т.д. А это уже зависит от типа запроса и версии ФБ. Если используется версия ФБ где for select "нестабилен" в отношении update/delete себя, то там к запросу надо добавлять такой order by, чтобы у запроса был plan sort, т.е. чтобы результат запроса был "фиксированным". Версия 3.0.5, ЕМНИП. UPDATE построен таким образом, что после его выполнения эта запись больше не подходит под условие WHERE в FOR SELECT. Т.е. в моём случае этот нюанс не опасен, я правильно понимаю? Или он может начать пропускать записи? ORDER BY и SUSPEND не используются. Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 19:00 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp, не опасен, там же написано "From Firebird 3, engine uses the Undo log to check whether a row was already inserted or modified by the current cursor." ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 19:05 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
kdv, Спасибо за информацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 19:06 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp Это нормальный подход? В примере, который написан, оно даже лучше зайдёт. А там уже в зависимости от сложности предполагаемой процедуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2020, 22:56 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
WildSery Ещё почитай применение MERGE. В примере, который написан, оно даже лучше зайдёт. А там уже в зависимости от сложности предполагаемой процедуры. У меня в if стороннее значение используется, кроме того все операции в одной таблице выполняются над каждой строкой независимо (от других строк). Разве merge в этом случае не медленнее будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2020, 00:12 |
|
SQL Foreach
|
|||
---|---|---|---|
#18+
alekcvp У меня в if стороннее значение используется alekcvp Разве merge в этом случае не медленнее будет? Если в процедуре будут какие-то дополнительные выборки, которые можно в USING для MERGE поместить, то может и быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2020, 22:25 |
|
|
start [/forum/topic.php?fid=40&msg=39955432&tid=1560356]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 247ms |
total: | 400ms |
0 / 0 |