Имя: Пароль:
IT
Админ
Какой запрос SQL быстрее?
0 bublegum
 
03.12.13
08:23
MySQL
Сделал три запроса дающих нужный результат, какой быстрее?

#1
select (select datetime from t1 where t1.key = p.key) datetime
from ( SELECT key FROM t2 GROUP BY key ) p
#2
SELECT datetime
FROM t1
where t1.key in    ( SELECT key FROM t2 ) # GROUP BY key???
#3
SELECT t1.datetime
FROM t1
JOIN t2 ON t1.key = t2.key
GROUP BY datetime
1 Sammo
 
03.12.13
08:27
exists вместо in
Хотя он есть в MySQL?
2 Fragster
 
модератор
03.12.13
08:39
3 Fragster
 
модератор
03.12.13
08:39
ну и без индексов нужных все равно бесполезно
4 Кирпич
 
03.12.13
09:59
Быстрее тот, который быстрее.
Напиши за какое время выполняется запросы и мы тебе скажем какой из них быстрее.
5 Ёпрст
 
03.12.13
10:04
(0) гонишь.
результаты запроса разные
6 Ёпрст
 
03.12.13
10:05
2 и 3-ий - разную группировку имеют, к примеру.
7 Dionis Sergeevich
 
03.12.13
10:26
join должен быть быстрее подзапросов. Хотя проще написать функцию замера времени и проверить
8 Dionis Sergeevich
 
03.12.13
10:26
на каком-нибудь С
9 bublegum
 
03.12.13
10:26
(3) все нужные индексы есть
(4) 0 секунд
(5) (6) порядок только разный, если добавить сортировку в конце, будет совсем одинаково.
10 bublegum
 
03.12.13
10:27
(7) >> join должен быть быстрее подзапросов
это достоверная информация?
11 Ёпрст
 
03.12.13
10:27
(9) :)))
ну-ну..
удачи в сравнении теплого с мягким.
12 bublegum
 
03.12.13
10:27
(11) спасибо
13 bublegum
 
03.12.13
10:30
Сортировка после выполнения запроса не повлияет на результат соревнования по скорости, поэтому я ее сократил для простоты.
14 Ёпрст
 
03.12.13
10:30
первый запрос тоже, <> 2 и 3
15 Ёпрст
 
03.12.13
10:30
Могу тебе на пальцах нарисовать, если так не понимаешь
16 bublegum
 
03.12.13
10:35
(15) Нарисуй себе на пальцах если не понимаешь что они ==
17 Fragster
 
модератор
03.12.13
10:36
а в (2) автор что-нибудь прочитал?
18 Ёпрст
 
03.12.13
10:39
t1
datetime  key
01.01.01   Вася
02.01.01   Вася
03.01.01   Вася
01.01.01   Федя
02.01.01   Федя
03.01.01   Федя

t2
datetime  key
22.01.01   Вася
11.01.01   Федя

1 запрос
выдаст ошибку, ибо для ключа Вася есть 3 записи, а коррелированный подзапрос
select (select datetime from t1 where t1.key = p.key)
должен выдавать одну (top 1 там нужен или макс или еще как)

2 запрос
выдаст ошибку , ибо при group by key есть куча datetime не в агригирующей функции

3 запрос
01.01.01
02.01.01
03.01.01
19 Ёпрст
 
03.12.13
10:40
(16) удачи
20 Никола_
Питерский
 
03.12.13
10:42
(16) Не прислушиваться к мнению Ёпрст это большой удар по своей карме.
21 bublegum
 
03.12.13
10:43
(17) Да, с помощью той хорошей штуки можно узнать где не хватает индексов.
22 bublegum
 
03.12.13
10:45
(18) в твоем примере key не уникальный. Исправь и проверь еще раз. Удачи.
23 bublegum
 
03.12.13
10:45
(20) спасибо
24 Ёпрст
 
03.12.13
10:51
(22) Я не рассматриваю частные случаи
+ В (0) об уникальности key ни слова.
25 Ёпрст
 
03.12.13
10:52
+ если key уникальный, делать group by key в подзапросе ?!!!
Это ужо п...ц
26 Ёпрст
 
03.12.13
10:53
Так што .. см (19)
27 bublegum
 
03.12.13
10:58
(24) название говорит само за себя. Извините что забыл написать что оно уникально.
group by можно убрать для упрощения.
28 ЧеловекДуши
 
03.12.13
11:02
(0) Тот который будет вызван второй раз :)
SQL так весело выполняет повторный запрос, что по сути сложно оценить ту или иную скорость :)
29 bublegum
 
03.12.13
11:46
Оценить надо именно по сути, а не методом тыка.
30 bublegum
 
03.12.13
12:04
Есть эскуэльщики?
31 Fragster
 
модератор
03.12.13
12:20
(29) посути - надо курить (2). если там для всех запросов одинаково, то и время выполнения будет одинаково
32 bublegum
 
03.12.13
12:30
(31) Буду курить...

А есть кто уже опытный и сразу может сказать?
33 Simod
 
03.12.13
12:42
Перед выполнением текст запроса проходит через оптимизатор, который составляет план запроса. Поэтому для всех 3-х запросов может быть составлен один план и как следствие одинаковое время.
38 Sammo
 
модератор
04.12.13
06:23
Хм. Правило 2 (флейм в тематике) еще не отменяли. И к топикстартеру это тоже относится.
39 ОдинСерый
 
04.12.13
07:18
(0) все не правильные :)))))
джойн и груп бы это самые тормоза , их не надо употреблять или в крайних случаях.

SELECT t1.datetime
FROM t1 ,( SELECT distinct key FROM t2 ) t2
where t1.key = t2.key
40 Simod
 
04.12.13
08:08
(39) Как-бы уже сказали, что key уникален и нужды в distinct нет. А запрос равнозначен join, просто старая форма записи.
41 ОдинСерый
 
04.12.13
08:15
(40) :)))))) ыыыы нет старых форм и новых... .
как бы скуль он стандартизирован.
з.ы.
и разницы нет когда десят записей.а когда будет 10млн то разница будет
42 Simod
 
04.12.13
08:53
43 ОдинСерый
 
04.12.13
16:56
(42) ыыыыыыы.
еще раз для упертых. есть стандарты . а есть sql server от МС это разные вещи.
44 Туц
 
05.12.13
07:00
(0) Если key уникальный то в 1
#1
SELECT key FROM t2 GROUP BY key не нужен
просто


select datetime from t1 where key in (select key from t2)
45 Туц
 
05.12.13
07:04
(0) тогда и 3 ещё лучше сделать так
SELECT distinct t1.datetime
FROM t1
INNER JOIN t2 ON t1.key = t2.key

да и как верно было подмеченно, запросы разные в плане результата.
46 bublegum
 
05.12.13
07:56
с JOIN получается немного быстрее, но только если есть индекс по t1.datetime. Не понятно почему. Если нет индекса по t1.datetime, то индексы в t1 вообще не используются, даже по key. Не понятно
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn