Блог Николая Семенцова

Партнер компании 1с-битрикс

Большая таблица b_sale_basket_props

На днях было обнаружено что таблица b_sale_basket_props  просто очень огромная, занимала 4гб, почему от туда не удалялись старые свойства, необходимо было чистить.
Так как в ней были свойства которые связаны с корзинами на сайте, было необходимо их оставить. Я создал таблицу  b_sale_basket_props_new  с помощью SQL запроса
create table b_sale_basket_props_new
(
    ID int not null auto_increment,
    BASKET_ID int not null,
    NAME varchar(255) not null,
    VALUE varchar(255) null,
    CODE varchar(255) null,
    SORT int not null default '100',
    primary key (ID),
    index IXS_BASKET_PROPS_BASKET(BASKET_ID),
    index IXS_BASKET_PROPS_CODE(CODE)
);

Его я выполнил, расположив этот код в файле который расположил в папке  /about/props.sql. Далее перенес свойства корзин в отдельную таблицу вот таким кодом.

if(!$DB->Query("SELECT 'x' FROM table b_sale_basket_props_new", true))
{
    $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/about/props.sql");
}  

CModule::IncludeModule('sale'); 
//функция что бы достать все корзины
function GetAllBasket() {

    $obCache = new CPHPCache();
    $cache_dir = '/proposbasket';
    $cache_id = 'proposbasket|1|'.$IBLOCK_ID;  
    if( $obCache->InitCache(1800,$cache_id,$cache_dir))// Если кэш валиден
    {
        $vars = $obCache->GetVars();// Извлечение переменных из кэша   
    }
    elseif(CModule::IncludeModule("sale") && $obCache->StartDataCache())// Если кэш невалиден
    {     
        global $CACHE_MANAGER;
        $CACHE_MANAGER->StartTagCache($cache_dir);             
        $vars = array();
        $dbBasketItems = CSaleBasket::GetList(
                array("NAME" => "ASC", "ID" => "ASC"),
                array(),
                false,
                false,
                array("ID")
            );
        while ($arItems = $dbBasketItems->Fetch())
        {
            $vars[$arItems['ID']] = $arItems;    
        }
        $CACHE_MANAGER->RegisterTag('proposbasket');
        $CACHE_MANAGER->EndTagCache();           
           
        $obCache->StartDataCache();       
        $obCache->EndDataCache($vars);// Сохраняем переменные в кэш.   
    }
    return $vars;      
}
// сохранение в новую корзину      
function AddBasketPropsNew($arFields)
{
    global $DB;
    $arInsert = $DB->PrepareInsert("b_sale_basket_props_new", $arFields);
    $strSql =
            "INSERT INTO b_sale_basket_props_new(".$arInsert[0].") ".
            "VALUES(".$arInsert[1].")";
    $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);       
    $ID = IntVal($DB->LastID());
    return $ID;
}    
 

//достанем корзины     
$arBasket = GetAllBasket();
// выполним запрос             
$strSql = "SELECT * FROM b_sale_basket_props ORDER BY id ASC LIMIT 60000000";
$dbRes = $DB->Query($strSql, true);
 
while($arRes = $dbRes->Fetch()) {
   if(isset($arBasket[$arRes['BASKET_ID']])){
        AddBasketPropsNew($arRes);   
   }     
} 

Далее соответственно удалил старую таблицу и создал новую.



Опубликовано: 17 декабря 2013




Помогла заметка? Жмите кнопки ниже


ВКонтакт Facebook Google Plus Одноклассники Twitter Livejournal Liveinternet Mail.Ru





comments powered by Disqus