Форум: "Базы";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
ВнизМедленно выполняется запрос Найти похожие ветки
← →
stoper (2003-01-24 11:52) [0]Работаю с MySQl совсем не давно. Пишу только второе приложение.Если с первым проблем не возникало, я так думаю из-за размеров баз, то со вторым большие проблемы. Суть вопроса такова. Нужно выбрать полностью движение товаров из документов за определенный период для дальнейшей обработки.Пишу например
select a.no,a.date4,b.name,c.value1,c.value2,c.value3
from form2 a, mgood2 b, fgood2 c
where ( binary a.fkcxkey=c.feyform ) and ( binary b.fkcxkey=c.feymgood)
and (a.date4>="2002-11-01") and (a.date4<="2002-11-30")
order by a.no, где form2-документы, mgood2-номенклатура, fgood2 - движняк товаров. В справочнике fgood2-200000 записей, в документах 200000. Такой запрос длится до 25 минут. Или приложение виснит совсем. Может кто подскажет что делается не так.
← →
kkot (2003-01-24 13:32) [1]А MDAC какой версии?
← →
stoper (2003-01-24 13:43) [2]Версия 1.20.0.6 for Delphi 5. Но хотелось бы пользоваться стандартными делфийскими компонентами. Так с ними вообще полная торба.
← →
ЮЮ (2003-01-25 03:58) [3]from form2 a, mgood2 b, fgood2 c
То что стоит после FROM, это не просто перечисление используемых таблиц, а, ИМХО, порядок организации связи (перемножения).
Судя по услвию в Where связь form2 - fgood2 - mgood2, потому следует писать
from form2 a, fgood2 c, mgood2 b
← →
ЮЮ (2003-01-25 06:22) [4]Более того, всегда может оказаться, что во 2-й или 3-ей таблице может не окаться записи, соответстующей записи в предыдущей таблице, поэтому лучше использовать конструкцию
from
form2 a
left join fgood2 c on a.fkcxkey = c.feyform
left join mgood2 b on c.feymgood = b.fkcxkey
where
(a.date4>="2002-11-01") and (a.date4<="2002-11-30")
К тому же такая запись более наглядно показывает связи и меньше шансов ошибиться
← →
Suntechnic (2003-01-25 07:22) [5]>ЮЮ ©
Вы бы разобрались с join операторами раз и на всю оставщуюся жизнь, а потом бы другим советовали. Уже второй раз вы здесь ерунду по поводу join-ов несёте. Тот запрос, что приведен сверху, аналогичен следующему join-у:
from
form2 a
inner join fgood2 c on a.fkcxkey = c.feyform
inner join mgood2 b on c.feymgood = b.fkcxkey
where
(a.date4>="2002-11-01") and (a.date4<="2002-11-30")
А left join вообще может другие результаты выдать (а может и те же самые, зависит от данных). Структуры базы не видно, но может, допустим, оказаться, что в базе есть документы товаров, которые в движении товаров не участвовали. Ваш запрос их как раз и вывалит.
И ещё... уж как писАть "from a, c, b" или "from a, b, c" значения точно не имеет.
← →
ЮЮ (2003-01-25 08:22) [6]Suntechnic, а ругается как сапожник :-)
В данном случае, когда условие только по таблице а, дейстительно без разницы, но если ставить условия по разным таблицам, то оно будет применено к результирующей выборке, а формат c JOIN позволяет чётко видеть куда накладываются ограничение.
Запросы
from
a
left join b on (a.b = b.ID) and (b.abc > 5)
Where a.bcd = 5
from
a
left join b on (a.b = b.ID)
Where (a.bcd = 5) and (b.abc > 5)
вернут разные результаты, но здесь как раз очевидно где и какие ограничения мы накладываем, а научиться писать только
from a,b where (a.b = b.ID) and (b.abc > 5) это не научиться писать совсем :-)
← →
Suntechnic (2003-01-25 09:25) [7]>ЮЮ ©
Да это я ещё не ругался, вы бы слышали как я ругаюсь :)
Не хотите меня слушать ваше право. Спорить и доказывать я вам ничего больше не собираюсь. Если не лень напишите простенький примерчик и посмотрите результат. Я лишь ограничусь кратким комментарием.
В данном случае таблицы "а" и "в" связываются через таблицу с. Если вы в своём запросе указываете, что делаете левый join таблицы "а" с таблицой "с", то это означает что в результете этого запроса, помимо записей поставленных друг другу в соответствие, вы получите записи из таблицы "а", которым нет соответствия в таблице "с". А с результатом этого набора вы опять делаете левый join, только уже на таблицу "b". И опять эти записи никуда не исчезают. В вопросе же явно указывается, что человеку надо сделать внутреннее связывание(что он собственно говоря и делает приведенным запросом)...
Вообщем поступайте как знаете, я свои посты сюда закончил
← →
Белка (2003-01-26 09:53) [8]Поставь индекса в БД на поля, по которым ведется связывание (fkcxkey,feyform,feymgood)
← →
BlackTiger (2003-01-26 13:00) [9]А не кто и не говорил, что мускул "хорошо" себя ведет на больших объемах данных.
Хотя, скорее всего, проблема в "full-scan", т.е. выборке без индексов полным проходом по набору данных.
Хотя индексами тоже увлекаться не стоит - упадет производительность ввода/удаления/изменения информации. Блюдите середину.
← →
stoper (2003-01-28 11:41) [10]Спасибо за ответы. Но дело в том что индексы по всем полям построены.С join точно такие же проблемы.Может ли это зависить от того что поля по которым строится связь имеют тип varchar
← →
stoper (2003-01-31 13:13) [11]Мастера, подскажите может я неправильно составил запрос. Не разобрался со связыванием таблиц. Или действительно MySQL плохо работает с большим набором даных.
← →
ЮЮ (2003-02-01 03:47) [12]Ну не знаток я возможностей синтаксиса MySQL :-)
Начни с одной таблицы
select * from form2 a
where
(a.date4>="2002-11-01") and (a.date4<="2002-11-30")
Если уже и здесь тормоза, то увы :-(. Есть ли индекс по date4?
И что означает binary в where ( binary a.fkcxkey=c.feyform ). Такой синтаксис вижу впервые
← →
fidget (2003-02-01 19:00) [13]> Мастера, подскажите может я неправильно составил запрос.
проверь с помощью EXPLAIN SELECT .. используются ли у тебя индексы.
> Может ли это зависить от того что поля по которым строится связь имеют тип varchar
они у тебя одинаковой длинны или разной? оптимизация запросов где поля varchar разной длинны идет хуже.
← →
stoper (2003-02-04 09:28) [14]Большое всем спасибо за помощь, особено fidget. Explain помог разобраться с проблемой.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c