Показать сообщение отдельно
Старый 30.01.2018, 00:42   #13  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Может есть еще какой-то критерий, по которому можно отсортировать записи? Например, я удалял данные из неактуальных компаний (наследие предков) таким вот кодом
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 раз медленнее рабочей.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат!