|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Научите уму-разуму, как надо было делать и что плохого в моей реализации. Постановка задачи: есть табл tablitchka с количеством записей 1 000 000 000. В таблице нет индексов кроме первичного ключа Требуется проапдейтить таблицу по условию COND (условие на неиндексированные поля) установив поле kolonka в 1, прогнозируемое количество попадающих под апдейт - 10 000 000. Мое решение: Код: plsql 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.
не очень мне нравится, но это единственный вариант который смог извергнуть. Прошу критики и рассказа о правильном подходе ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 11:48 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
ctas [+partitioning] + rename + grants. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 11:54 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg, если напр kolonka = 2 проапдейтить надо? ps имхо если есть условие по ровид, то по ид лишнее ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 12:02 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
AmKad ctas ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 12:05 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Stax legg, если напр kolonka = 2 проапдейтить надо? stax нет Stax ps имхо если есть условие по ровид, то по ид лишнее ..... stax имхо тоже, коллега вцепился зубами в ногу, боится что у записи rowid поменяется в одном случае из стотыщмиллионов. Надеюсь это успокоит ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 12:16 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg имхо тоже, коллега вцепился зубами в ногу, боится что у записи rowid поменяется в одном случае из стотыщмиллионов. Надеюсь это успокоит допустим поменяется ровид и .... тогда условие rowid = ar(i).rid and id = ar(i).id; не отработает (0 на 1 не поменяется) ps есть save exceptions, а обработка за циклом .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 12:52 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg отказался от такого варианта, тк решил что на работающей базе (таблица активно используется другими сессиями) так не прокатит. важное уточнение - забыл сразу дописать 1) С учетом того, таблица, как и любой сегмент, состоит из экстентов, в цикле с помощью dbms_rowid получаешь первый и последний rowid для каждого экстента и делаешь update по условию Код: plsql 1.
например, с фиксацией транзакции после каждого или N-го экстента. 2) Делаешь финальный update-скан по всей таблице только для тех записей, что были добавлены или мигрированы с момента старта этапа 1 и для которых выполняется условие Код: plsql 1.
Какой в этом профит в сравнении с твоим вариантом - не нужно вычитывать таблицу перед обновлением. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 13:16 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Stax legg имхо тоже, коллега вцепился зубами в ногу, боится что у записи rowid поменяется в одном случае из стотыщмиллионов. Надеюсь это успокоит допустим поменяется ровид и .... тогда условие rowid = ar(i).rid and id = ar(i).id; не отработает (0 на 1 не поменяется) ps есть save exceptions, а обработка за циклом .... stax да, верное замечание. просто долго описывать все нюансы. логика - 'если случилась неведомая фигня - лучше ничего трогать не буду, надо ручками разбирать что там.' - в данном случае так можно. и вместо null в обработчике логирование варнинга идет ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 13:30 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
AmKad legg отказался от такого варианта, тк решил что на работающей базе (таблица активно используется другими сессиями) так не прокатит. важное уточнение - забыл сразу дописать 1) С учетом того, таблица, как и любой сегмент, состоит из экстентов, в цикле с помощью dbms_rowid получаешь первый и последний rowid для каждого экстента и делаешь update по условию Код: plsql 1.
например, с фиксацией транзакции после каждого или N-го экстента. 2) Делаешь финальный update-скан по всей таблице только для тех записей, что были добавлены или мигрированы с момента старта этапа 1 и для которых выполняется условие Код: plsql 1.
Какой в этом профит в сравнении с твоим вариантом - не нужно вычитывать таблицу перед обновлением. крутокрутокруто! попробую. сейчас оставлю так, а в след релизе глядишь и эту версию выпущу. на сам деле я чего то подобного и хотел, не знал как реализовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 13:32 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg вместо null в обработчике логирование варнинга идет я не про null я про место обработки, следующие 10000 не обработаются если была "ошибка" зы я так понимаю ето разовая операция, "оптимизация" займет больше времени чем проапдейтить 10млн stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:06 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
[quot Stax#22400192] legg вместо null в обработчике логирование варнинга идет я не про null я про место обработки, следующие 10000 не обработаются если была "ошибка" ну да. эта процедура будет вызываться ежедневно джобом. по полю kolonka идет партиционирование. конечная цель - перенос из исходной таблицы в целевую неактуальных данных (архивировать то есть) на лету, без техперерывов всяких. после апдейта kolonka неактуальные данные будут оказываться в другой партиции, которая после копирования будет транкейтиться. так вот - если вдруг что то пошло не так -я решил что надежнее плюнуть и попробовать архивировать в след раз, а в этой итерации забить и не апдейтить. насколько я понимаю rowid может поменяться только при серьезном каком-то перетряхивании таблиц. при разовых работах. и если такие работы ведутся во время архивирования -ну его на фиг , архивирование. завтра сделаем , а сейчас лучше прекратить свою активность попытался связанно объяснить, но не уверен что вышло). Stax "зы я так понимаю ето разовая операция, "оптимизация" займет больше времени чем проапдейтить 10млн stax " stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:19 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg по полю kolonka идет партиционирование. конечная цель - перенос из исходной таблицы в целевую неактуальных данных (архивировать то есть) на лету, без техперерывов всяких. Через row movement? Мсье знает толк в извращениях. https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/manage-data-db-ilm.html#GUID-C53B27F1-7E71-4683-A2A0-3DE194A59C2E ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:34 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous legg по полю kolonka идет партиционирование. конечная цель - перенос из исходной таблицы в целевую неактуальных данных (архивировать то есть) на лету, без техперерывов всяких. Через row movement? Мсье знает толк в извращениях. согласен. через row movement естественно. не я это придумал. но реализовываю -я). а тут грабля на грабле. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:40 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous первый раз вижу о такой возможности. вечером почитаю. спасибо огромное! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:46 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg andrey_anonymous первый раз вижу о такой возможности. вечером почитаю. спасибо огромное! толи я не туда смотрю, но только я че та не уверен что тут есть то что надо. архивировать можно записи по довольно сложным условиям. к примеру документы могут архивироваться только после того как закрыт соответствующий счет (и еще ряд условий). такие условия разве можно политиками описать? или я не туда поперся? кажется то что надо. буду вкуривать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:52 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg - если вдруг что то пошло не так -я решил что надежнее плюнуть и попробовать архивировать в след раз, а в этой итерации забить и не апдейтить. имхо тогда и мало смысла в save exceptions ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:57 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Stax legg - если вдруг что то пошло не так -я решил что надежнее плюнуть и попробовать архивировать в след раз, а в этой итерации забить и не апдейтить. имхо тогда и мало смысла в save exceptions ..... stax я там ругаюсь) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 14:58 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
А зачем вообше такая странная логика: 1. Скопировать втаблицу в память 2. Сканировать таблицу в памяти 3. Апдейтить оригинальную таблицу Вроде-как по всем книжкам гораздо быстрее работать напрямую ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 16:14 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan Вроде-как по всем книжкам гораздо быстрее работать напрямую Прямая прямой рознь. Если тупо натравить update на большую меняющуюся таблицу, то можете нарваться на statement restart, что в случае большой таблицы будет печально само по себе. Кроме того, update будет длительным и имеет шансы заблокировать основные операции по таблице. Если натравить update на большую меняющуюся таблицу с ограничителем по числу строк (...and rownum < :BatchSize), то FTS будет бегать каждый запуск. При этом конкуренция и statement restart тоже никуда не денутся. Примечение: В случае ТС если "самопалить", то надо гонять не update, а delete...returning с последующим выходом на forall insert, это будет дешевле update+row_movement. Впрочем, означенные выше проблемы delete-у тоже свойственны. Есть вариант распараллелить dml несколько снижая проблемы с конкуренцией, но не уверен что ТС это надо. На круг предложенный вариант с разбиением работы на части посредством предварительного анализа таблицы экстентов вполне себе неплох. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 16:30 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous kapelan Вроде-как по всем книжкам гораздо быстрее работать напрямую Прямая прямой рознь.... это все понятно, тока переложить большую таблицу в другое место тоже не быстрая операция ... потом сканировать ее в памяти ... Грубо говоря получаем двойной фулл скан большой таблицы. Я бы посмотрел в в сторону мат. вью: навесить на него нужные индексы и делать поиск по индексам. Таким образом получаем поиск по индексу в мат. вью и UPDATE таблицы по PRIMARY KEY ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 16:40 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan переложить большую таблицу в другое место тоже не быстрая операция ... потом сканировать ее в памяти ... Это о чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 16:47 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous kapelan переложить большую таблицу в другое место тоже не быстрая операция ... потом сканировать ее в памяти ... Это о чем? Код: plsql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:05 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan andrey_anonymous пропущено... Это о чем? Код: plsql 1. 2.
или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:15 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan andrey_anonymous пропущено... Прямая прямой рознь.... это все понятно, тока переложить большую таблицу в другое место тоже не быстрая операция ... потом сканировать ее в памяти ... Грубо говоря получаем двойной фулл скан большой таблицы. Я бы посмотрел в в сторону мат. вью: навесить на него нужные индексы и делать поиск по индексам. Таким образом получаем поиск по индексу в мат. вью и UPDATE таблицы по PRIMARY KEY вопрос в том как одним махом проапдейтить 10 000 000 строк. база не в монопольном доступе, очередные 10000000 записей как раз в таблицу инсертятся в это время. а чуть позже - апдейтятся. даже если конкуренций не случится -снапшот ту олд практически гарантирован ведь при прямом апдейте всего сразу? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:21 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg ... или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. Вы делаете тройную работу - два раза читаете блоки данных в буфере данных, и еще перебираете массив. При этом второе чтение у вас всегда сопровождается проверкой - не надо ли соответствующий блок еще раз прочитать в память. Кроме того, с транзакционной точки зрения, вы совершаете логическую ошибку, не блокируя прочитанные вашим первым чтением данные. После исключения логических ошибок ваш код, может быть, просто поставит базу колом на какое-то количество часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:30 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg kapelan пропущено... Код: plsql 1. 2.
или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. такое обычно пишут в том случае если не получается одним махом проапдейтить всю таблицу. И тогда девелопер рисует оный код и зовет ее в лупе. Тут надо понимать что ничего таки не изменится - девелопер зовет эту лупу энное число раз, пока не апдейтится вся таблица. Грубо говоря те-же грабли без большого лока а по продолжительности дольше. С мат. вью тоже без большого лока, только быстрее в разы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:32 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg снапшот ту олд практически гарантирован ведь при прямом апдейте всего сразу? update никак не может дать snapshot too old, поскольку берет блоки в current режиме. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:32 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan Тут надо понимать что ничего таки не изменится Заблуждаетесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:33 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby legg ... или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. Вы делаете тройную работу - два раза читаете блоки данных в буфере данных, и еще перебираете массив. При этом второе чтение у вас всегда сопровождается проверкой - не надо ли соответствующий блок еще раз прочитать в память. Кроме того, с транзакционной точки зрения, вы совершаете логическую ошибку , не блокируя прочитанные вашим первым чтением данные. После исключения логических ошибок ваш код, может быть, просто поставит базу колом на какое-то количество часов. в яблочко ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:37 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby legg ... или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. Вы делаете тройную работу - два раза читаете блоки данных в буфере данных, и еще перебираете массив. При этом второе чтение у вас всегда сопровождается проверкой - не надо ли соответствующий блок еще раз прочитать в память. Кроме того, с транзакционной точки зрения, вы совершаете логическую ошибку, не блокируя прочитанные вами данные. После исключения логических ошибок ваш код, может быть, просто поставит базу колом на какое-то количество часов. я не понимаю ( "два раза читаете блоки данных в буфере данных," - это где? "с транзакционной точки зрения " - условием where отбираются те записи которые ни при каких обстоятельствах не будут принимать участие ни в каких транзакциях. потому колом поставить не должен). но в общем - верное замечание. только вот неверное условие where если зацепит записи участвующие потенциально в других транзакциях наделает делов куда больше чем поставит базу колом. так что кол в виде блокировок будет не бедой а спасением)) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:39 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous kapelan Тут надо понимать что ничего таки не изменится Заблуждаетесь. Нет не заблуждаюсь, да есть бенефиты у лупа но недостатки значительно хуже booby точно написал ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:39 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan andrey_anonymous пропущено... Заблуждаетесь. Нет не заблуждаюсь, да есть бенефиты у лупа Не туда смотрите. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:42 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan, вам пытаются сказать, что ваша идея про матвью сама по себе либо вообще не будет работать, а если повезет, то будет работать всего на порядок - другой хуже, чем вообще любое другое решение. В норме и три порядка может наскрестись. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 17:56 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan legg пропущено... или я чего то не понимаю или выглядит так, что вы сравниваете скорость чтения с диска данных таблицы и скорость перебора массива в оперативной памяти. такое обычно пишут в том случае если не получается одним махом проапдейтить всю таблицу. И тогда девелопер рисует оный код и зовет ее в лупе. Тут надо понимать что ничего таки не изменится - девелопер зовет эту лупу энное число раз, пока не апдейтится вся таблица. Грубо говоря те-же грабли без большого лока а по продолжительности дольше. С мат. вью тоже без большого лока, только быстрее в разы. матвью чем то принципиально отличается простой таблицы? суть вопроса - как проапдейтить большое количество (10000000) записей? считаете что ничего страшного одним апдейтом? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:00 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan, индекс в этой истории, если вообще смотрится, то функциональный, а скорее и вовсе bitmap, и насколько это совместимо с общей логикой использования целевой таблицы - издалека не видно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:04 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
DBMS_PARALLEL_EXECUTE OverviewThis package lets you incrementally update table data in parallel, in two high-level steps. 1. Group sets of rows in the table into smaller-sized chunks. 2. Run a user-specified statement on these chunks in parallel, and commit when finished processing each chunk. This package introduces the notion of parallel execution task. This task groups the various steps associated with the parallel execution of a PL/SQL block, which is typically updating table data. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:07 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
я за вариант с разбивкой по диапазонам rowid. заодно можно и в параллели запустить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:08 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby kapelan, индекс в этой истории, если вообще смотрится, то функциональный, а скорее и вовсе bitmap, и насколько это совместимо с общей логикой использования целевой таблицы - издалека не видно. да бог с ним с этим индексом. не из-за него тормоза то. большой апдейт (долгий) это ведь плохо? как минимум ролбэксегменты растут из-за него. могут ведь кончится? или я вообще ахинею несу и можно хоть по 5 миллиардов строк одни выражением апдейтить? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:09 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
параллели нельзя. потому что. только в самом крайнем случае, через кучу согласований. внутренние наши обычаи такие ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:12 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby kapelan, индекс в этой истории, если вообще смотрится, то функциональный, а скорее и вовсе bitmap Ммм? Код: plsql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:13 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg можно хоть по 5 миллиардов строк одни выражением апдейтить? 1. Если update одной транзакцией, то нужен будет большой rollback segment. 2. Statement restart - серьезная проблема для больших update - убедитесь, что не наступите. 3. В Вашем сценарии update вообще не нужен, delete-returning-bulk insert будет дешевле. Впрочем, повторяюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:17 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg параллели нельзя. потому что. только в самом крайнем случае, через кучу согласований. внутренние наши обычаи такие уточню - паралелль здесь не в смысле ENABLE_PARALLEL_DML, а в смысле два независимых процесса, обрабатывающих непересекающиеся диапазоны. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:21 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous 3. В Вашем сценарии update вообще не нужен, delete-returning-bulk insert будет дешевле. Впрочем, повторяюсь. это я запомнил и записал в специальный файлик ). Попробую. Спасибо. Буду тест кейсы писать - сверять скорость) andrey_anonymous 1. Если update одной транзакцией, то нужен будет большой rollback segment. - ну так и возвращаемся, транзакцию со всех сторон крайне желательно бить на куски. собственно вопрос и был как это делается по фэн шум. andrey_anonymous 2. Statement restart - серьезная проблема для больших update - убедитесь, что не наступите. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:24 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
кит северных морей legg параллели нельзя. потому что. только в самом крайнем случае, через кучу согласований. внутренние наши обычаи такие уточню - паралелль здесь не в смысле ENABLE_PARALLEL_DML, а в смысле два независимых процесса, обрабатывающих непересекающиеся диапазоны. DBMS_PARALLEL_EXECUTE и делает это вроде бы? теоретически можно, но не особо смысл есть мне кажется. нет жестких требований к времени. главное - не положить систему ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:27 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg кит северных морей пропущено... уточню - паралелль здесь не в смысле ENABLE_PARALLEL_DML, а в смысле два независимых процесса, обрабатывающих непересекающиеся диапазоны. DBMS_PARALLEL_EXECUTE и делает это вроде бы? теоретически можно, но не особо смысл есть мне кажется. нет жестких требований к времени. главное - не положить систему надо будет -допишу потом. главное чтоб суть заработала ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:30 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous, ответ такой - в живой ситуации не всякий админ порадуется, когда ему предложат держать стандартный индекс на толстой таблице, если заранее известно, что использоваться осмысленно он будет на 1% Кроме того, его clustering фактор непредсказуем, хотя именно эта история может существенно компенсироваться хинтами. В принципе, можно и настоять, что он нужен, при отсутствии ограничений со стороны вставки. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:36 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg я не могу нагуглить что это(. Это чудный механизм согласования целостности при dml. Применяется при update, delete, select for update и merge (с древним но непофиксенным багом). Если утрировать (там деталей миллион), то смысл в следующем: бредет процесс update по блокам таблицы. По их current версиям. Строчки перебирает, на предикат тестирует. И набредает на запись, которая: - подходила под предикат на момент запуска запроса (на scn согласования) - была изменена после запуска update конкурирующей транзакцией - изменение вывело запись из предиката. Упс! думает процесс, тут такое дело, набор данных-то рассогласован, надо что-то делать! Ну и откатывает ВСЕ произведенные до той поры изменения, хоть 99999999 из 10000000 После чего начинает всё с начала. ...а юзер ждет у моря погоды. И чем больше времени прошло от запуска запроса, тем выше вероятность влететь в ситуацию рассогласования и тем больший объем rollback он будет откатывать, а затем закатывать обратно на новый scn. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:39 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby andrey_anonymous, ответ такой - в живой ситуации не всякий админ порадуется Против правильного функционального я не возражал. Но bitmapped тут совсем не при делах. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:41 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous legg я не могу нагуглить что это(. Это чудный механизм согласования целостности при dml. Применяется при update, delete, select for update и merge (с древним но непофиксенным багом). Если утрировать (там деталей миллион), то смысл в следующем: бредет процесс update по блокам таблицы. По их current версиям. Строчки перебирает, на предикат тестирует. И набредает на запись, которая: - подходила под предикат на момент запуска запроса (на scn согласования) - была изменена после запуска update конкурирующей транзакцией - изменение вывело запись из предиката. Упс! думает процесс, тут такое дело, набор данных-то рассогласован, надо что-то делать! Ну и откатывает ВСЕ произведенные до той поры изменения, хоть 99999999 из 10000000 После чего начинает всё с начала. ...а юзер ждет у моря погоды. И чем больше времени прошло от запуска запроса, тем выше вероятность влететь в ситуацию рассогласования и тем больший объем rollback он будет откатывать, а затем закатывать обратно на новый scn. ясно. спасибо! я краем уха слышал, но забыл. ) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:46 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg, причитайтесь к тому,что пишет andrey_anonymous. В качестве правила большого пальца, предлагаю развить в себе рефлекс отторжения update-а. Увидели в коде слово update - вам должно становиться физически больно, как будто вас ошпарили кипятком, или прижгли окурком. А написали сами такое слово - должны поставить себя в угол на неделю, без допуска к пиву и женщинам. Это все при том всём, что у Oracle одна из лучших, если не точно и строго самая лучшая реализация update, среди всех на сей момент существующих dbms, как-то опирающихся на mvcc. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 18:47 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Увидели в коде слово update - вам должно становиться физически больно, как будто вас ошпарили кипятком, или прижгли окурком. А написали сами такое слово - должны поставить себя в угол на неделю, без допуска к пиву и женщинам.Каждый имеет право проповедовать свою религию, основанную на вере в хрен знает что. Следовать ей или нет - это зависит уровня разума читающего. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 19:51 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby legg, причитайтесь к тому,что пишет andrey_anonymous. В качестве правила большого пальца, предлагаю развить в себе рефлекс отторжения update-а. Увидели в коде слово update - вам должно становиться физически больно, как будто вас ошпарили кипятком, или прижгли окурком. А написали сами такое слово - должны поставить себя в угол на неделю, без допуска к пиву и женщинам. Это все при том всём, что у Oracle одна из лучших, если не точно и строго самая лучшая реализация update, среди всех на сей момент существующих dbms, как-то опирающихся на mvcc. да. я уже наметил себе в планах сравнение delete и row movement. но делетить то все равно кусками надо) выходит делитель с обходом по екстендам - самый оптимальный результат? (вопрос с использованием политик ADO пока в сторону, этим в третью очередь займусь) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 19:53 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg kapelan пропущено... такое обычно пишут в том случае если не получается одним махом проапдейтить всю таблицу. И тогда девелопер рисует оный код и зовет ее в лупе. Тут надо понимать что ничего таки не изменится - девелопер зовет эту лупу энное число раз, пока не апдейтится вся таблица. Грубо говоря те-же грабли без большого лока а по продолжительности дольше. С мат. вью тоже без большого лока, только быстрее в разы. матвью чем то принципиально отличается простой таблицы? суть вопроса - как проапдейтить большое количество (10000000) записей? считаете что ничего страшного одним апдейтом? изначально было сказано что существует только один индекс - ПК Вот мат. вью для этого и нужно - наплевать на существующий дезайн и создать таблицу с нужными индексами. По количеству апдейтед строк ничего не сказано. Я предполагаю что-то среднее 10-30% от таблицы - в этом случае индекс спасет, ну а если вся таблица апдейтится- это совсем другой коленкор. PS: 1.000.000 записей одним махом? да легко 100.000.000 записей одним махом? другое дело ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 21:35 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg ... я уже наметил себе в планах сравнение delete и row movement. но делетить то все равно кусками надо) выходит делитель с обходом по екстендам - самый оптимальный результат? (вопрос с использованием политик ADO пока в сторону, этим в третью очередь займусь) Прежде всего, следует заметить, что для Oracle ваш миллиард записей, это если уже не совсем маленькая, но еще вовсе не такая большая таблица. Далее, 1. Никакого row movement у вас не будет, если а) партицирование таблицы функционально не зависит от изменяемого поля, б) поле not null, и физически необходимое место для нового значения совпадает с требовавшимся для предыдущего. 2. Если Update производится именно для того, чтобы перенести запись из одной партиции в другую, то тот или иной вариант физического перемещения так или иначе состоится. Выписанный вами update - построчный, с небольшим преимуществом против обычного построчного, заключающегося в отсутствии переключения контекста между pl/sql и sql машинами. Но объем redo при этом сформируется примерно одинаково неприемлемый. Именно в этих конкретных обстоятельствах delete bulk collect + forall insert может оказаться, и, скорее всего, окажется предпочтительней. Для этой конкретной задачи хорошо смотрелся бы Merge с удалением данных на источнике. Но именно такого у Oracle нет. 3. Пока ваша таблица маленькая, (а не шибко большой, в предположении, что записи в ней не слишком широкие, она будет оставаться миллиардов до 10 записей или несколько дольше), ни о каких альтернативах прямому проходу по блокам таблицы, с разделением на подмножества, можно не шибко задумываться. И такую маленькую таблицу почти всё равно, на каком железе "крутить". А дальше надо принять в расчёт, что любая инсталляция умеренно современного Oracle на любую железную конструкцию, отличную от Oracle Exadata, является всего лишь на соплях собранную демонстрационную модель, показывающую - что такое Oracle вообще, и собираемую для предоставления возможности первичного и приблизительного ознакомления с инструментом. Oracle, установленный на железо Exadata это просто система качественно другого класса. Так видится, что имеющихся там инструментов вполне достаточно, чтобы на весьма длинную и плохо просматриваемую в глубину перспективу считать, что индексы для конкретно этой задачи вам никогда не понадобятся. Если на "обычном" железе Oracle это обычный, такой же, как и прочие, "High End", то на Exadata - это "Super High End" из другой звёздной системы. Если Exadata нет и не предвидится, то, может быть, придется когда-то что-то мутить на индексах. Но это плохо, в некотором отношении. Если продолжать бросаться "правилами большого пальца", то можно сформулировать такую максиму: Если ты установил себе Oracle сейчас, но не готов заплатить за Exadata потом (а там разговор за минимально разумную конфигурацию только начинается от миллиона долларов), значит ты неудачно произвёл выбор субд для своей системы. Это просто техническая ошибка, достаточно высокой общей стоимости владения. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2021, 22:36 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Охъ, сколько понаписали, а элементарно посоветовать virtual calculated column забыли... Ведь в оригинальном вопросе проще всего было бы добавить скрытое вычисляемое поле на условие и не париться с изменением данных. legg ну да. эта процедура будет вызываться ежедневно джобом. по полю kolonka идет партиционирование. конечная цель - перенос из исходной таблицы в целевую неактуальных данных (архивировать то есть) на лету, без техперерывов всяких. после апдейта kolonka неактуальные данные будут оказываться в другой партиции, которая после копирования будет транкейтиться. так вот - если вдруг что то пошло не так -я решил что надежнее плюнуть и попробовать архивировать в след раз, а в этой итерации забить и не апдейтить. legg есть табл tablitchka с количеством записей 1 000 000 000... Требуется проапдейтить таблицу по условию COND ... установив поле kolonka в 1, прогнозируемое количество попадающих под апдейт - 10 000 000. а сколько всего под архивацию попадает? секционирование уже есст или только планируете? Каково вообще распределение значений этих "kolonka"? Там только 0 и 1? По сколько их? Смысл менять на 1 только для того, чтобы удалить из этой таблицы? Из ответов получается что вообще ни апдейт, ни секционирование тут не нужны, а просто нужен insert select bulk collect + delete. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 02:09 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous 3. В Вашем сценарии update вообще не нужен, delete-returning-bulk insert будет дешевле. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 02:15 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
kapelan legg пропущено... матвью чем то принципиально отличается простой таблицы? суть вопроса - как проапдейтить большое количество (10000000) записей? считаете что ничего страшного одним апдейтом? изначально было сказано что существует только один индекс - ПК Вот мат. вью для этого и нужно - наплевать на существующий дезайн и создать таблицу с нужными индексами. По количеству апдейтед строк ничего не сказано. Я предполагаю что-то среднее 10-30% от таблицы - в этом случае индекс спасет, ну а если вся таблица апдейтится- это совсем другой коленкор. PS: 1.000.000 записей одним махом? да легко 100.000.000 записей одним махом? другое дело 1. обновление матвью не нивелируют весь профит? 2. при реализации задачи и попытался так реализовать механизм, чтобы он требовал минимальной поддержки при развитии системы в дальнейшем. завел справочную табличку , храню там название таблицы подлежащей архивированию, приоритет архивирования и sql условие по которому архивируется. процедура архивирования бежит по этой таблице, проверяет наличие таблицы-близнеца для архивных данных, если таблицы такой нет - создает ее, и переливает данные из источника в приемник. анализировать sqlусловие и по результатам анализа создавать правильные индексы- можно попробовать но как то уж чрезмерно сложно, пока что обойдусь фулсканом. кстати а создание и заливка-обновление данных матвью не ведет разве к тому же фулскану? "1.000.000 записей одним махом? да легко 100.000.000 записей одним махом? другое дело " - как понять где проходит граница? кроме того - поделка перед установкой на пром, который наверное сожрет в самом деле такие транзакции, должна пройти еще прокутиться на тестовых стендах и такими транзакциями боюсь таки будет валить их. не рассчитаны они на массовые операции. кроме того, транзакции резко. выбивающиеся из общей картины потребуют от меня кучу объяснений админам и сопровожденцам, хотелось бы максимально этого избежать, если такая возможность есть . при любом инциденте на проме в первую очередь будут кивать на такие вот транзакции, резко выделяющиеся на общем фоне, есть уже опыт. не критично но не желательно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 11:33 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby 1. Никакого row movement у вас не будет, если а) партицирование таблицы функционально не зависит от изменяемого поля, б) поле not null, и физически необходимое место для нового значения совпадает с требовавшимся для предыдущего. партиционирование специально сделал по этому полю . так и назвал - архивная и активная партиции. поле not null default 0, 0 -активная , все остальное -архивная ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 11:38 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
значит скан вы должны делать не по всей таблице, а только по активной партиции. это, по вашему описанию, будет всегда не больно. Если еще не сделали, создайте над активной партицией представление с удобным именованием, и жизнь сильно наладится. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 11:48 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg партиционирование специально сделал по этому полю . так и назвал - архивная и активная партиции. поле not null default 0, 0 -активная , все остальное -архивная Хм... Так это Ваша разработка, а не доработки в живой системе... Тогда, возможно, вообще зайти с другой стороны - пересмотреть схему секционирования? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 12:05 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
Sayan Malakshinov Охъ, сколько понаписали, а элементарно посоветовать virtual calculated column забыли... Ведь в оригинальном вопросе проще всего было бы добавить скрытое вычисляемое поле на условие и не париться с изменением данных. виртуальная колонка она ведь при каждом инсерте-апдейте будет считать значение? не хочется чтобы реализуемый функционал приводил к замедлению текущего. Sayan Malakshinov а сколько всего под архивацию попадает? секционирование уже есст или только планируете? Каково вообще распределение значений этих "kolonka"? Там только 0 и 1? По сколько их? Смысл менять на 1 только для того, чтобы удалить из этой таблицы? Из ответов получается что вообще ни апдейт, ни секционирование тут не нужны, а просто нужен insert select bulk collect + delete. в наиболее тяжелых случаях на сегодняшний момент - при первом запуске под архивацию попадет около 150 млн из 800 млн. далее - около 10 млн в день пока что. в дальнейшем (через годик) вполне может вырасти на порядок. у меня вообще есть сомнения что подход в корне не верен и рано или поздно никакая оптимизации не поможет, надо будет какими нибудь etl средствами а ля Data stage оперировать. секционирование есть но можно пока вернуть все взад ). распределение значений kolonka ориентировочно 1% ежедневно. только 0 и 1. количество зависит от таблицы. к миллиарду максимальная приближается пока что. смысл меня на 1 - логика такая (насколько понимаю, изначально не мое решение, я реализовываю и могу перерешить если сочту нужным) - меняя на 1 мы переносим запись в другую партицию и любые манипуляции с этими данными в дальнейшем не будут влиять не текущие бизнес-процессы, на манипуляции других сессий с данными в этой таблице. кроме того будет возможность отладить , проверить-перепроверить результат в процессе тестирования. если что пошло не так , перенесли что то лишнее-ничего не поломается пока что. вторым шагом данные копируются (insert) в транзитную таблицу третьим шагом из транзитной реплэйс партишн в архивную. в реузлтате - да, реализую вариант с delete-returning-bulk insert с обходом по экстендам и сравню ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 12:05 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby значит скан вы должны делать не по всей таблице, а только по активной партиции. это, по вашему описанию, будет всегда не больно. Если еще не сделали, создайте над активной партицией представление с удобным именованием, и жизнь сильно наладится. да, скан делаю по секции, но архивная секция почти всегда пустая - она переносится в другую таблицу в итоге она называется active ) уже удобно ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 12:07 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous legg партиционирование специально сделал по этому полю . так и назвал - архивная и активная партиции. поле not null default 0, 0 -активная , все остальное -архивная Хм... Так это Ваша разработка, а не доработки в живой системе... Тогда, возможно, вообще зайти с другой стороны - пересмотреть схему секционирования? долгая история. изначалная идея не моя. готовое тз. начал делать я, потом меня кинули на другой фронт, доделывал коллега, почти все сделано, но так и не взлетела. теперь опять я делаю, задача -запихать на пром. система молодая относительно, живая, вовсю работает на проме, арихиврование -ее новый функционал - пересмотреть схему секционирования - прям ща считаю нецелесообразным - почти все работает уже. но переделать все заново по феншую готов. вторым этапом. мне вот тут политик ado насоветовали в теме. (если я правильно понял совет) вы по моему и посоветовали) https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/ilm-strategy-heatmap-ado.html#GUID-811423E6-3F43-4B95-AF9E-119AC71FB0D0 думаю в эту сторону посмотреть ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 12:13 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg архивная секция почти всегда пустая - она переносится в другую таблицу в итоге Тогда это вообще жестко. Почему сразу не нести в другую таблицу, зачем все эти приседания с partitioning? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 16:13 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg booby значит скан вы должны делать не по всей таблице, а только по активной партиции. это, по вашему описанию, будет всегда не больно. Если еще не сделали, создайте над активной партицией представление с удобным именованием, и жизнь сильно наладится. да, скан делаю по секции, но архивная секция почти всегда пустая - она переносится в другую таблицу в итоге она называется active ) уже удобно совсем ничего не понял. ни почему архивная секция всегда пустая, ни почему она удобно называется active. так же не понял, какой точно смысл вкладывается в автор...мы переносим запись в другую партицию и любые манипуляции с этими данными в дальнейшем не будут влиять не текущие бизнес-процессы, на манипуляции других сессий с данными в этой таблице. кроме того будет возможность отладить , проверить-перепроверить результат в процессе тестирования. если что пошло не так , перенесли что то лишнее-ничего не поломается пока что... за что точно идет идет борьба - за высоту индекса, за размер таблицы в tablespace кто кому и как именно "мешает". Кроме того, при массовых процессах такого рода, в зависимости от характера переносимых из текущей партиции данных, могут, а в вашем сценарии скорее должны разыгрываться истории про коалеск индекса и/или move таблицы. Процесс такого рода носит явно административный характер, и выполнять его надо в явное время оффтайм, если такое есть, или хотя бы во время минимальной нагрузки, такое в большинстве случаев так или иначе проявляется. --------------------------- Про вычисляемый столбец вам говорят вот о чем: Вы же изначально собирались именно update-ить поле на 1, а чтобы понять, с кем именно это сделать, у вас есть некое условие отбора записей. Вот это условие, в предположении его его вменяемой простоты, превращается в вычисляемое поле. И строка сама говорит - меня пора переносить в куда-то. Как-то так, примерно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 16:35 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous legg архивная секция почти всегда пустая - она переносится в другую таблицу в итоге Тогда это вообще жестко. Почему сразу не нести в другую таблицу, зачем все эти приседания с partitioning? насколько понимаю (автор общей идеи не я) - посчитали что такой механизм окажется наиболее щадящим для нагруженной таблицы в которую активно инсертят-апдейтят другие записи в это же время. вместо транзакции делит-инсерт-commit - транзакция апдейт-коммит. ну и на этом этапе дополнительная возможность отладить-проверить все ли ок. я могу только гадать (. ну и склоняюсь к тому чтобы переделать на delete-insert. и проще и надежнее и быстрее. спасибо за подсказку ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 16:38 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby И строка сама говорит - меня пора переносить в куда-то. "...и звезда с звездою говорит", ага.. ТС где-то уже упоминал, что признак "устаревания" записи может определяться не только на основе данных конкретной строки, но как часть более сложного бизнес-процесса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 16:41 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
legg насколько понимаю (автор общей идеи не я) - посчитали что такой механизм окажется наиболее щадящим для нагруженной таблицы в которую активно инсертят-апдейтят другие записи в это же время. вместо транзакции делит-инсерт-commit - транзакция апдейт-коммит. Идея более чем странная, поскольку фактически заменяет "делит-инсерт<"в другую таблицу">-commit" на апдейт[internals: update-delete-insert]-коммит c последующим "делит-инсерт<"в другую таблицу">-commit" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 16:45 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
booby ни почему архивная секция всегда пустая, ни почему она удобно называется active. ну и когда я работаю (апдейчу) с данными в процессе переноса - я явным образом прописываю секции в самом апдейте booby за что точно идет идет борьба - за высоту индекса, за размер таблицы в tablespace кто кому и как именно "мешает". Кроме того, при массовых процессах такого рода, в зависимости от характера переносимых из текущей партиции данных, могут, а в вашем сценарии скорее должны разыгрываться истории про коалеск индекса и/или move таблицы. вот я и бью на части транзакцию, чтобы за индексы борьбу упростить в т.ч. И после обновления - строка в партиции с другим индексом, можно воротить все что захочешь booby Процесс такого рода носит явно административный характер, и выполнять его надо в явное время оффтайм, если такое есть, или хотя бы во время минимальной нагрузки, такое в большинстве случаев так или иначе проявляется. есть сильный соблазн (и уже были предложения) так и делать. но вдруг у меня получится?))) --------------------------- booby Про вычисляемый столбец вам говорят вот о чем: Вы же изначально собирались именно update-ить поле на 1, а чтобы понять, с кем именно это сделать, у вас есть некое условие отбора записей. Вот это условие, в предположении его его вменяемой простоты, превращается в вычисляемое поле. И строка сама говорит - меня пора переносить в куда-то. Как-то так, примерно. это я понял. я не могу гарантировать вменяемую простоту. условие архивирование хранится в справочник в виде строки (sql выражение), подтянуть его довольно сложно получается ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 17:00 |
|
аск фор кодривью :)
|
|||
---|---|---|---|
#18+
andrey_anonymous legg насколько понимаю (автор общей идеи не я) - посчитали что такой механизм окажется наиболее щадящим для нагруженной таблицы в которую активно инсертят-апдейтят другие записи в это же время. вместо транзакции делит-инсерт-commit - транзакция апдейт-коммит. Идея более чем странная, поскольку фактически заменяет "делит-инсерт<"в другую таблицу">-commit" на апдейт[internals: update-delete-insert]-коммит c последующим "делит-инсерт<"в другую таблицу">-commit" угу. печально что я сразу об этом не задумался, а начал реализовывать что написано. дошло это до меня только в середине этой темы). так что переписывать на дельте-инсерт-коммит придется зы несложно и сейчас переписать , но я уже сборку отдаю. на ифт стенде при небольшой нагрузке работает. интересно что нт покажет ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2021, 17:04 |
|
|
start [/forum/topic.php?all=1&fid=52&tid=1879734]: |
0ms |
get settings: |
24ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
1159ms |
get tp. blocked users: |
2ms |
others: | 380ms |
total: | 1649ms |
0 / 0 |