powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос долго выполняется
25 сообщений из 29, страница 1 из 2
Вложенный запрос долго выполняется
    #38366615
Krava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Подскажите в чем проблема.
Вложенный запрос долго выполняется
Код: sql
1.
SELECT id, name, url FROM podcat_biz WHERE id IN(SELECT DISTINCT podcat_biz_id FROM post_biz_ua where city_id = 4 and category_biz = 80);


А если разделить на 2 отдельных запроса тогда все быстро получается. В чем же тогда проблема ?
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366642
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KravaДобрый день. Подскажите в чем проблема.
Вложенный запрос долго выполняется
Код: sql
1.
SELECT id, name, url FROM podcat_biz WHERE id IN(SELECT DISTINCT podcat_biz_id FROM post_biz_ua where city_id = 4 and category_biz = 80);


А если разделить на 2 отдельных запроса тогда все быстро получается. В чем же тогда проблема ?
Код: sql
1.
2.
3.
SELECT id, name, url 
FROM podcat_biz b
WHERE EXISTS(SELECT 1 FROM post_biz_ua u where u.city_id = 4 and u.category_biz = 80 and u.podcat_biz_id=b.id);
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366706
Krava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007 Спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366838
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем тут подзапрос?
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT pb.id, pb.name, pb.url 
FROM podcat_biz pb, post_biz_ua pbu
WHERE pb.id = pbu.podcat_biz_id 
AND pbu.city_id = 4 
AND pbiucategory_biz = 80;
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366839
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон...
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT pb.id, pb.name, pb.url 
FROM podcat_biz pb, post_biz_ua pbu
WHERE pb.id = pbu.podcat_biz_id 
AND pbu.city_id = 4 
AND pbu.category_biz = 80;
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366843
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaА зачем тут подзапрос?В зависимости от входных данных, вариант с подзапросом может быстрее выполняться, так что почему бы и нет?
И, кстати, Ваш вариант не эквивалентен исходному, если вдруг окажется, что поле id в таблице podcat_biz не уникально.
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366847
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftAkinaА зачем тут подзапрос?В зависимости от входных данных, вариант с подзапросом может быстрее выполняться, так что почему бы и нет?Согласен.

miksoftВаш вариант не эквивалентен исходному, если вдруг окажется, что поле id в таблице podcat_biz не уникально.
Только не поле id, а совокупность всех трёх полей - мой запрос вернёт одну копию, а исходный - все..
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366858
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

DISTINCT подразумевает сортировку и группировку всех записей,
EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366860
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Akina,

DISTINCT подразумевает сортировку и группировку всех записей,
EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366867
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007Akina,

DISTINCT подразумевает сортировку и группировку всех записей,
EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.При наличии индекса - одна операция INDEX SEEK для каждой строки. И никакой сортировки и группировки. Так же никакого отбора всей кучи данных второй таблицы для каждой строки исходной.

Приведите пример, когда DISTINCT выполняется быстрее поиска по ключу, пожалуйста ?
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366883
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007DISTINCT подразумевает сортировку и группировку всех записей
Это неверно.
http://dev.mysql.com/doc/refman/5.5/en/distinct-optimization.html If you do not use columns from all tables named in a query, MySQL stops scanning any unused tables as soon as it finds the first match. In the following case, assuming that t1 is used before t2 (which you can check with EXPLAIN), MySQL stops reading from t2 (for any particular row in t1) when it finds the first row in t2:
Код: sql
1.
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;


Наш случай...
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366894
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНаш случай...о как! EXISTS эмулирует! :)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366903
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaCygapb-007DISTINCT подразумевает сортировку и группировку всех записей
Это неверно.
http://dev.mysql.com/doc/refman/5.5/en/distinct-optimization.html If you do not use columns from all tables named in a query, MySQL stops scanning any unused tables as soon as it finds the first match. In the following case, assuming that t1 is used before t2 (which you can check with EXPLAIN), MySQL stops reading from t2 (for any particular row in t1) when it finds the first row in t2:
Код: sql
1.
SELECT DISTINCT t1.a FROM t1, t2 where t1.a=t2.a;


Наш случай...Спасибо, не знал:) MS SQL по-другому:)
В таком случае запросы эквивалентны, хотя логика с DISTINCT представляется мне более... тяжеловесной, что ли. Зачем во FROM перечислять таблицы, не попадающие в выборку? Дело привычки, должно быть.

Да вот, кстати, и ссылка: Оптимизация SELECT DISTINCT
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366914
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее да, эквивалентны — кроме полных дубликатов выводимых полей. И значит, ТС должен принять решение, надо ему знать о такого рода дубликатах или нет :)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366919
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С другой стороны, это уже другая логика запроса:
select distinct ... from table where exists(...)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366925
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Приведите пример, когда DISTINCT выполняется быстрее поиска по ключу, пожалуйста ? Имхо, например, если обе таблицы очень велики (настолько, что любой их индекс гарантировано многократно больше кэша индексов), а практически для любой записи из первой таблицы найдется запись во второй таблице. И если СУБД умеет HASH JOIN (конкретно MySQL вроде бы умеет начиная с версии 5.6).

В менее экстремальных случаях нужно пробовать, сходу не соображу.
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366933
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

даже с учетом особенностей оптимизации distinct в MySQL, он все равно будет выполняться дольше select from where exists - хотя бы за счет поиска дублей в исходной таблице

Хотя при этом, возможно, вернет меньше строк :)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38366940
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007Akina,

DISTINCT подразумевает сортировку и группировку всех записей,
EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.И согласен, с «гораздо» – погорячился по незнанию :)
Но экономичнее – все равно остается в силе. И эквивалентно – для конструкции select distinct from where exists :)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367145
Krava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, много чего для себя нового узнал. У меня вариант 14710002 выходит самый оптимальный.
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367153
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бинго!
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367163
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конгратс
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367238
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, все же выскажусь еще раз, подбивая итоги :) Хотя разница и ... микронная :), но вы уж звиняйте, я тоже не против бинго

Krava , если у вас в таблице podcat_biz нет повторяющихся podcat_biz.ID (а их, скорее всего, нет, потому как ID - скорее всего автонумератор ), то вариант
Код: sql
1.
2.
3.
SELECT id, name, url 
FROM podcat_biz b
WHERE EXISTS(SELECT 1 FROM post_biz_ua u where u.city_id = 4 and u.category_biz = 80 and u.podcat_biz_id=b.id);

будет выполняться быстрее, чем
Код: sql
1.
2.
3.
SELECT DISTINCT pb.id, pb.name, pb.url 
FROM podcat_biz pb, post_biz_ua pbu
WHERE pb.id = pbu.podcat_biz_id AND pbu.city_id = 4 AND pbu.category_biz = 80;

за счет отсутствия в плане выполнения запроса трех лишних операций для DISTINCT : сортировки (кластерного индекса по ID в этом случае недостаточно, так как указаны и другие поля) по полям pb.id, pb.name, pb.url , группировки по ним же, и отсеивания (отсутствующих) дублей. Хоть дублей и нет, но операции ИМХО должны быть в плане выполнения. Как-то сомневаюсь я, что оптимизатор сократит эти операции при выборе оптимального плана... Хотя если я не прав, и оптимизатор MySQL умнее, чем я о нем думаю, то запросы идентичны, и мои шансы на бинго - 50:50, то есть уже проиграл
(Кстати, как проверить в плане выполнения наличие этих операций или их отсутствие? Или это только для MySQL Enterprise доступно? Я про что-то типа QueryAnalizer...)

Если же дубли есть и их нужно отбраковать при отображении, то вариант без EXISTS по плану выполнения запроса эквивалентен следующему:
Код: sql
1.
2.
3.
SELECT DISTINCT id, name, url 
FROM podcat_biz b
WHERE EXISTS(SELECT 1 FROM post_biz_ua u where u.city_id = 4 and u.category_biz = 80 and u.podcat_biz_id=b.id);

и снова 50:50 :)
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367446
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krava , если не затруднит, дайте нам результаты вот таких запросов:

Код: sql
1.
2.
3.
4.
5.
SELECT COUNT(id), COUNT(DISTINCT id)
FROM podcat_biz;

SELECT COUNT(podcat_biz_id), COUNT(DISTINCT podcat_biz_id)
FROM post_biz_ua;
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367682
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Krava,

Убери из подзапроса distinct, он там не нужен
...
Рейтинг: 0 / 0
Вложенный запрос долго выполняется
    #38367684
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftCygapb-007Akina,

DISTINCT подразумевает сортировку и группировку всех записей,
EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.

Факт.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос долго выполняется
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]