Дано — 10_000 нод с 10-ю текстовыми полями в каждой.
Код теста:
<?php
use Drupal\Component\Utility\Timer;
use Drupal\Core\Database\Database;
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$nodes_ids = $node_storage->getQuery()
->condition('type', 'article')
->sort('nid')
->range(0, 1000)
->accessCheck(FALSE)
->execute();
Database::startLog('test');
$query_count = count(\Drupal::database()->getLogger()->get('test'));
Timer::start('test');
if ($extra[0] == 'load') {
foreach ($nodes_ids as $node_id) {
$node_storage->load($node_id);
}
}
if ($extra[0] == 'loadMultiple') {
$node_storage->loadMultiple($nodes_ids);
}
$time = Timer::read('test');
$query_count = count(\Drupal::database()->getLogger()->get('test')) - $query_count;
echo <<<OUTPUT
time: $time ms
queries: $query_count
OUTPUT;
Запуск через drush php:script snippets/test.php <test-type>.
Результаты:
| Время выполнения | Число SQL запросов | |
|---|---|---|
С пустой таблицей cache_entity |
||
load() |
5900 ms | 15009 |
loadMultiple() |
1000 ms | 33 |
С прогретой таблицей cache_entity |
||
load() |
260 ms | 1001 |
loadMultiple() |
60 ms | 2 |
Выводы — везде, где нужно загрузить несколько сущностей, надо использовать loadMultiple(), он гораздо эффективнее как по времени выполнения так и по числу sql запросов.
Написанное актуально для
Drupal 11.2
Похожие записи
- Производительность Entity Query vs Query Builder vs Sql query
- Отличие методов BaseFieldDefinition::setDefaultValue() и BaseFieldDefinition::setInitialValue()
- Производительность Drupal::token()->replace() vs strtr() vs inline_template
- Тест оверхеда Layout Builder и Paragraphs
- Добавить своё действие над сущностью в bulk operations
Добавить комментарий