Security Teams



:::
  Ответ в темуСоздание новой темыСоздание опроса

> Оптимизация SQL запроса
drmist
Дата 3.07.2006 - 10:19
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Не придумал места получше, чтобы запостить вопрос, думаю если что - мудрый админ меня поправит ))

Допустим, на запрос

SELECT t1.id, t1.caption, t2.data FROM t1, t2 WHERE t1.parent=X AND t2.parent = t1.id ORDER BY t1.id, t2.id

я получаю ответ
Код
1 "Caption 1" 2
1 "Caption 1" 4
1 "Caption 1" 8
2 "Caption 2" 16
2 "Caption 2" 32
2 "Caption 2" 64


можно ли в один запрос получить результат типа

Код
1 "Caption 1" 2
1 0           4
1 0           8
2 "Caption 2" 16
2 0           32
2 0           64


?

То есть мне нужно получить записи t1.id = t2.data, а также t1.id = t1.caption, но поскольку
соответствие t1.id - t1.caption всюду однозначно я хочу сэкономить на машинных ресурсах.
Есть ли возможность это сделать? Желательно, чтобы запрос работал в mysql >=3.
Посылку нескольких запросов не предлогать, записей в t1 много.
Если вопрос плохо сформулирован - могу попытаться выразиться поточнее.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
Nickolas
Дата 3.07.2006 - 10:50
Цитировать сообщение
Offline



Specialist
****

Профиль
Группа: -users-
Сообщений: 467
Пользователь №: 2842
Регистрация: 16.02.2006



Рейтинг:
(0%) -----


Не совсем понятно, но судя по всему тебе нужно покопатьв сторону JOIN.
запрос можно уже оптимизировать таким образом:

SELECT t1.id, t1.caption, t2.data FROM t1 JOIN t2 ON (t1.id=t2.data) WHERE t1.parent=X ORDER BY t1.id, t2.id;

(плохо понятно что именно тебе надо. было бы легче, если бы было видно структуру таблиц и их связки)


--------------------
И придут демоны, и будет имя им BSD
PM
Top
drmist
Дата 3.07.2006 - 14:35
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Все просто - я хочу сделать запрос, как ты написал, только чтобы возращаемые поля были такими, что

первое поле и третье нормальные, а во втором были нули везде, кроме тех случаев, когда некий t1.id встречается первый раз.

то есть допустим сервер нашел нечто, удовлетворяющее моему запросу
он смотрит t1.id, если такое значение уже было, вместо t1.caption возвращает 0, иначе - нормальное значение.
// хех наверное не получится так....

кстати, почему ты говоришь что запрос с JOIN более оптимизирован, чем SELECT из двух таблиц?
какие книжки почитать по сабжу (оптимизации запросов)?


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
Nickolas
Дата 3.07.2006 - 15:01
Цитировать сообщение
Offline



Specialist
****

Профиль
Группа: -users-
Сообщений: 467
Пользователь №: 2842
Регистрация: 16.02.2006



Рейтинг:
(0%) -----


Цитата (drmist @ 3.07.2006 - 13:35)
кстати, почему ты говоришь что запрос с JOIN более оптимизирован, чем SELECT из двух таблиц?
какие книжки почитать по сабжу (оптимизации запросов)?

mysql manual smile.gif


--------------------
И придут демоны, и будет имя им BSD
PM
Top
filosofy
Дата 4.07.2006 - 01:45
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 78
Пользователь №: 1590
Регистрация: 24.09.2005



Рейтинг:
(30%) XX---


можно ли в один запрос получить результат типа
Код
1 "Caption 1" 2
1 0 4
1 0 8
2 "Caption 2" 16
2 0 32
2 0 64

Можно, но зачем.... машинные ресурсы... таким образом оптимизированны не будут. Если же интересна сама реалзиация, то и тут все непросто:
Создаем процедуру которая сравнивает два значения и возвращает,
в случае их равенства 0 иначе возвращяет значение.

В запросе
Цитата
SELECT t1.id, t1.caption, t2.data FROM t1 JOIN t2 ON (t1.id=t2.data) WHERE t1.parent=X ORDER BY t1.id, t2.id;


вызываем где нить процедуру (при этом из него убираем поле t1.caption так это все обрабатывается в самой процедуре) и с помощью конструкции if(condition,true,false) возвращаем нужные значения...

По другому сделать это наверное все таки нельзя.., если кто то знает другой способ напишите
PM
Top
filosofy
Дата 4.07.2006 - 01:57
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 78
Пользователь №: 1590
Регистрация: 24.09.2005



Рейтинг:
(30%) XX---


Цитата (Nickolas @ 3.07.2006 - 15:01)
Цитата (drmist @ 3.07.2006 - 13:35)
кстати, почему ты говоришь что запрос с JOIN более оптимизирован, чем SELECT из двух таблиц?
какие книжки почитать по сабжу (оптимизации запросов)?

mysql manual smile.gif

На самом деле одинаково...., для примера, смотрите ниже, хотя ситуации бывают разные....

----------------три одинаковых запроса (по результату)--------------------------

explain(select login from btl_users where id = (select uid from btl_ra_users where id =1))

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY btl_users const PRIMARY PRIMARY 4 const 1 (null)
2 SUBQUERY btl_ra_users const PRIMARY PRIMARY 4 (null) 1 (null)

explain(select login from btl_users left join btl_ra_users on (btl_ra_users.uid = btl_users.id) where btl_ra_users.id = 1)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE btl_ra_users const PRIMARY PRIMARY 4 const 1 (null)
1 SIMPLE btl_users const PRIMARY PRIMARY 4 const 1 (null)

explain(select btl_users.login from btl_users,btl_ra_users where btl_ra_users.uid = btl_users.id and btl_ra_users.id = 1)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE btl_ra_users const PRIMARY PRIMARY 4 const 1 (null)
1 SIMPLE btl_users const PRIMARY PRIMARY 4 const 1 (null)


PM
Top
Drujinnik
Дата 9.08.2007 - 22:12
Цитировать сообщение




Unregistered












Цитата (filosofy @ 4.07.2006 - 01:57)
На самом деле одинаково...., для примера, смотрите ниже, хотя ситуации бывают разные....

----------------три одинаковых запроса (по результату)--------------------------

explain(select login from btl_users where id = (select uid from btl_ra_users where id =1))

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY btl_users const PRIMARY PRIMARY 4 const 1 (null)
2 SUBQUERY btl_ra_users const PRIMARY PRIMARY 4 (null) 1 (null)

explain(select login from btl_users left join btl_ra_users on (btl_ra_users.uid = btl_users.id) where btl_ra_users.id = 1)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE btl_ra_users const PRIMARY PRIMARY 4 const 1 (null)
1 SIMPLE btl_users const PRIMARY PRIMARY 4 const 1 (null)

explain(select btl_users.login from btl_users,btl_ra_users where btl_ra_users.uid = btl_users.id and btl_ra_users.id = 1)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE btl_ra_users const PRIMARY PRIMARY 4 const 1 (null)
1 SIMPLE btl_users const PRIMARY PRIMARY 4 const 1 (null)

Возможно в разных СУБД моожет быть по разному, но в MS SQL 2000 - 2005 на второй и третий пример запросов строятся абсолютно идентичные планы исполнения
Top
Red Africa
Дата 10.06.2009 - 05:17
Цитировать сообщение




Unregistered












Очень нужна помощь в оптимизации sql-запроса.
размеры таблиц: от 1 млн до 30 млн.
Выполняется очень долго.

SELECT A.ID_GOODS AS ID_GOODS,
S.NO366convertvarchar,S.ID_STORE AS ID_NETOBJ,
convertnumeric10,3,roundSUMROUNDA.SALDO / AC.DIVIDER,3,3 AS SALDO,
convertnumeric10,3,roundSUMROUNDA.SALDO/AC.DIVIDER,3AC.PRICE_DELIVERY_BAS1AC.STAVKA_N DS/100,3 AS PRICE_WITH_VAT,
convertnumeric10,3,roundSUMROUNDA.SALDO / AC.DIVIDER,3 AC.PRICE_DELIVERY_BAS,3 AS PRICE_WITH_NO_VAT,
AC.TIME_APPLY AS TIME_APPLY,
AC.ID_SUBJECT AS ID_SUPPLIER,
case when isnullI.VIRTUAL,0 = 0 then 1 else 0 end as VIRTUAL
FROM STORE_SALDO A
INNER JOIN STORE S ON S.ID_STORE = A.ID_STORE
INNER JOIN ARTIKUL_CATALOG AC ON AC.ARTIKUL = A.ARTIKUL
inner join spec_indoc si on si.artikul=ac.artikul
inner join indoc i on i.id_indoc=si.id_indoc
WHERE A.SALDO > 0 AND
S.STORE_TYPE = 4 AND
DATE_SAL <= #UnloadDate# AND DATE_NEXT > #UnloadDate#
GROUP BY A.ID_GOODS,
S.NO366,
S.ID_STORE,
AC.TIME_APPLY,
AC.ID_SUBJECT,
case when isnullI.VIRTUAL,0 = 0 then 1 else 0 end


Заранее спасибо.
Top
luviaxingonia
Дата 21.12.2010 - 16:28
Цитировать сообщение




Unregistered












Здравствуйте Мне нужна помощь, я не могу составить запрос для MySQL базы...
Есть база, в ней таблица users в этой таблице нужно найти поле со значением "DOG". Как это сделать?
Top

Опции темы Ответ в темуСоздание новой темыСоздание опроса