imho.ws |
![]() |
![]() |
![]() |
# 1 |
Guest
Сообщения: n/a
|
![]()
Обсуждение запросов на SQL и проблем с ними.
начну с бонального и распространенного: есть две связаные таблицы - users __________________________ id | name | vozrost | profesia ------------------------------ 1 | Федя | 21 год | 2 2 | Нина | 18 лет | 3 3 | Гена | 24 года| 5 t_profesia __________________________ id | prof_name ------------------------------ 1 | Программист 2 | Строитель 3 | Доктор 4 | Артист 5 | Учитель Вопрос - как составить запрос чтоб результат был таков: __________________________ id | name | vozrost | profesia ------------------------------ 1 | Федя | 21 год | Строитель 2 | Нина | 18 лет | Доктор 3 | Гена | 24 года| Учитель Последний раз редактировалось kogan; 30.08.2006 в 23:50. |
![]() |
# 4 | |
Member
Регистрация: 07.01.2004
Сообщения: 273
![]() ![]() ![]() |
Цитата:
такчто предыдущий вариант более подходящий
__________________
Жизнь движняк ![]() |
|
![]() |
![]() |
# 7 | |
Junior Member
Регистрация: 11.10.2005
Сообщения: 63
![]() |
Цитата:
Попробовал на таблицах ~4млн. х 1млн. Простые подсчёты: мой вариант вариант 24 сек. EvroStandart - 11 сек. nikotano - 2мин.37сек. |
|
![]() |
![]() |
# 8 | |
Guest
Сообщения: n/a
|
![]() это серьезный момент - о скорости.. Цитата:
EvroStandart - о как.. ![]() |
|
![]() |
# 9 | |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
![]()
__________________
Количество ума на Земле постоянно, а население растёт... |
|
![]() |
![]() |
# 10 | |
Guest
Сообщения: n/a
|
Цитата:
Почему "умный" отимизатор не додумался их оптимизировать и вывести равное время..? ![]() |
|
![]() |
# 11 |
Advanced Member
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Стоит отметить что запросы EvroStandart и nikotano различаються. В наведеном примере они вернут одинаковый результат. Но н-р, если не указывать професию (тоесть поставить Null) у юзера, то запрос EvroStandart его выберет, а nikotano - нет.
В любом случае более правильным подходом в таких случаях (обьединения таблиц), лучше исспользовать джоины. И не только в соображениях производительности, но и в восприятии запроса человеком. Запросы с джоинами более читабельные (особенно если нужно обьединять несколько таблиц + разнообразные условия по выборке)
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King |
![]() |
![]() |
# 12 |
Junior Member
Регистрация: 16.07.2005
Адрес: Украина, г. Ровно
Пол: Male
Сообщения: 140
![]() |
Gunslinger
Не согласен!!! запрос nikotano болиее универсальный и логически верный. Зачем нам записи пиплов без професий... ето раз. Во вторых запросы через джоин болиее сложны в чтение В третьих если юзать движок без внешн. ключей, таким образом ожно добавить ищо один пункт к однозначности запесей.
__________________
Та программа не глючит, которая не написана |
![]() |
![]() |
# 13 |
KpTeaM
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
yan_kos
А что насчет теста _Lynx_??? Полностью согласен с Gunslinger. В vbulletin повсеместно, например, используются join. Был один запрос как у nikotano, так в новой версии mysql он стал приводить к ошибке.
__________________
Над струнами вен моих Лезвия осени, Их сталь леденящая В просинь рук просится... ©Темнозорь Последний раз редактировалось Madness; 06.09.2006 в 20:58. |
![]() |
![]() |
# 14 | ||||
Newbie
Регистрация: 22.04.2004
Адрес: Украина
Сообщения: 19
![]() |
Прогнал все три запроса по два раза в IBExpert.
Firebird 1.0.2. Записей в основной таблице > 1100000, во второй ~ 350000. Вот результаты: nikotano Цитата:
Цитата:
Цитата:
Windows XP Prof Intel P4 2.4 GHz, 512RAM. Цитата:
|
||||
![]() |
![]() |
# 15 | |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
какие данные задействованы в тесте (наполненность таблиц) что за сервер - оптимизаторы "умные" поразному, одни больше, другие меньше ![]() Какие ключи/индексы есть и в каком состоянии. И т.п. Я имел ввиду, что при равных условиях результаты будут близки. Но один "универсальнее" - больше дает свободы оптимизатору, соответственно переносимее с платформы на платформу и менее зависит от данных и структуры. PS: Погляди на среднее время фетча в предыдущем письме...
__________________
Количество ума на Земле постоянно, а население растёт... |
|
![]() |
![]() |
# 16 | |||
Advanced Member
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
Цитата:
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King Последний раз редактировалось Gunslinger; 07.09.2006 в 13:55. |
|||
![]() |
![]() |
# 18 | |
Advanced Member
Регистрация: 15.09.2004
Адрес: Украина, Хмельницкий
Сообщения: 403
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
__________________
The man in black fled across the desert, and the Gunslinger followed. (c) S.King |
|
![]() |
![]() |
# 19 | |
Newbie
Регистрация: 22.04.2004
Адрес: Украина
Сообщения: 19
![]() |
Цитата:
Но я обычно вношу системную запись "Не указано" с идентификатором 0 и ставлю 0 как дефолтовое значение. Ну это дело вкуса. |
|
![]() |
![]() |
# 20 | |
Full Member
Регистрация: 15.09.2004
Адрес: Палата74@Дурдом.RU
Пол: Male
Сообщения: 593
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Как раз условия в запросе более универсальны при переносе между разными платформами/версиями/и т.п. Кроме того куча софта, использующего QBE умеет парсить/модифицировать именно условия. Ну и кроме прочего, говоря join ты указываешь оптимизатору что к чему цепляется (left\right join). Что в общем случае не универсально. PS: заметь - я не говорю, что join это плохо, сам пользуюсь ![]()
__________________
Количество ума на Земле постоянно, а население растёт... |
|
![]() |