05.07.2007, 16:47 | #121 |
Участник
|
|
|
07.08.2007, 06:38 | #122 |
Мрачный тип
|
Пара слов о стандартном SysRecIdRepair, точнее о надежности его использования ...
Автоинкремент в чистом неконтролируемом виде, используемый в данном классе для генерации новых значений RecId - есть зло, ибо рискуем с ним получить нарушение ссылочной целостности ввиду теоретической возможности совпадения в рамках одной таблицы старого и нового RecId, не являющегося заменой старому. Чем это чревато - можете представить сами . Новый RecId должен быть построен на автоинкременте с проверкой каждого нового значения на пересечение с подмножеством старых значенй по этой таблице. Это, конечно же, замедлит общий процесс дефрагментации и породит некоторые небольшие дырки в множестве новых RecId, но зато с подобной проверкой на душе спокойнее. |
|
07.08.2007, 08:20 | #123 |
Модератор
|
Цитата:
Сообщение от TasmanianDevil
Автоинкремент в чистом неконтролируемом виде, используемый в данном классе для генерации новых значений RecId - есть зло, ибо рискуем с ним получить нарушение ссылочной целостности ввиду теоретической возможности совпадения в рамках одной таблицы старого и нового RecId, не являющегося заменой старому
__________________
-ТСЯ или -ТЬСЯ ? |
|
07.08.2007, 09:56 | #124 |
Участник
|
Насколько я понял, имеется ввиду, что в таблице соответствия старым RecId новых может случиться ситуация вида:
RecId (OLD) RecId (new) 124 1 45676 2 2 3 То есть произойдет замена уже замененного RecId. Если неправильно понял, ТазманианДевил поправит. Но такой ситуации не может быть, потому как RecId в таблице отсортированны по возрастанию. То есть таблица будет выглядеть так, на самом деле: RecId (OLD) RecId (new) 2 1 124 2 45676 3 |
|
|
За это сообщение автора поблагодарили: TasmanianDevil (2). |
07.08.2007, 10:23 | #125 |
Мрачный тип
|
Именно так , Иван , Вы правильно поняли ...
Блин , не обратил внимание на последнюю строку в создании таблицы соответствия, где индекс по старому значению создавался. Спасибо, Иван, за наставление на путь истинный, а то уже я наладился свой генератор писать, который на моих 6 млн записей сутки бы генерил новые RecId С автоинкремента обвинения снимаются |
|
07.08.2007, 10:31 | #126 |
Member
|
Даже если бы индекса не было, то к нарушению логической целостности это не привело бы. Вопрос был бы только в скорости.
__________________
С уважением, glibs® |
|
07.08.2007, 13:47 | #127 |
Модератор
|
Коллеги, одна таблица обновляется одним оператором UPDATE
Эта операция атомарная, в ней нет промежуточного состояния "первую строку обновили, вторую еще нет" Точно так же оператор X++: update ledgerTrans set RecId = RecId + 1 ACID это называется
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
07.08.2007, 14:41 | #128 |
Участник
|
Ой, да. Это я Сусанин, не посмотрев код, не в ту степь повел.
Почему-то подумал, что вместо обновления потабличного (что намного производительнее, причем) делается позаписное (по RecId, и для каждого пробежка по всем таблицам). Посмотрел код, действительно, все записи обновляются одним запросом, поэтому проблема эта - вообще не проблема. |
|
28.05.2008, 10:49 | #129 |
Участник
|
А можно дефрагментировать RecID только для 1 таблицы
Доброго утра!
Ввиду большого кол-ва операций достигли ситуации когда RecId пошел на второй круг и в таблице CustInvoiceTrans начала появляться ошибка "Запись уже существует". Собственно, одна две записи допавляются без проблем, а вот заказ на 100 строк уже не разносится. Т.к на других операциях ошибок не замечено, решено провести дифрагментацию RecId но только для ОДНОЙ таблицы. Т.е. дефрагметировать RecId в таблице CustInvoiceTrans и при этом счетчик глобальный счетчик RecId не трагать, так как nextValue порядка 1 млрд, а записей в CustInvoiceTrans около 100 млн. Соответственно, если дефрагментировать RecId только в этой таблице то все последующие вставки в таблицу будут проходить безошибок. Вопрос: проделывал ли кто подобное? Аксапта 3.0 SP5, MS SQL 2005 Спасибо. |
|
28.05.2008, 13:10 | #130 |
Мрачный тип
|
Poseidon-topex, вряд ли кто-то это делал .
Теоретически и физически оно можно, только своими самописными средствами, ибо стандартный класс дефрагментации RecId это не поддерживает. Но логические последствия будут - я Вас умоляю : это срыв башни стандартному дефрагментатору(наворотит так , мало не покажется) и никуда не ушедшая вероятность появления данных ошибок на других таблицах.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
28.05.2008, 17:14 | #131 |
Участник
|
Ну, технически думаю никаких проблем нет.
Если вы исследуете класс SysRecIdRepair, то увидите, что там все довольно просто. То есть не сложно наложить фильтр для просмотра только одной таблицы, а не всех сразу. Никаких негативных последствий от этого быть не должно. |
|
28.05.2008, 20:37 | #132 |
Member
|
Поддерживаю TasmanianDevil. Испортите базу так, что потом уже вам ее никто не починит.
Рано или поздно поползут проблемы на других таблицах. А если на них есть ссылки по RecId, то такое надругательство база не стерпит. А стандартный алгоритм дефрагментации работать уже... ну скажем так... будет работать уже не так, как задумывалось. Раз уж вы прощелкали момент запуска дефрагментации, то ее нужно запустить как можно быстрее (с учетом всего того, что писалось выше), чтобы иметь как можно меньше негативных последствий.
__________________
С уважением, glibs® |
|
29.05.2008, 06:23 | #133 |
Мрачный тип
|
Спасибо, glibs, что поддержали .
Единственное, что хотелось бы добавить - если позволяют ресурсы временные и человеческие, перед стандартной дефрагментацией на такой компании сделайте аналогичный стандартному проход по таблицам с накоплением данных по разрезу "таблица/RecID" для мониторинга дублей. Это позволит оценить масштабы и возможные последствия после дефрагментации, а то и вовсе устранить дубли , если их не так уж и много будет в результате или они находятся в малозначимых таблицах.
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
10.06.2008, 10:19 | #134 |
Участник
|
Добрый день.
Дефрагментацию recId выполняли уже несколько раз. На форуме уже писали, что и где надо подправить для ускорения. Вся операция на 80 gb базе занимает около 3.5 часов. Поддерживаю glibs и TasmanianDevil. |
|
17.07.2008, 18:02 | #135 |
Участник
|
Все добрый день!
Дефрагментацию пока не делали, но чувствует мое сердце, что скоро придется . База 54ГБ (правда это сейчас, перед дефрагментацией планирую немножко почистить ) Пробовал запускать Проверку кодов записей на тестовой базе - колбасилось трое суток, нагрузка на сервере БД: ввод/вывод на пределе, загрузка проца 10-30% процедура не завершилась . Сервак висел капитально
__________________
Жить все веселей!.. AX3SP3CU1 |
|
17.07.2008, 18:07 | #136 |
Участник
|
Цитата:
Сообщение от Didukh84
Все добрый день!
Дефрагментацию пока не делали, но чувствует мое сердце, что скоро придется . База 54ГБ (правда это сейчас, перед дефрагментацией планирую немножко почистить ) Пробовал запускать Проверку кодов записей на тестовой базе - колбасилось трое суток, нагрузка на сервере БД: ввод/вывод на пределе, загрузка проца 10-30% процедура не завершилась . Сервак висел капитально Можете привести данные отчета "Disk usage by top tables" или аналогичного? сюда смотрели? http://axapta.mazzy.ru/lib/dbgrowthsolution/ дефрагментация recid очень тяжелая операция. ну и дополнительные советы: сразу выделяйте много (очень много) места под transaction log, установите шаг роста файла достаточно большим (не 1мб), сразу выделяйте место под базу (чтобы еще гигов 50 было свободно в базе). скорее всего у вас не аксапта работала а СКЛ тратил все время на рост базы. |
|
18.07.2008, 09:47 | #137 |
Участник
|
Добрый день!
Цитата:
привести данные отчета "Disk usage by top tables" или аналогичного
на счет выделения места, то я уже на эти грабли наступил Цитата:
СКЛ тратил все время на рост базы
__________________
Жить все веселей!.. AX3SP3CU1 |
|
18.07.2008, 09:51 | #138 |
Участник
|
Цитата:
сюда смотрели? http://axapta.mazzy.ru/lib/dbgrowthsolution/
__________________
Жить все веселей!.. AX3SP3CU1 |
|
21.07.2008, 21:27 | #139 |
Участник
|
Давным-давно заморачивался этим вопросом, в ходе поиска по тырнету нашел скрипт для Ms SQL, который выдает полезную информацию по таблицам, используя то, что сообщает хранимка sp_spaceused. Все данные о размере, выдаваемые ей, выводятся в kb, но подстрока " KB" удаляется, чтоб удобней было обрабатывать выхлоп в том же Excel.
Вот немного доработанный мною вариант скрипта (авторские комментарии сохранены): PHP код:
|
|
|
За это сообщение автора поблагодарили: Denicce (1), aidsua (1), MikeR (1), Didukh84 (1). |
21.07.2008, 22:45 | #140 |
Модератор
|
Цитата:
Сообщение от gl00mie
Давным-давно заморачивался этим вопросом, в ходе поиска по тырнету нашел скрипт для Ms SQL, который выдает полезную информацию по таблицам, используя то, что сообщает хранимка sp_spaceused. Все данные о размере, выдаваемые ей, выводятся в kb, но подстрока " KB" удаляется, чтоб удобней было обрабатывать выхлоп в том же Excel
Цитата:
Сообщение от Didukh84
а где можно его можно найти
для 2000 - см. выше Только вот.. Didukh84, Вы УВЕРЕНЫ, что Вам надо запускать эту процедуру? У Вас RecId перескочил за maxint() или Вы таким образом пытаетесь решить какие-то другие проблемы?
__________________
-ТСЯ или -ТЬСЯ ? |
|