![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Так чтобы побыстрей работало ... [D5, MSSQL]
Vikuksa © (2002-07-08 11:44:00)Please, help!!! Есть парочка вложенных запросов, пока выполняются можно помереть со скуки. Как сделать чтобы побыстрее работало?
Johnmen (2002-07-08 14:17:00) [21]Отвечу за Anatoly Podgoretsky © :
Каждой записи из Q1 ты сопоставляешь все записи из Q2.
А Q2 в данном случае должен быть совсем другим, ведь тебе надо фактически лишь знать, есть ли хоть одна запись в Q2. (см. COUNT(*))
Vikuksa (2002-07-08 14:02:00) [22]Anatoly, извини! Объясни дурехе где ты нашел произведение!
Vikuksa (2002-07-08 13:51:00) [23]Anatoly, Ты с какого дуба рухнул?
КАКОЕ ЕЩЕ ПРОИЗВЕДЕНИЕ?
Vikuksa (2002-07-08 13:49:00) [24]А ПО-НОРМАЛЬНОМУ ЕТО КАК?
Anatoly Podgoretsky (2002-07-08 13:49:00) [25]О да у тебя декартово произведение q1*q2
jonik pegas (2002-07-08 13:35:00) [26]Надо развлекать пользователя чтобы не скучал
(Например ProgressBar-ом или сообщениями "Идет выполнение запроса
осталось 10% или 1 Мин" с перекидывающей папки Avi-шкой):-)
Второй запрос сделать параметрическим
Telly_F (2002-07-08 13:34:00) [27]В добавление к Samalex1:
Еще глянь, а индексы по полям из where есть? Если есть - то какие? Попробуй с ними поработать...
samalex1 (2002-07-08 13:27:00) [28]Я что-то не понимаю, зачем функция CONVERT, может ее убрать?
Действительно, не стоит добавлять отдельно по-строчкам, можно все целиком. Или !!! используй параметрические запросы (:par заместо "+txt1+"), очень удобно, поверь, или хранимые процедуры в SQL, еще удобнее.
TSV (2002-07-08 12:52:00) [29]> Vikuksa (08.07.02 12:43)
Ты по-нормальному запрос написать можешь?
Vikuksa (2002-07-08 12:43:00) [30]ADOQuery1.Active := false;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add("SELECT T_Emitent.sng FROM T_Emitent left JOIN T_Emission ON ");
ADOQuery1.SQL.Add("T_Emitent.SN = T_Emission.SNE RIGHT OUTER JOIN T_SRVEmitent ON T_Emitent.SN = T_SRVEmitent.SNE ");
ADOQuery1.SQL.Add("WHERE (T_SRVEmitent.F1 = 1) AND (T_SRVEmitent.F9 = 1) GROUP BY T_Emitent.sng ");
ADOQuery1.SQL.Add("HAVING (MAX(T_Emission.DataReg) <= CONVERT(DATETIME,""1997 - 01 - 08 00 : 00 : 00 "", 102)) ");
ADOQuery1.Active := true;
while not ADOQuery1.Eof do
begin
txt1 := ADOQuery1.fieldbyname("sng").AsString;
ADOQuery2.Active := false;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add("SELECT T_Emitent.sng FROM T_Emitent RIGHT JOIN T_DocFace ON T_Emitent.SN = T_DocFace.SNE ");
ADOQuery2.SQL.Add("WHERE (T_Emitent.sng = "+txt1+")");
ADOQuery2.SQL.Add("GROUP BY T_Emitent.sng, T_DocFace.F1, T_DocFace.F2, ");
ADOQuery2.SQL.Add("T_DocFace.F3 HAVING (T_DocFace.F1 = 1) AND (T_DocFace.F3 = 4)AND(T_DocFace.F2 = "+IntToStr(pp)+")");
ADOQuery2.Active := true;
if not ADOQuery2.Eof then inc(ii);
ADOQuery1.Next;
end;
ВОТ ПРИМЕРЧИК! И ЧТО????????
Леша (2002-07-08 12:14:00) [31]Можно проидексировать таблицы.
-=Sergeante=- (2002-07-08 12:12:00) [32]> Vikuksa
Надо оптимизировать запрос :)
Val (2002-07-08 12:10:00) [33]>Vikuksa
наверное, пока выполняются, зашел сюда? :)
Johnmen (2002-07-08 11:54:00) [34]А где же сами запросы ???