Может есть еще какой-то критерий, по которому можно отсортировать записи? Например, я удалял данные из неактуальных компаний (наследие предков) таким вот кодом
X++:
protected void deleteAllNotCurCompany()
{
str sqlStr;
Dictionary dict = new Dictionary();
SysDictTable dictTable;
tableId tableId;
int64 recordCount, recordSum, tableCount;
Common common;
Connection connection = new Connection();
SqlSystem sqlSystem = new SqlSystem();
Statement statement;
int i;
;
progressBar.setText(strfmt("Удаляю таблицы неактуальных компаний (%1) ...", dict.tableCnt()));
progressBar.setTotal(dict.tableCnt(), 2);
for (i=1; i<=dict.tableCnt(); i++)
{
progressBar.incCount(1, 2);
tableId = dict.tableCnt2Id(i);
dictTable = new SysDictTable(tableId);
if (!dictTable || dictTable.isMap() || dictTable.isTmp() || dictTable.isView() || !dictTable.dataPrCompany())
continue;
common = dictTable.makeRecord();
common.disableCache(true);
while select crosscompany count(RecId) from common
group by dataAreaId
{
recordCount = common.RecId;
if (recordCount && !this.isInCurCompany(common.dataAreaId))
{
sqlStr = 'DELETE FROM ' + dictTable.name(DbBackend::Sql);
sqlStr += ' WHERE (' + dictTable.fieldName(fieldnum(common, DataAreaId),DbBackend::Sql);
sqlStr += ' = ' + sqlSystem.sqlLiteral(common.dataAreaId) + ') ';
connection.ttsbegin();
statement = connection.createStatement();
new SqlStatementExecutePermission(sqlStr).assert();
statement.executeUpdate(sqlStr);
connection.ttscommit();
CodeAccessPermission::revertAssert();
recordSum += recordCount;
tableCount++;
}
}
}
info(strfmt("Удалено %1 записей в %2 таблицах неактуальных компаний", recordSum, tableCount));
}
X++:
//BAH Да, если компания текущая или виртуальная в текущей
private boolean isInCurCompany(DataAreaId _dataAreaId)
{
;
if (this.getCompanyFromVirtual(_dataAreaId) == curExt())
return true;
return false;
}
X++:
//BAH186 26.01.2018 Возвращает первую попавшуюся компанию, входящую в состав виртуальной
private DataAreaId getCompanyFromVirtual(DataAreaId _virtual)
{
VirtualDataAreaList virtualDataAreaList;
;
if (this.isVirtual(_virtual))
{
select firstonly virtualDataAreaList
where virtualDataAreaList.virtualDataArea == _virtual;
return virtualDataAreaList.Id ? virtualDataAreaList.Id : "";
}
else
return _virtual;
}
X++:
//BAH186 Да, если компания виртуальная
private boolean isVirtual(DataAreaId _dataAreaId)
{
DataArea dataArea;
boolean ret;
;
select firstonly id from dataArea
where dataArea.id == _dataAreaId &&
dataArea.isVirtual == NoYes::Yes;
if (dataArea)
{
ret = true;
}
return ret;
}
почти 20 млн записей (Удалено 19772500 записей в 403 таблицах неактуальных компаний
) за 1-2 часа (точнее не засекал, отслеживал каждый шаг в дебаггере). И то на тестовой базе, которая в 3-5 раз медленнее рабочей.