Подзапросы/вложенные запрос sql

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Допустим имеем бы 10 таблиц, ну и понадобилось нам подсчитать в каждой таблице чесло строк...
т.е это будет 10 запросов вот так:
Код:
select count(*) from tbl1
select count(*) from tbl2
//и т.д
А можно это же сделать вот так:
Код:
select(select count(*) from tbl1) as `tbl1`, (select count(*) from tbl2) as `tbl2`,(select count(*) from tbl3) as `tbl3`  from tbl_name // и т.д
Вопрос о нагрузке.. Где будет сильнее нагрузка? В первом варианте, где придется делать 10 запросов, или во втором?
И ещё: Во втором варианте это будет считаться одним запросом или нет?

Скорость не существенно отличается..
Сделал 5 таблиц, в каждой по 100.000 записей
Циклом сделал по 5000 запросов каждым вариантом...
Второй варимант срабатывает быстрее примерно на секунду или полторы)
Но меня интересует нагрузка)
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
А что мешает сделать так:
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
вот тут точно один запрос будет, + не надо ворошить все поля (поле id я для примера взял)
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
А что мешает сделать так:
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
вот тут точно один запрос будет, + не надо ворошить все поля (поле id я для примера взял)
А если нужны условия? Для каждой таблицы свой условие, то как быть?
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Если таблиц ограниченное количество (ну, вот 10 как в примере), то лично моя практика показывает, что 10, 20, 50 запросов будут быстрее выполняться. Но вопрос, какие запросы вы выполняете. Одни и те же выполняются много раз, или они каждый раз меняются (добавляются или изменяются условия)? Во втором случае, думаю, один запрос будет предпочтительнее.
ЗЫ: Но это всё из области теории. Производительность нужно смотреть на конкретной машине, где будет использоваться система, и только там.
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
А что мешает сделать так:
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
вот тут точно один запрос будет, + не надо ворошить все поля (поле id я для примера взял)
А если нужны условия? Для каждой таблицы свой условие, то как быть?
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
where tbl1.id = ...
AND tbl2.id = ...
AND tbl3.id = ...
AND tbl4.id = ...
AND tbl5.id = ...
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
А что мешает сделать так:
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
вот тут точно один запрос будет, + не надо ворошить все поля (поле id я для примера взял)
А если нужны условия? Для каждой таблицы свой условие, то как быть?
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
where tbl1.id = ...
AND tbl2.id = ...
AND tbl3.id = ...
AND tbl4.id = ...
AND tbl5.id = ...
Ага.. только одна проблема, работает это условие как одно, т.е вот пример:
Код:
SELECT count(`tbl1`.`id`),count(`tbl2`.`id`) FROM `tbl1`,`tbl2` where `tbl1`.`id_login`='1' and `tbl2`.`id_login`='1'
Выведет что два столбца и в обоих будет по нулям, даже если в какой то из таблиц есть такой id_login.. Нужно что бы вывело что в первой есть, а во второй ноль..
Попробовал сделать так:
Код:
SELECT count(`tbl1`.`id`),count(`tbl2`.`id`) FROM `tbl1`,`tbl2` where `tbl1`.`id_login`='1' OR `tbl2`.`id_login`='1'
Вывело вообще в каждом столбце число 2, будто бы в каждой таблице по две строки с таким id_login(ом)..
Как быть?
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
А что мешает сделать так:
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
вот тут точно один запрос будет, + не надо ворошить все поля (поле id я для примера взял)
А если нужны условия? Для каждой таблицы свой условие, то как быть?
Код:
select count(tbl1.id),  count(tbl2.id), count(tbl3.id), count(tbl4.id), count(tbl5.id)
from tbl1, tbl2, tbl3, tbl4, tbl5
where tbl1.id = ...
AND tbl2.id = ...
AND tbl3.id = ...
AND tbl4.id = ...
AND tbl5.id = ...
Ага.. только одна проблема, работает это условие как одно, т.е вот пример:
Код:
SELECT count(`tbl1`.`id`),count(`tbl2`.`id`) FROM `tbl1`,`tbl2` where `tbl1`.`id_login`='1' and `tbl2`.`id_login`='1'
Выведет что два столбца и в обоих будет по нулям, даже если в какой то из таблиц есть такой id_login.. Нужно что бы вывело что в первой есть, а во второй ноль..
Попробовал сделать так:
Код:
SELECT count(`tbl1`.`id`),count(`tbl2`.`id`) FROM `tbl1`,`tbl2` where `tbl1`.`id_login`='1' OR `tbl2`.`id_login`='1'
Вывело вообще в каждом столбце число 2, будто бы в каждой таблице по две строки с таким id_login(ом)..
Как быть?
UNION Вам поможет, заканчивайте уже страдать :) нагрузка будет чуть меньше чем во вложенном подзапросе и обрабатывать результаты проще.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ