Naziron
@Naziron
Очень хороший мальчик.

Symfony 5.2 + PostgreSQL. Почему неадекватно большое количество запросов к information_schema.tables?

Мир всем!

Информация

  • 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' [] []
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bkosun
Я конечно понимаю, что функция нужна, но зачем её вызывать столько раз...

Скорее всего Вы работаете в режиме разработки или в конфигурации Doctrine не включено кеширование.

https://symfony.com/doc/current/reference/configur...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы