|
|
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Добрый день. Подскажите в чем проблема. Вложенный запрос долго выполняется Код: sql 1. А если разделить на 2 отдельных запроса тогда все быстро получается. В чем же тогда проблема ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 17:53:10 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
KravaДобрый день. Подскажите в чем проблема. Вложенный запрос долго выполняется Код: sql 1. А если разделить на 2 отдельных запроса тогда все быстро получается. В чем же тогда проблема ? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 18:13:09 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Cygapb-007 Спасибо, буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 18:58:14 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
А зачем тут подзапрос? Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:35:22 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
пардон... Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:36:15 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
AkinaА зачем тут подзапрос?В зависимости от входных данных, вариант с подзапросом может быстрее выполняться, так что почему бы и нет? И, кстати, Ваш вариант не эквивалентен исходному, если вдруг окажется, что поле id в таблице podcat_biz не уникально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:40:14 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
miksoftAkinaА зачем тут подзапрос?В зависимости от входных данных, вариант с подзапросом может быстрее выполняться, так что почему бы и нет?Согласен. miksoftВаш вариант не эквивалентен исходному, если вдруг окажется, что поле id в таблице podcat_biz не уникально. Только не поле id, а совокупность всех трёх полей - мой запрос вернёт одну копию, а исходный - все.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:42:47 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Akina, DISTINCT подразумевает сортировку и группировку всех записей, EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:51:47 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Akina, DISTINCT подразумевает сортировку и группировку всех записей, EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 21:54:21 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
miksoftCygapb-007Akina, DISTINCT подразумевает сортировку и группировку всех записей, EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.При наличии индекса - одна операция INDEX SEEK для каждой строки. И никакой сортировки и группировки. Так же никакого отбора всей кучи данных второй таблицы для каждой строки исходной. Приведите пример, когда DISTINCT выполняется быстрее поиска по ключу, пожалуйста ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:01:29 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
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. Наш случай... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:20:26 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
AkinaНаш случай...о как! EXISTS эмулирует! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:33:59 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
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. Наш случай...Спасибо, не знал:) MS SQL по-другому:) В таком случае запросы эквивалентны, хотя логика с DISTINCT представляется мне более... тяжеловесной, что ли. Зачем во FROM перечислять таблицы, не попадающие в выборку? Дело привычки, должно быть. Да вот, кстати, и ссылка: Оптимизация SELECT DISTINCT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 22:43:54 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Точнее да, эквивалентны — кроме полных дубликатов выводимых полей. И значит, ТС должен принять решение, надо ему знать о такого рода дубликатах или нет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 23:03:26 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
С другой стороны, это уже другая логика запроса: select distinct ... from table where exists(...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 23:06:42 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Приведите пример, когда DISTINCT выполняется быстрее поиска по ключу, пожалуйста ? Имхо, например, если обе таблицы очень велики (настолько, что любой их индекс гарантировано многократно больше кэша индексов), а практически для любой записи из первой таблицы найдется запись во второй таблице. И если СУБД умеет HASH JOIN (конкретно MySQL вроде бы умеет начиная с версии 5.6). В менее экстремальных случаях нужно пробовать, сходу не соображу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 23:15:43 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
miksoft, даже с учетом особенностей оптимизации distinct в MySQL, он все равно будет выполняться дольше select from where exists - хотя бы за счет поиска дублей в исходной таблице Хотя при этом, возможно, вернет меньше строк :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 23:28:38 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
miksoftCygapb-007Akina, DISTINCT подразумевает сортировку и группировку всех записей, EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт.И согласен, с «гораздо» – погорячился по незнанию :) Но экономичнее – все равно остается в силе. И эквивалентно – для конструкции select distinct from where exists :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2013, 23:45:35 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Спасибо, много чего для себя нового узнал. У меня вариант 14710002 выходит самый оптимальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 10:40:58 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Бинго! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 10:44:06 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Конгратс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 10:49:50 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Не, все же выскажусь еще раз, подбивая итоги :) Хотя разница и ... микронная :), но вы уж звиняйте, я тоже не против бинго Krava , если у вас в таблице podcat_biz нет повторяющихся podcat_biz.ID (а их, скорее всего, нет, потому как ID - скорее всего автонумератор ), то вариант Код: sql 1. 2. 3. будет выполняться быстрее, чем Код: sql 1. 2. 3. за счет отсутствия в плане выполнения запроса трех лишних операций для DISTINCT : сортировки (кластерного индекса по ID в этом случае недостаточно, так как указаны и другие поля) по полям pb.id, pb.name, pb.url , группировки по ним же, и отсеивания (отсутствующих) дублей. Хоть дублей и нет, но операции ИМХО должны быть в плане выполнения. Как-то сомневаюсь я, что оптимизатор сократит эти операции при выборе оптимального плана... Хотя если я не прав, и оптимизатор MySQL умнее, чем я о нем думаю, то запросы идентичны, и мои шансы на бинго - 50:50, то есть уже проиграл (Кстати, как проверить в плане выполнения наличие этих операций или их отсутствие? Или это только для MySQL Enterprise доступно? Я про что-то типа QueryAnalizer...) Если же дубли есть и их нужно отбраковать при отображении, то вариант без EXISTS по плану выполнения запроса эквивалентен следующему: Код: sql 1. 2. 3. и снова 50:50 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 11:42:08 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Krava , если не затруднит, дайте нам результаты вот таких запросов: Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 13:17:46 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
Krava, Убери из подзапроса distinct, он там не нужен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:30:31 |
|
||
|
Вложенный запрос долго выполняется
|
|||
|---|---|---|---|
|
#18+
miksoftCygapb-007Akina, DISTINCT подразумевает сортировку и группировку всех записей, EXISTS -проверку наличия хотя бы одной удовлетворяющей условию записи, что гораздо экономнее Не надо столь категорично. Не факт. Факт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:32:08 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38366933&tid=1836234]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 299ms |

| 0 / 0 |
