Двойные запросы к базе

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
kutsanov
Сообщения: 165
Зарегистрирован: 2012.02.08, 15:22

Двойные запросы к базе

Сообщение kutsanov »

НАРОД!
Может кто прокомментирует лог?
---
begin:system.db.CDbCommand.query(SHOW COLUMNS FROM `r_users`)
end:system.db.CDbCommand.query(SHOW COLUMNS FROM `r_users`)
begin:system.db.CDbCommand.query(SHOW CREATE TABLE `r_users`)
end:system.db.CDbCommand.query(SHOW CREATE TABLE `r_users`)
begin:system.db.CDbCommand.query(SELECT name, idfirm FROM `r_users` `t` WHERE `t`.`id`=1 LIMIT 1)
end:system.db.CDbCommand.query(SELECT name, idfirm FROM `r_users` `t` WHERE `t`.`id`=1 LIMIT 1)
---
итак везде!
Делаю один запрос, а лог пишет два.
Реально два делается, или это просто глюк?
если реально два, то как это избежать?
пример кода (все довольно стандартно)

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

$command = Yii::app()->db->createCommand();
$command->select("rr.id, rr.idfirm, rr.kolkomnat, date_format(rr.date_insert, '%d.%m') as dt");
$command->from('r_realty rr');
$command->order('date_insert desc');
$command->join('lib_city lc', 'lc.id=rr.idcity');
$command->join('lib_street ls', 'ls.id=rr.idstreet');
$command->where($condition, $params);
$queryAll = $command->queryAll();
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Двойные запросы к базе

Сообщение Nafania »

Почему 2?
Их три всего.
А если вы имеете ввиду begin - end, то это один запрос, начало и конец.
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Двойные запросы к базе

Сообщение Nafania »

Если вам не нужны запросы SHOW COLUMNS, SHOW CREATE, то смотрите на http://www.yiiframework.com/doc/api/1.1 ... ion-detail
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Двойные запросы к базе

Сообщение alexZT »

такая же штука когда вывожу массив через ClistView - каждому элементу свой запрос к БД, вопрос в том действительно ли они все выполняются и значит ли, что если у меня будет 100 элементов на страницу будет выполняться 100 запросов к БД ?
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: Двойные запросы к базе

Сообщение esche »

alexZT писал(а):такая же штука когда вывожу массив через ClistView - каждому элементу свой запрос к БД, вопрос в том действительно ли они все выполняются и значит ли, что если у меня будет 100 элементов на страницу будет выполняться 100 запросов к БД ?
Сам CListView запросы к базе не делает. Какой код вызова?
...
catdog
Сообщения: 8
Зарегистрирован: 2012.03.15, 02:23
Откуда: honolulu
Контактная информация:

Re: Двойные запросы к базе

Сообщение catdog »

2AlexZT
читайте ман внимательнее про ленивую и жадную загрузку
также на время разработки включите профилинг, внизу страницы будут показываться запросы и их количество
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Двойные запросы к базе

Сообщение alexZT »

esche писал(а):Сам CListView запросы к базе не делает. Какой код вызова?
<?php $this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_view',

)); ?>
таким образом мы выводим все посты (тестового мануального блога)


в файлике _view расписана структура вывода для каждого обьекта модели, а вот в логе на вывод видим следующее:

Querying SQL: SELECT `category`.`id` AS `t1_c0`, `category`.`name` AS `t1_c1` FROM `tbl_category` `category` WHERE (`category`.`id`=:ypl0). Bound with :ypl0='3'

вроди бы всё ясно , спрашиваем у базы имя и айди категории(причем спрашиваем неявно а именно lazy loading благодаря правильным relations), НО кол-во этих запросов равно кол-ву не категорий, а кол-ву постов, выходит если на странице 100 постов - то в лог упадёт 100 запросов на категорию поста? однако как я и спросил, значит ли это что эти запросы выполняются или же это просто специфика лога показывать данные по каждому выведенному обьекту
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Двойные запросы к базе

Сообщение alexZT »

catdog писал(а):2AlexZT
читайте ман внимательнее про ленивую и жадную загрузку
также на время разработки включите профилинг, внизу страницы будут показываться запросы и их количество
ман читаю, постом выше отписал, что как раз lazy loading присутствует благодаря построеным relations посему когда создаю $dataProvider=new CActiveDataProvider('Post'); получаю данные из из БД POST и так же из БД Category без формирования дополнительных запросов, но как написал постом выше в лог падает столько запросов сколько и постов и они повторяются, потому суть вопроса или же это чисто фича логирования подробного или же это реально кол-во запросов в базу?
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Двойные запросы к базе

Сообщение Nafania »

alexZT писал(а):
catdog писал(а):2AlexZT
читайте ман внимательнее про ленивую и жадную загрузку
также на время разработки включите профилинг, внизу страницы будут показываться запросы и их количество
ман читаю, постом выше отписал, что как раз lazy loading присутствует благодаря построеным relations посему когда создаю $dataProvider=new CActiveDataProvider('Post'); получаю данные из из БД POST и так же из БД Category без формирования дополнительных запросов, но как написал постом выше в лог падает столько запросов сколько и постов и они повторяются, потому суть вопроса или же это чисто фича логирования подробного или же это реально кол-во запросов в базу?
Ленивая загрузка это когда запрос делается только тогда, когда необходим. Вам он необходим сто раз. Сто запросов.
Используйте жадную загрузку в данном случае. Это делается с помощью with в ActiveRecord.
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: Двойные запросы к базе

Сообщение alexZT »

Nafania писал(а):
alexZT писал(а): Ленивая загрузка это когда запрос делается только тогда, когда необходим. Вам он необходим сто раз. Сто запросов.
Используйте жадную загрузку в данном случае. Это делается с помощью with в ActiveRecord.
ответ на 10 баллов!
особенное спасибо за подробную информацию, и правда сделал жадную загрузку:

public function actionIndex()
{
$dataProvider=new CActiveDataProvider('Post',array(
'criteria'=>array(
'with'=>array('category')),
'pagination'=>array('pageSize'=>3),
)
);
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
заодно для наглядности добавил постраничный вывод

и вместо 18 запросов как было ранее выполнилось 6!

вот к такому виду пришел запрос который ранее показывался несколько раз, distinct решил эту проблему

Querying SQL: SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_post` `t` LEFT OUTER JOIN `tbl_category` `category` ON (`t`.`category_id`=`category`.`id`)
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
Ответить