![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
зависание приложения при выполнении запроса [D5, IB или FB]
GanibalLector © (2004-07-28 23:25:00)Имеется запрос (сложный запрос)так вот,когда я его создавал,то тестил на своей базе,где было небольшое кол-во данных.Все прекрасно работало.Так вот,когда пришел к клиенту и запустил этот запрос на реальной базе,то приложение просто повисло.Запустил его в IBExpert результат тот же.В чем трабл ???
Johnmen (2004-07-30 09:28:00) [1]Кстати. Всю процедуру НУЛЬ2 можно заменить одним запросом.
select plu,MIN(num)
from part
where kol=0
group by plu
having count(plu)>1
GanibalLector (2004-07-30 02:27:00) [2]>Что бы твоей прогой пользоваться, придётся заказывать машинное время в каком-нибудь суперкомпьютерном центре в силиконовой долине
Зачем так???Просто когда приложение разрабатывалось,заказчик не уточнил некоторые детали,которые всплыли после года работы.
После переговоров с заказчиком,тот согласился с доп.оплатой и написанием новой,более продуктивной версии.
VID (2004-07-30 01:38:00) [3]GanibalLector © (30.07.04 01:24) [21]
Что бы твоей прогой пользоваться, придётся заказывать машинное время в каком-нибудь суперкомпьютерном центре в силиконовой долине :)
GanibalLector (2004-07-30 01:24:00) [4]ВСЕМ СПАСИБО.
Запрос мой за ночь выполнился.7 часов потребовалось.После удаления данных из того запроса,запрос выполняется мгновенно(оно и понятно...за день может быть несколько нулевых партий).
Сделал вывод:переделать логику программы.Вот ЩА и начну...
З.Ы. По совету мастеров,создал индекс на поле num.Запустил...ждал около 30мин. дальше было в лом ждать...не выполнился.Но,все равно спасибо.
Johnmen (2004-07-29 16:16:00) [5]>Sergey Masloff (29.07.04 16:10) [19]
Пардон :0) Это же вью ! А я как-то в одну кучу все НУЛИ :)))
Sergey Masloff (2004-07-29 16:10:00) [6]Johnmen © (29.07.04 16:08) [18]
>У ZERO1 нет выходных параметров. Как что работает....
А какие у вьюхи выходные параметры? ;-)
Johnmen (2004-07-29 16:08:00) [7]Прикольно....:)
У ZERO1 нет выходных параметров. Как что работает....
Desdechado (2004-07-29 15:57:00) [8]Да у тебя вьюха с подзапросом и ХП с подзапросом.
Подзапрос здесь будет выполняться на каждую строку основного запроса.
А еще объединение результатов ХП с вьюхой индексы вообще не использует.
Ты план посмотри. И замени подзапросы на объединения.
ЮЮ (2004-07-29 03:04:00) [9]>Кстати...к зависанию приводит также и это :
>select * from zero1
а чего еще ожидать от
select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 )and kol=0;
а учитывая "Не...низя.Логика не позволяет.Существуют партии с одиноковыми plu и num." следует признать, что во время проектирования БД логика вообще отдыхала.
GanibalLector (2004-07-29 02:32:00) [10]2 GanibalLector © (29.07.04 01:01) [13]
Да что там...два поля всего основных.Поставлю на оба.
Не...низя.Логика не позволяет.Существуют партии с одиноковыми plu и num.
2 Sergey Masloff (28.07.04 23:44) [3]
коррелированый подзапрос работающий не по индексу даст то же самое "быстродействие"
А это как???Где читать?
GanibalLector (2004-07-29 01:02:00) [11]Кстати...к зависанию приводит также и это :
select * from zero1
или
select * from zero2
GanibalLector (2004-07-29 01:01:00) [12]>Вопрос в том, чтобы поставить нужные индексы
Да что там...два поля всего основных.Поставлю на оба.
GanibalLector (2004-07-29 00:58:00) [13]>А еще лучше - приведи запрос в студию
CREATE VIEW ZERO1(PLU,NUM)
AS
select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 ) and kol=0;
CREATE PROCEDURE ZERO2
RETURNS (
PLU CHAR(5) CHARACTER SET NONE,
NUM CHAR(8) CHARACTER SET NONE)
AS
DECLARE VARIABLE MM1 CHAR(5);
DECLARE VARIABLE MM CHAR(5);
begin
mm='';mm1='';
for select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 )
and kol=0 into :plu,:num do
begin
if ((plu=mm) and (mm<>mm1)) then begin
suspend;
mm1=mm;
end
mm=plu;
end
end
САМ ЗАПРОС:
select zero1.plu, zero1.num from ZERO1 left join zero2 on (zero1.num=zero2.num)
where zero2.num is null
Vlad (2004-07-29 00:54:00) [14]
> GanibalLector © (29.07.04 00:51) [9]
> Хорошо,ЩА поставлю индексы
Вопрос в том, чтобы поставить нужныеиндексы
> Вопрос...на сколько увеличится время выполнения???
Думаю что не НА сколько а ВО сколько... Вобщем - значительно.
А еще лучше - приведи запрос в студию.
DrPass (2004-07-29 00:54:00) [15]
> Вопрос...на сколько увеличится время выполнения???
По идее, оно все-таки уменьшится. А насколько - это зависит от того, КАК ты будешь создавать индексы. Если у тебя большие таблицы, и нет индексов/ключей (!!!), то может ускориться в несколько сотен раз...
GanibalLector (2004-07-29 00:51:00) [16]>Лучше займись оптимизацией самого SQL запроса и создай необходимые индексы
Да вроде и так оптимизировал по самые помидоры.Хорошо,ЩА поставлю индексы.Вопрос...на сколько увеличится время выполнения???
Vlad (2004-07-29 00:45:00) [17]
> GanibalLector © (29.07.04 00:40) [6]
Не надо заниматься ерундой. Тем более, подозреваю оно тебе не надо (потоки). Лучше займись оптимизацией самого SQL запроса и создай необходимые индексы
Vlad (2004-07-29 00:42:00) [18]Нет, вечный цикл тут не причем.
Долгие и неоптимизированные запросы действительно сжирают все ресурсы (во всяком случае в IB) и приложение не реагирует внешние воздействия.
GanibalLector (2004-07-29 00:40:00) [19]2 jack128
Хорошо...с этим вроде разобрались.
Еще вопросик...Теперь задача будет стоять в запуске отдельного потока и выполнении этого длительного запроса.Насколько мне помниться...вроде нельзя обращаться к компонентам из потока.Как быть ???
jack128 (2004-07-29 00:25:00) [20]
> Странно...а почему тогда при нажатии трех заветных клавиш
> "Диспетчер задач" говорит,что приложение "не отвечает".Или
> это нормально???
Сергей под "завис" подрузамевает, как мне кажется, вхождение программы в бесконечный цикл.
если на пишу
sleep(100000) то диспетчер напишет тоже самое..