Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

Я знаю есть debug panel. Но если заглянуть в неё, то там отображается большое количество разных запросов. Полагаю много служебных, не относящихся к делу (всякие запросы к схемам например.)

Как можно вывести на странице только запросы, которые относятся непосредственно к приложению, которые ДЕЙСТВИТЕЛЬНО происходят? Например если я в контроллере писал
User::findAll() и Menu::findAll(), то и выводилось чтоб

Код: Выделить всё

SELECT * FROM user
и

Код: Выделить всё

SELECT * FROM menu
. А то я не могу пока понять на сколько эффективно работает приложение и что потом надо будет оптимизировать.

Желательно не используя панель, а просто например в конце layout. Или хотя бы как в панели отфильтровать?
Подскажите пожалуйста

И кстати, эти запросы будут всегда выполняться? А то мне зачем эти портянки кода вида

Код: Выделить всё

SELECT
    d.nspname AS table_schema,
    c.relname AS table_name,
    a.attname AS column_name,
    COALESCE(td.typname, tb.typname, t.typname) AS data_type,
    COALESCE(td.typtype, tb.typtype, t.typtype) AS type_type,
    a.attlen AS character_maximum_length,
    pg_catalog.col_description(c.oid, a.attnum) AS column_comment,
    a.atttypmod AS modifier,
    a.attnotnull = false AS is_nullable,
    CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,
    coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc,
    CASE WHEN COALESCE(td.typtype, tb.typtype, t.typtype) = 'e'::char
        THEN array_to_string((SELECT array_agg(enumlabel) FROM pg_enum WHERE enumtypid = COALESCE(td.oid, tb.oid, a.atttypid))::varchar[], ',')
        ELSE NULL
    END AS enum_values,
    CASE atttypid
         WHEN 21 /*int2*/ THEN 16
         WHEN 23 /*int4*/ THEN 32
         WHEN 20 /*int8*/ THEN 64
         WHEN 1700 /*numeric*/ THEN
              CASE WHEN atttypmod = -1
               THEN null
               ELSE ((atttypmod - 4) >> 16) & 65535
               END
         WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
         WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
         ELSE null
      END   AS numeric_precision,
      CASE
        WHEN atttypid IN (21, 23, 20) THEN 0
        WHEN atttypid IN (1700) THEN
        CASE
            WHEN atttypmod = -1 THEN null
            ELSE (atttypmod - 4) & 65535
        END
           ELSE null
      END AS numeric_scale,
    CAST(
             information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
             AS numeric
    ) AS size,
    a.attnum = any (ct.conkey) as is_pkey,
    COALESCE(NULLIF(a.attndims, 0), NULLIF(t.typndims, 0), (t.typcategory='A')::int) AS dimension
FROM
    pg_class c
    LEFT JOIN pg_attribute a ON a.attrelid = c.oid
    LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
    LEFT JOIN pg_type t ON a.atttypid = t.oid
    LEFT JOIN pg_type tb ON (a.attndims > 0 OR t.typcategory='A') AND t.typelem > 0 AND t.typelem = tb.oid OR t.typbasetype > 0 AND t.typbasetype = tb.oid
    LEFT JOIN pg_type td ON t.typndims > 0 AND t.typbasetype > 0 AND tb.typelem = td.oid
    LEFT JOIN pg_namespace d ON d.oid = c.relnamespace
    LEFT JOIN pg_constraint ct ON ct.conrelid = c.oid AND ct.contype = 'p'
WHERE
    a.attnum > 0 AND t.typname != ''
    AND c.relname = 'user'
    AND d.nspname = 'public'
ORDER BY
    a.attnum;
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение ElisDN »

Включите enableSchemaCache и все служебные пропадут.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

ElisDN писал(а): 2019.03.05, 11:38 Включите enableSchemaCache и все служебные пропадут.
Спасибо. Но вот смотрю и всё-таки много чего лишнего. Неужели это такая особенность работы движка?

Приведу один из примеров. Еетод контроллера Create , в котором берется модель и отдается во view:

Код: Выделить всё

$model = new ControlSystem();
return $this->render('create', [
     'model' => $model,
]);
потом в представлении:

Код: Выделить всё

    <?= $this->render('_form', [
        'model' => $model,
    ]) ?>
и в форме есть строка для ActiveForm:

Код: Выделить всё

<?= $form->field($model, 'object_id')->textInput(['maxlength' => true, 'disabled' => true]) ?>
В результате мне из-за неё выдает:

Код: Выделить всё

SELECT
    d.nspname AS table_schema,
    c.relname AS table_name,
    a.attname AS column_name,
    COALESCE(td.typname, tb.typname, t.typname) AS data_type,
    COALESCE(td.typtype, tb.typtype, t.typtype) AS type_type,
    a.attlen AS character_maximum_length,
    pg_catalog.col_description(c.oid, a.attnum) AS column_comment,
    a.atttypmod AS modifier,
    a.attnotnull = false AS is_nullable,
    CAST(pg_get_expr(ad.adbin, ad.adrelid) AS varchar) AS column_default,
    coalesce(pg_get_expr(ad.adbin, ad.adrelid) ~ 'nextval',false) AS is_autoinc,
    CASE WHEN COALESCE(td.typtype, tb.typtype, t.typtype) = 'e'::char
        THEN array_to_string((SELECT array_agg(enumlabel) FROM pg_enum WHERE enumtypid = COALESCE(td.oid, tb.oid, a.atttypid))::varchar[], ',')
        ELSE NULL
    END AS enum_values,
    CASE atttypid
         WHEN 21 /*int2*/ THEN 16
         WHEN 23 /*int4*/ THEN 32
         WHEN 20 /*int8*/ THEN 64
         WHEN 1700 /*numeric*/ THEN
              CASE WHEN atttypmod = -1
               THEN null
               ELSE ((atttypmod - 4) >> 16) & 65535
               END
         WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
         WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
         ELSE null
      END   AS numeric_precision,
      CASE
        WHEN atttypid IN (21, 23, 20) THEN 0
        WHEN atttypid IN (1700) THEN
        CASE
            WHEN atttypmod = -1 THEN null
            ELSE (atttypmod - 4) & 65535
        END
           ELSE null
      END AS numeric_scale,
    CAST(
             information_schema._pg_char_max_length(information_schema._pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
             AS numeric
    ) AS size,
    a.attnum = any (ct.conkey) as is_pkey,
    COALESCE(NULLIF(a.attndims, 0), NULLIF(t.typndims, 0), (t.typcategory='A')::int) AS dimension
FROM
    pg_class c
    LEFT JOIN pg_attribute a ON a.attrelid = c.oid
    LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
    LEFT JOIN pg_type t ON a.atttypid = t.oid
    LEFT JOIN pg_type tb ON (a.attndims > 0 OR t.typcategory='A') AND t.typelem > 0 AND t.typelem = tb.oid OR t.typbasetype > 0 AND t.typbasetype = tb.oid
    LEFT JOIN pg_type td ON t.typndims > 0 AND t.typbasetype > 0 AND tb.typelem = td.oid
    LEFT JOIN pg_namespace d ON d.oid = c.relnamespace
    LEFT JOIN pg_constraint ct ON ct.conrelid = c.oid AND ct.contype = 'p'
WHERE
    a.attnum > 0 AND t.typname != ''
    AND c.relname = 'control_system'
    AND d.nspname = 'public'
ORDER BY
    a.attnum;

Это так и задумано? Зачем это? Мне с этим надо бороться или это не страшно?
frid-karatel
Сообщения: 50
Зарегистрирован: 2017.03.06, 15:37
Откуда: Владивосток

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение frid-karatel »

Профайлер на то и профайлер, чтобы отображать все запросы к СУБД.
Бороться - выше написали, что кэшировать схему.

Исключить их - никак, потому что единый обработчик, грубо говоря, событие при DbCommand::execute().

Можно, конечно, переопределить конкретный блокпрофайлера и фильтровать только нужные именно вам.
Но, в случае с кэшем схемы, в этом не будет необходимости.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

frid-karatel писал(а): 2019.03.05, 16:11 Профайлер на то и профайлер, чтобы отображать все запросы к СУБД.
Бороться - выше написали, что кэшировать схему.

Исключить их - никак, потому что единый обработчик, грубо говоря, событие при DbCommand::execute().

Можно, конечно, переопределить конкретный блокпрофайлера и фильтровать только нужные именно вам.
Но, в случае с кэшем схемы, в этом не будет необходимости.
Слегка выходя за рамки топика вопрос: как же тогда оптимизировать систему и мои составленные запросы, если я точно наверняка не могу вывести чисто их? Как это делать? При включенном enableSchemaCache как я привёл пример выше - увы, но не всё убирает.


UPD. кажется понял. суть в log -> traceLevel и его значении
Аватара пользователя
Йож
Сообщения: 574
Зарегистрирован: 2015.08.26, 03:05

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение Йож »

i-programmer писал(а): 2019.03.05, 19:07 как же тогда оптимизировать систему и мои составленные запросы
Во встроенном дебагере ведь есть таймлайн и время, потраченное на запросы? Еще и в визуальном виде..
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

Йож писал(а): 2019.03.06, 01:06
i-programmer писал(а): 2019.03.05, 19:07 как же тогда оптимизировать систему и мои составленные запросы
Во встроенном дебагере ведь есть таймлайн и время, потраченное на запросы? Еще и в визуальном виде..
Да, только, если вы читали сам изначальный вопрос и суть проблемы, то было бы понятно, что было невозможно увидеть все эти таймлайны и время запросов при невозможности распознать непосредственно эти самые свои запросы, относящиеся к делу, без остальных портянок. И вопрос "а как тогда оптимизировать" относился именно к такому случаю, когда искать было непонятно где неизвестно что.

Но в целом, направление куда копать я уже выяснил чуть выше (log -> traceLevel).
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение ElisDN »

i-programmer писал(а): 2019.03.05, 14:52 Это так и задумано? Зачем это? Мне с этим надо бороться или это не страшно?
А сам кэш точно работает?
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

ElisDN писал(а): 2019.03.06, 14:59
i-programmer писал(а): 2019.03.05, 14:52 Это так и задумано? Зачем это? Мне с этим надо бороться или это не страшно?
А сам кэш точно работает?
Как это узнать? В папку /runtime/cache и /runtime/debug, что-то записывается. Права стоят 777 и владелец: user:www-data.

Конфиги:

в конфиге:

Код: Выделить всё

'components' => [        
        'cache' => [
            'class' => 'yii\caching\FileCache',
	        'cachePath' => '@runtime/cache',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => [
            'class' => 'yii\db\Connection',
            'charset' => 'utf8',
        ],
    ],
	
конфиг-local:

Код: Выделить всё

$config = [
    'components' => [
        'db' => [
            'dsn' => $db['dsn'],
            'username' => $db['username'],
            'password' => $db['password'],
        ],	    
	    'log' => [
		    'traceLevel' => 0,
	    ],
    ],
];

return $config;
db.php

<?php

Код: Выделить всё

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'pgsql:host=localhost;dbname=test',
    'username' => 'username',
    'password' => 'password',
    'charset' => 'utf8',

    // Schema cache options (for production environment)
    'enableSchemaCache' => true,
    //'schemaCacheDuration' => 60,
    //'schemaCache' => 'cache',
];
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение someweb »

Ну вы красиво передаете параметры. enableSchemaCache не используете.

Код: Выделить всё

$config = [
    'components' => [
        'db' => $db
	    'log' => [
		    'traceLevel' => 0,
	    ],
    ],
];
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

someweb писал(а): 2019.03.29, 09:45 Ну вы красиво передаете параметры. enableSchemaCache не используете.

Код: Выделить всё

$config = [
    'components' => [
        'db' => $db
	    'log' => [
		    'traceLevel' => 0,
	    ],
    ],
];
я не понимаю. Значение traceLevel какое в итоге должно быть? У меня что 0, что 3 - ничего не дают, хотя 0, как я понимаю, должен был убрать всё лишнее. Или нет?
какой должен быть правильный конфиг?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение someweb »

Да не в traceLevel дело, а в $db. Вы не устанавливаете enableSchemaCache.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

someweb писал(а): 2019.03.29, 10:35 Да не в traceLevel дело, а в $db. Вы не устанавливаете enableSchemaCache.
а как же 'enableSchemaCache' => true,? Похоже я балда не раскомментировал 'schemaCache' => 'cache', и в этом дело?))
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение someweb »

Нет, у вас

Код: Выделить всё

        'db' => [
            'dsn' => $db['dsn'],
            'username' => $db['username'],
            'password' => $db['password'],
        ],	    
Вы берете из $db только dsn, username и пароль, а enableSchemaCache остается за кадром.
Т. е. вам надо сделать 'db' => $db или дополнительно передать enableSchemaCache

Код: Выделить всё

        'db' => [
            'dsn' => $db['dsn'],
            'username' => $db['username'],
            'password' => $db['password'],
            'enableSchemaCache' => $db[ 'enableSchemaCache' ],
        ],	    
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение i-programmer »

someweb писал(а): 2019.03.29, 10:43 Нет, у вас

Код: Выделить всё

        'db' => [
            'dsn' => $db['dsn'],
            'username' => $db['username'],
            'password' => $db['password'],
        ],	    
Вы берете из $db только dsn, username и пароль, а enableSchemaCache остается за кадром.
Т. е. вам надо сделать 'db' => $db или дополнительно передать enableSchemaCache

Код: Выделить всё

        'db' => [
            'dsn' => $db['dsn'],
            'username' => $db['username'],
            'password' => $db['password'],
            'enableSchemaCache' => $db[ 'enableSchemaCache' ],
        ],	    
Да, да, я тоже это уже замети, поправил.. Спасибо.
Последний вопрос, немного не по теме-по теме. На что влияет traceLevel
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?

Сообщение someweb »

$traceLevel public property

How many application call stacks should be logged together with each message. This method returns the value of yii\log\Logger::$traceLevel. Defaults to 0.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Закрыто