Страница 1 из 1
Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.05, 07:35
i-programmer
Я знаю есть
debug panel. Но если заглянуть в неё, то там отображается большое количество разных запросов. Полагаю много служебных, не относящихся к делу (всякие запросы к схемам например.)
Как можно вывести на странице только запросы, которые относятся непосредственно к приложению, которые ДЕЙСТВИТЕЛЬНО происходят? Например если я в контроллере писал
User::findAll() и
Menu::findAll(), то и выводилось чтоб
и
. А то я не могу пока понять на сколько эффективно работает приложение и что потом надо будет оптимизировать.
Желательно не используя панель, а просто например в конце
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;
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.05, 11:38
ElisDN
Включите enableSchemaCache и все служебные пропадут.
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.05, 14:52
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;
Это так и задумано? Зачем это? Мне с этим надо бороться или это не страшно?
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.05, 16:11
frid-karatel
Профайлер на то и профайлер, чтобы отображать все запросы к СУБД.
Бороться - выше написали, что кэшировать схему.
Исключить их - никак, потому что единый обработчик, грубо говоря, событие при DbCommand::execute().
Можно, конечно, переопределить конкретный блокпрофайлера и фильтровать только нужные именно вам.
Но, в случае с кэшем схемы, в этом не будет необходимости.
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.05, 19:07
i-programmer
frid-karatel писал(а): ↑2019.03.05, 16:11
Профайлер на то и профайлер, чтобы отображать все запросы к СУБД.
Бороться - выше написали, что кэшировать схему.
Исключить их - никак, потому что единый обработчик, грубо говоря, событие при DbCommand::execute().
Можно, конечно, переопределить конкретный блокпрофайлера и фильтровать только нужные именно вам.
Но, в случае с кэшем схемы, в этом не будет необходимости.
Слегка выходя за рамки топика вопрос: как же тогда оптимизировать систему и мои составленные запросы, если я точно наверняка не могу вывести чисто их? Как это делать? При включенном
enableSchemaCache как я привёл пример выше - увы, но не всё убирает.
UPD. кажется понял. суть в
log -> traceLevel и его значении
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.06, 01:06
Йож
i-programmer писал(а): ↑2019.03.05, 19:07
как же тогда оптимизировать систему и мои составленные запросы
Во встроенном дебагере ведь есть таймлайн и время, потраченное на запросы? Еще и в визуальном виде..
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.06, 07:15
i-programmer
Йож писал(а): ↑2019.03.06, 01:06
i-programmer писал(а): ↑2019.03.05, 19:07
как же тогда оптимизировать систему и мои составленные запросы
Во встроенном дебагере ведь есть таймлайн и время, потраченное на запросы? Еще и в визуальном виде..
Да, только, если вы читали сам изначальный вопрос и суть проблемы, то было бы понятно, что было невозможно увидеть все эти таймлайны и время запросов при невозможности распознать непосредственно эти самые свои запросы, относящиеся к делу, без остальных портянок. И вопрос "а как тогда оптимизировать" относился именно к такому случаю, когда искать было непонятно где неизвестно что.
Но в целом, направление куда копать я уже выяснил чуть выше (log -> traceLevel).
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.06, 14:59
ElisDN
i-programmer писал(а): ↑2019.03.05, 14:52
Это так и задумано? Зачем это? Мне с этим надо бороться или это не страшно?
А сам кэш точно работает?
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 09:30
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',
];
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 09:45
someweb
Ну вы красиво передаете параметры. enableSchemaCache не используете.
Код: Выделить всё
$config = [
'components' => [
'db' => $db
'log' => [
'traceLevel' => 0,
],
],
];
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:21
i-programmer
someweb писал(а): ↑2019.03.29, 09:45
Ну вы красиво передаете параметры. enableSchemaCache не используете.
Код: Выделить всё
$config = [
'components' => [
'db' => $db
'log' => [
'traceLevel' => 0,
],
],
];
я не понимаю. Значение
traceLevel какое в итоге должно быть? У меня что 0, что 3 - ничего не дают, хотя 0, как я понимаю, должен был убрать всё лишнее. Или нет?
какой должен быть правильный конфиг?
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:35
someweb
Да не в traceLevel дело, а в $db. Вы не устанавливаете enableSchemaCache.
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:38
i-programmer
someweb писал(а): ↑2019.03.29, 10:35
Да не в traceLevel дело, а в $db. Вы не устанавливаете enableSchemaCache.
а как же
'enableSchemaCache' => true,? Похоже я балда не раскомментировал
'schemaCache' => 'cache', и в этом дело?))
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:43
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' ],
],
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:51
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
Re: Как вывести все SQL запросы страницы ТОЛЬКО приложения?
Добавлено: 2019.03.29, 10:57
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.