Мир всем!
Информация
- PHP version 8.0.5 (with OPcache)
- Symfony version 5.2.9
- PostgreSQL version 13.2
Недавно в Symfony Profiler начал наблюдать неадекватно большое количество "не моих" запросов.
Query Metrics
- Different statements: 12
- Database Queries: 29
- Query time: 131.26 ms
- Invalid entities: 0
Вот собственно этот запрос, который выполняется
18 раз (68.62 ms), а моих всего
11 = 61% от общего числа запросов увеличивая время загрузки страницы в 2 раза:
SELECT
quote_ident(table_name) AS table_name,
table_schema AS schema_name
FROM
information_schema.tables
WHERE
table_schema NOT LIKE 'pg\_%'
AND table_schema != 'information_schema'
AND table_name != 'geometry_columns'
AND table_name != 'spatial_ref_sys'
AND table_type != 'VIEW'
доп.а на другой странице сайта например тот же запрос выполняется 87 раз (272.20 ms) из 119 = 73% от общего числа запросов
А вот собственно сама функция находящаяся в файле "vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/PostgreSqlPlatform.php":
<?php
namespace Doctrine\DBAL\Platforms
...
/**
* {@inheritDoc}
*/
public function getListTablesSQL()
{
return "SELECT quote_ident(table_name) AS table_name,
table_schema AS schema_name
FROM information_schema.tables
WHERE table_schema NOT LIKE 'pg\_%'
AND table_schema != 'information_schema'
AND table_name != 'geometry_columns'
AND table_name != 'spatial_ref_sys'
AND table_type != 'VIEW'";
}
Вызов функции идёт судя по всему из файла "vendor/doctrine/dbal/lib/Doctrine/DBAL/Schema/AbstractSchemaManager.php":
<?php
namespace Doctrine\DBAL\Schema;
...
/**
* Returns a list of all tables in the current database.
*
* @return string[]
*/
public function listTableNames()
{
$sql = $this->_platform->getListTablesSQL();
$tables = $this->_conn->fetchAllAssociative($sql);
$tableNames = $this->_getPortableTablesList($tables);
return $this->filterAssetNames($tableNames);
}
Я конечно понимаю, что функция нужна, но зачем её вызывать столько раз...
Я сам конечно покапаю ещё (и напишу сюда ответ, если найду), но вдруг может кто-то уже сталкивался.
А может это не баг, а фича? )))
UPDATE 1 [
bkosun ]:
Файл config/packages/doctrine.yaml
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '13'
orm:
auto_generate_proxy_classes: true
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping: true
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
Файл config/packages/prod/doctrine.yaml
doctrine:
orm:
auto_generate_proxy_classes: false
metadata_cache_driver:
type: pool
pool: doctrine.system_cache_pool
query_cache_driver:
type: pool
pool: doctrine.system_cache_pool
result_cache_driver:
type: pool
pool: doctrine.result_cache_pool
framework:
cache:
pools:
doctrine.result_cache_pool:
adapter: cache.app
doctrine.system_cache_pool:
adapter: cache.system
Файл config/packages/test/doctrine.yaml
doctrine:
dbal:
# "TEST_TOKEN" is typically set by ParaTest
dbname: 'main_test%env(default::TEST_TOKEN)%'
UPDATE 2:
Немного странно, что запросы в файле dev.log иду подряд. Как-будто идёт проверка всех сущностей.
var/log/dev.log
[2021-05-30T21:30:47.379890+00:00] doctrine.DEBUG: SELECT quote_ident(table_name) AS table_name, table_schema AS schema_name FROM information_schema.tables WHERE table_schema NOT LIKE 'pg\_%' AND table_schema != 'information_schema' AND table_name != 'geometry_columns' AND table_name != 'spatial_ref_sys' AND table_type != 'VIEW' [] []
[2021-05-30T21:30:47.383223+00:00] doctrine.DEBUG: SELECT quote_ident(table_name) AS table_name, table_schema AS schema_name FROM information_schema.tables WHERE table_schema NOT LIKE 'pg\_%' AND table_schema != 'information_schema' AND table_name != 'geometry_columns' AND table_name != 'spatial_ref_sys' AND table_type != 'VIEW' [] []
...
[2021-05-30T21:30:47.838119+00:00] doctrine.DEBUG: SELECT quote_ident(table_name) AS table_name, table_schema AS schema_name FROM information_schema.tables WHERE table_schema NOT LIKE 'pg\_%' AND table_schema != 'information_schema' AND table_name != 'geometry_columns' AND table_name != 'spatial_ref_sys' AND table_type != 'VIEW' [] []