Skip to content

Commit 959437a

Browse files
committed
MC-17929: 2.3.2 - Product Flat Data index taking long time to reindex?
1 parent c9338ad commit 959437a

File tree

1 file changed

+43
-45
lines changed

1 file changed

+43
-45
lines changed

app/code/Magento/Catalog/Model/Indexer/Product/Flat/TableBuilder.php

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
namespace Magento\Catalog\Model\Indexer\Product\Flat;
77

88
use Magento\Catalog\Model\Indexer\Product\Flat\Table\BuilderInterfaceFactory;
9+
use Magento\Store\Model\Store;
910

1011
/**
1112
* Class TableBuilder
13+
*
14+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1215
*/
1316
class TableBuilder
1417
{
@@ -272,75 +275,70 @@ protected function _fillTemporaryTable(
272275
$valueFieldSuffix,
273276
$storeId
274277
) {
275-
$metadata = $this->getMetadataPool()->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
276278
if (!empty($tableColumns)) {
277-
$columnsChunks = array_chunk(
278-
$tableColumns,
279-
Action\Indexer::ATTRIBUTES_CHUNK_SIZE,
280-
true
281-
);
279+
$columnsChunks = array_chunk($tableColumns, Action\Indexer::ATTRIBUTES_CHUNK_SIZE / 2, true);
280+
281+
$entityTableName = $this->_productIndexerHelper->getTable('catalog_product_entity');
282+
$entityTemporaryTableName = $this->_getTemporaryTableName($entityTableName);
283+
$temporaryTableName = $this->_getTemporaryTableName($tableName);
284+
$temporaryValueTableName = $temporaryTableName . $valueFieldSuffix;
285+
$attributeOptionValueTableName = $this->_productIndexerHelper->getTable('eav_attribute_option_value');
286+
287+
$flatColumns = $this->_productIndexerHelper->getFlatColumns();
288+
$defaultStoreId = Store::DEFAULT_STORE_ID;
289+
$linkField = $this->getMetadataPool()
290+
->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class)
291+
->getLinkField();
292+
282293
foreach ($columnsChunks as $columnsList) {
283294
$select = $this->_connection->select();
284295
$selectValue = $this->_connection->select();
285-
$entityTableName = $this->_getTemporaryTableName(
286-
$this->_productIndexerHelper->getTable('catalog_product_entity')
287-
);
288-
$temporaryTableName = $this->_getTemporaryTableName($tableName);
289-
$temporaryValueTableName = $temporaryTableName . $valueFieldSuffix;
290-
$keyColumn = array_unique([$metadata->getLinkField(), 'entity_id']);
296+
$keyColumn = array_unique([$linkField, 'entity_id']);
291297
$columns = array_merge($keyColumn, array_keys($columnsList));
292298
$valueColumns = $keyColumn;
293-
$flatColumns = $this->_productIndexerHelper->getFlatColumns();
294299
$iterationNum = 1;
295300

296-
$select->from(['et' => $entityTableName], $keyColumn)
297-
->join(
298-
['e' => $this->resource->getTableName('catalog_product_entity')],
299-
'e.entity_id = et.entity_id',
300-
[]
301-
);
301+
$select->from(['et' => $entityTemporaryTableName], $keyColumn)
302+
->join(['e' => $entityTableName], 'e.entity_id = et.entity_id', []);
302303

303304
$selectValue->from(['e' => $temporaryTableName], $keyColumn);
304305

305306
/** @var $attribute \Magento\Catalog\Model\ResourceModel\Eav\Attribute */
306307
foreach ($columnsList as $columnName => $attribute) {
307308
$countTableName = 't' . ($iterationNum++);
308-
$joinCondition = sprintf(
309-
'e.%3$s = %1$s.%3$s' .
310-
' AND %1$s.attribute_id = %2$d' .
311-
' AND (%1$s.store_id = %4$d' .
312-
' OR %1$s.store_id = 0)',
313-
$countTableName,
314-
$attribute->getId(),
315-
$metadata->getLinkField(),
316-
$storeId
317-
);
318-
309+
$joinCondition = 'e.%3$s = %1$s.%3$s AND %1$s.attribute_id = %2$d AND %1$s.store_id = %4$d';
319310
$select->joinLeft(
320311
[$countTableName => $tableName],
321-
$joinCondition,
322-
[$columnName => 'value']
312+
sprintf($joinCondition, $countTableName, $attribute->getId(), $linkField, $defaultStoreId),
313+
[]
314+
)->joinLeft(
315+
['s' . $countTableName => $tableName],
316+
sprintf($joinCondition, 's' . $countTableName, $attribute->getId(), $linkField, $storeId),
317+
[]
323318
);
324319

320+
$columnValue = $this->_connection->getIfNullSql(
321+
's' . $countTableName . '.value',
322+
$countTableName . '.value'
323+
);
324+
$select->columns([$columnName => $columnValue]);
325+
325326
if ($attribute->getFlatUpdateSelect($storeId) instanceof \Magento\Framework\DB\Select) {
326327
$attributeCode = $attribute->getAttributeCode();
327328
$columnValueName = $attributeCode . $valueFieldSuffix;
328329
if (isset($flatColumns[$columnValueName])) {
329-
$valueJoinCondition = sprintf(
330-
'e.%1$s = %2$s.option_id AND (%2$s.store_id = %3$d OR %2$s.store_id = 0)',
331-
$attributeCode,
332-
$countTableName,
333-
$storeId
334-
);
330+
$valueJoinCondition = 'e.%1$s = %2$s.option_id AND %2$s.store_id = %3$d';
335331
$selectValue->joinLeft(
336-
[
337-
$countTableName => $this->_productIndexerHelper->getTable(
338-
'eav_attribute_option_value'
339-
),
340-
],
341-
$valueJoinCondition,
342-
[$columnValueName => $countTableName . '.value']
332+
[$countTableName => $attributeOptionValueTableName],
333+
sprintf($valueJoinCondition, $attributeCode, $countTableName, $defaultStoreId),
334+
[]
335+
)->joinLeft(
336+
['s' . $countTableName => $attributeOptionValueTableName],
337+
sprintf($valueJoinCondition, $attributeCode, 's' . $countTableName, $storeId),
338+
[]
343339
);
340+
341+
$selectValue->columns([$columnValueName => $columnValue]);
344342
$valueColumns[] = $columnValueName;
345343
}
346344
}

0 commit comments

Comments
 (0)