마 젠토 : 제품 속성을 업데이트하는 가장 빠른 방법


15

대량 속성 업데이트를위한 가장 빠르고 안정적인 방법을 찾고 있습니다. 다음은 알고있는 방법이지만 어떤 방법을 사용 해야할지 모르겠습니다.

$store_id = 0;
Mage::getSingleton('catalog/product_action')->updateAttributes(
    array($product_id),
    array('attribute_code' => $attribute_code),
    $store_id
);

또는

$product->setData($attribute_code, 1234); 
$product->getResource()->saveAttribute($product, $attribute_code); 

답변:


31

가장 빠른 방법은 데이터베이스에서 직접 선택 및 삽입 / 업데이트를 수행하는 것이지만 가장 안전하지는 않습니다. 물건을 쉽게 깰 수 있습니다.

나는 그 Mage::getSingleton('catalog/product_action')->updateAttributes(...)접근법을 사용한다 .
빠르고, 제품 속성을 대량 업데이트하는 데 사용할 수 있으며, 특정 상점의 속성 값을 업데이트 할 수 있습니다.
나는 그것이 필요한 대부분의 경우를 다룬다 고 생각합니다.


고마워 marius 난 당신의 응답을 기대하고 있었다, btw 당신의 궁극적 인 모듈 제작자는 쿨
— Deepak Mallah

1
실제로 가장 빠른 선택은 아닙니다 ... 아래 답변을 확인하십시오
— Fra

@Fra 방법이 얼마나 빠릅니까? 관련이 load있습니다. 빠르지 않은 것. 예를 들어, 방법 2에서 제품로드가있는 첫 번째 라인은 쓸모가 없습니다. 당신은 $product어디에도 사용하지 않습니다 .
— Marius

@ 프라. 누군가의 대답을 공감할 때 이유를 밝히는 것이 좋습니다. 내 대답에 어떤 문제가 있습니까?
— Marius

1
나는 당신의 대답에 대해 똑같은 것을 말할 수 있습니다 ... 그것은 가장 빠른 방법은 아닙니다. 직접 SQL 쿼리가 가장 빠른 방법입니다. 나는 당신의 이유가 하향 투표에 충분하다고 생각하지 않습니다. 그러나 귀하는 귀하의 의견에 대한 권리가 있습니다.
— Marius

27

실제로 전체 제품을 저장하지 않고 제품의 속성을 업데이트하는 3 가지 방법이 있습니다. 코드 / 요구 사항에 따라 다른 것보다 빠를 수 있습니다.

방법 1 :

$product = Mage::getModel('catalog/product')->load($product_id);
$resource = $product->getResource();

$product->setData($attribue_code, $value);
$resource->saveAttribute($product, $attribute_code);

방법 2 :

$updater = Mage::getSingleton('catalog/product_action');
$updater->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

방법 3 : (가장 빠름)

 $update_resource = Mage::getResourceSingleton('catalog/product_action');
 $update_resource->updateAttributes(array($product_id), array( $attribute_code => $value), 0);

위의 모든 방법은 훨씬 빠릅니다. 어쨌든 주요 성능 차이가 있습니다.

Method 1:

  • 가장 빠르지 만 제품을로드해야합니다.
  • 재색 인 이벤트를 트리거하지 않습니다 (그래서 더 빠릅니다)
  • 프론트 엔드에서 작동합니다

Method 2:

  • 제품을 대량으로 업데이트
    할 수 있습니다 (여러 제품 및 여러 속성을 전달할 수 있음)
  • 대중 행동 이벤트 와 상대 의존성 재 색인을 트리거합니다.
  • 프론트 엔드에서 작동하지 않습니다

Method 3:

  • 방법 2와 비슷하지만 다른 옵저버 / 인덱서를 호출하지 않습니다
    (따라서 방법 1과 2 사이의 혼합 된 접근 방식)

방법 3은 어쨌든 해당 제품 / 속성을 수동으로 재 인덱싱해야하는보다 유연한 방법입니다. (프론트 엔드
에서 업데이트하려면) 많은 제품을 빠르게 업데이트 한 다음 마지막에 재 색인을 호출하려는 경우 유용 할 수 있습니다.
(방법 2를 사용하는 경우 업데이트 후 각 제품에 대한 재 색인이 호출되며 이러한 여러 호출로 인해 전체 프로세스가 느려집니다)

단일 제품을 수동으로 재 색인하려면 Mage_Catalog_Model_Product_Flat_Indexer에서 제공하는 기능을 참조하십시오 .

  • updateAttribute($attributeCode, $store = null, $productIds = null)
  • updateProduct($productIds, $store = null)
  • ...

4
항상 downvote를 언급하는 것이 좋습니다 ...
— Fra

간단히
— 말해

흠. 방법 2는 훌륭하게 들립니다. '피드백'에 대한 통제권이 없습니다. 성공한 것은 무엇입니까? 방법 1도 좋습니다. 그러나 루프 오버 데이터 업데이트가 완료되면 수동으로 재 색인을 생성하여 특정 제품 ID에 대해이 문제를 해결할 수 있습니까?
— snh_nl

이상한. 방법 2를 사용합니다.```열에 의해 오류 알 수없는 필터가 나타납니다. 예외 : SQLSTATE [42S22] : 열을 찾을 수 없습니다 : 1054 'field list'에서 알 수없는 'catalog_product_entity.value_id'열, 쿼리 : SELECT catalog_product_entity. value_idFROM catalog_product_entityWHERE (entity_type_id = 4 AND은 attribute_id = '68 'AND ENTITY_ID = '29')```그 기대하지. 1.9.3.2에서 실행
— snh_nl

1
작업 시간을 절약했습니다.
— dipole_moment

3

최신 정보

대량 속성 업데이트를위한 가장 빠르고 안정적인 방법을 찾고 있습니다

속성 또는 제품에 대한 "대량 속성 업데이트"?

여러 속성을 업데이트하는 것은 이미 답변되었지만 제품의 경우 유용 할 수 있습니다 ...

컬렉션에서 제품을 업데이트하려면이 작업을 수행하지 않아야합니다 ...

foreach ($collection as $product) {
    $product->setSomeData(...);
    # not here
    $product->save();
}

이벤트를 전달하고 가격 규칙 및 인덱스를 다시 작성합니다. 이것으로 이벤트 (및 다른 것들)를 건너 뛰지 않고 훨씬 빠릅니다.

foreach ($collection as $product) {
    $product->setSomeData(...);
}
$collection->save();

가격 규칙 업데이트를 피하기 위해 다음을 추가 할 수 있습니다 ...

$product->setIsMassupdate(true);

재 인덱싱을 즉시 비활성화 / 활성화하려면 이것을보십시오 ... https://github.com/Flagbit/Magento-ChangeAttributeSet/commit/676f3af77fec880bc64333403675d183e8639fae

/**
 * Set indexer modes to manual
 */
private function _storeRealtimeIndexer()
{
    $collection = Mage::getSingleton('index/indexer')->getProcessesCollection();
    foreach ($collection as $process) {
        if($process->getMode() != Mage_Index_Model_Process::MODE_MANUAL){
            $this->_index[] = $process->getIndexerCode();
            $process->setData('mode', Mage_Index_Model_Process::MODE_MANUAL)->save();
        }
    }

}
/**
 * Restore indexer modes to realtime an reindex product data
 */
private function _restoreRealtimeIndexer()
{
    $reindexCodes = array(
        'catalog_product_attribute',
        'catalog_product_flat'
    );
    $indexer = Mage::getSingleton('index/indexer');
    foreach ($this->_index as $code) {
        $process = $indexer->getProcessByCode($code);
        if (in_array($code, $reindexCodes)) {
            $process->reindexAll();
        }
        $process->setData('mode', Mage_Index_Model_Process::MODE_REAL_TIME)->save();
    }
}

또한 대량 (제품) 업데이트 전에 캐시를 플러시하면 성능이 향상 될 수 있습니다 ...

Mage::app()->getCacheInstance()->flush();

여기에서 디버깅의 일부 숫자 : https://github.com/Flagbit/Magento-ChangeAttributeSet/issues/16


Mage::getSingleton('catalog/product_action')->updateAttributes(...) 적어도 mutlistore 설정 및 플랫 테이블이 켜져 있지 않은 경우 가장 빠른 방법은 아닙니다 ...

  • saveAttribute()

    $product = Mage::getModel('catalog/product')->load($productId);
    $resource = $product->getResource();
    $product->setData($attributeCode, $attributeValue);
    $resource->saveAttribute($product, $attributeCode);
    • 총계 월 시간 (마이크로 초) : 437,787 마이크로 초
    • 총계 CPU (마이크로 초) : 423,600 마이크로 초
    • 총계 MemUse (바이트) : 4,433,848 바이트
    • 총계 PeakMemUse (바이트) : 4,395,128 바이트
    • 함수 호출 수 : 25,711
  • updateAttributes()

    Mage::getSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array($attributeCode => $attributeValue),
        $storeId
    );
    • 총계 월 시간 (마이크로 초) : 3,676,950 마이크로 초
    • 총계 CPU (마이크로 초) : 3,122,064 마이크로 초
    • 총계 MemUse (바이트) : 8,174,792 바이트
    • 총계 PeakMemUse (바이트) : 8,199,192 바이트
    • 함수 호출 수 : 150,132
  • updateAttributes() (싱글 톤 리소스)

    Mage::getResourceSingleton('catalog/product_action')->updateAttributes(
        array($productId),
        array( $attributeCode => $attributeValue),
        $storeId
    );
    • 총계 월 시간 (마이크로 초) : 94,155 마이크로 초
    • 총계 CPU (마이크로 초) : 48,568 마이크로 초
    • 총계 MemUse (바이트) : 1,426,304 바이트
    • 총계 PeakMemUse (바이트) : 1,370,456 바이트
    • 함수 호출 수 : 2,221

왜 그 기능이 다른 시간이 걸리는지 이해하기 위해 내 대답을 검토 할 수 있습니다 ...
— Fra

드롭 다운 데이터 updateAttributes() (resource singleton)에 실제 관리자 값이 있습니까? 또는 드롭 다운 요소의 ID? (어쨌든 우리는 항상이 방법을 사용하여 값 / 빈 값을 얻지 못합니다. 즉 아무것도 선택하지 않았습니다
— snh_nl

@ snh_nl 당신은 ID를 사용해야합니다-다중 선택 속성에 대해 쉼표로 구분하십시오.
— sv3n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.