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


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.