Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Вниззависание приложения при выполнении запроса Найти похожие ветки
← →
GanibalLector © (2004-07-28 23:25) [0]Имеется запрос (сложный запрос)так вот,когда я его создавал,то тестил на своей базе,где было небольшое кол-во данных.Все прекрасно работало.Так вот,когда пришел к клиенту и запустил этот запрос на реальной базе,то приложение просто повисло.Запустил его в IBExpert результат тот же.В чем трабл ???
← →
Vlad © (2004-07-28 23:35) [1]
> В чем трабл ???
Вероятнее всего - в самом запросе и/или отсутствии необходимых индексов.
← →
Sergey Masloff (2004-07-28 23:42) [2]GanibalLector © (28.07.04 23:25)
Ничего не зависло. Просто выполняется долго. Множишь где-то таблицы. И получается скажем порядка O(n^3) время выполнения. Такой запрос на 30 записях отработает за секунду а на 1000(в 30 раз больше записей) - за 8 часов.
← →
Sergey Masloff (2004-07-28 23:44) [3]Да, если даже не множишь таблицы то коррелированый подхапрос работающий не по индексу даст то же самое "быстродействие" - Vlad(c) прав
← →
GanibalLector © (2004-07-29 00:20) [4]>Ничего не зависло.
Странно...а почему тогда при нажатии трех заветных клавиш "Диспетчер задач" говорит,что приложение "не отвечает".Или это нормально???
← →
jack128 © (2004-07-29 00:25) [5]
> Странно...а почему тогда при нажатии трех заветных клавиш
> "Диспетчер задач" говорит,что приложение "не отвечает".Или
> это нормально???
Сергей под "завис" подрузамевает, как мне кажется, вхождение программы в бесконечный цикл.
если на пишу
sleep(100000) то диспетчер напишет тоже самое..
← →
GanibalLector © (2004-07-29 00:40) [6]2 jack128
Хорошо...с этим вроде разобрались.
Еще вопросик...Теперь задача будет стоять в запуске отдельного потока и выполнении этого длительного запроса.Насколько мне помниться...вроде нельзя обращаться к компонентам из потока.Как быть ???
← →
Vlad © (2004-07-29 00:42) [7]Нет, вечный цикл тут не причем.
Долгие и неоптимизированные запросы действительно сжирают все ресурсы (во всяком случае в IB) и приложение не реагирует внешние воздействия.
← →
Vlad © (2004-07-29 00:45) [8]
> GanibalLector © (29.07.04 00:40) [6]
Не надо заниматься ерундой. Тем более, подозреваю оно тебе не надо (потоки). Лучше займись оптимизацией самого SQL запроса и создай необходимые индексы
← →
GanibalLector © (2004-07-29 00:51) [9]>Лучше займись оптимизацией самого SQL запроса и создай необходимые индексы
Да вроде и так оптимизировал по самые помидоры.Хорошо,ЩА поставлю индексы.Вопрос...на сколько увеличится время выполнения???
← →
DrPass © (2004-07-29 00:54) [10]
> Вопрос...на сколько увеличится время выполнения???
По идее, оно все-таки уменьшится. А насколько - это зависит от того, КАК ты будешь создавать индексы. Если у тебя большие таблицы, и нет индексов/ключей (!!!), то может ускориться в несколько сотен раз...
← →
Vlad © (2004-07-29 00:54) [11]
> GanibalLector © (29.07.04 00:51) [9]
> Хорошо,ЩА поставлю индексы
Вопрос в том, чтобы поставить нужные индексы
> Вопрос...на сколько увеличится время выполнения???
Думаю что не НА сколько а ВО сколько... Вобщем - значительно.
А еще лучше - приведи запрос в студию.
← →
GanibalLector © (2004-07-29 00:58) [12]>А еще лучше - приведи запрос в студию
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
← →
GanibalLector © (2004-07-29 01:01) [13]>Вопрос в том, чтобы поставить нужные индексы
Да что там...два поля всего основных.Поставлю на оба.
← →
GanibalLector © (2004-07-29 01:02) [14]Кстати...к зависанию приводит также и это :
select * from zero1
или
select * from zero2
← →
GanibalLector © (2004-07-29 02:32) [15]2 GanibalLector © (29.07.04 01:01) [13]
Да что там...два поля всего основных.Поставлю на оба.
Не...низя.Логика не позволяет.Существуют партии с одиноковыми plu и num.
2 Sergey Masloff (28.07.04 23:44) [3]
коррелированый подзапрос работающий не по индексу даст то же самое "быстродействие"
А это как???Где читать?
← →
ЮЮ © (2004-07-29 03:04) [16]>Кстати...к зависанию приводит также и это :
>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." следует признать, что во время проектирования БД логика вообще отдыхала.
← →
Desdechado © (2004-07-29 15:57) [17]Да у тебя вьюха с подзапросом и ХП с подзапросом.
Подзапрос здесь будет выполняться на каждую строку основного запроса.
А еще объединение результатов ХП с вьюхой индексы вообще не использует.
Ты план посмотри. И замени подзапросы на объединения.
← →
Johnmen © (2004-07-29 16:08) [18]Прикольно....:)
У ZERO1 нет выходных параметров. Как что работает....
← →
Sergey Masloff (2004-07-29 16:10) [19]Johnmen © (29.07.04 16:08) [18]
>У ZERO1 нет выходных параметров. Как что работает....
А какие у вьюхи выходные параметры? ;-)
← →
Johnmen © (2004-07-29 16:16) [20]>Sergey Masloff (29.07.04 16:10) [19]
Пардон :0) Это же вью ! А я как-то в одну кучу все НУЛИ :)))
← →
GanibalLector © (2004-07-30 01:24) [21]ВСЕМ СПАСИБО.
Запрос мой за ночь выполнился.7 часов потребовалось.После удаления данных из того запроса,запрос выполняется мгновенно(оно и понятно...за день может быть несколько нулевых партий).
Сделал вывод:переделать логику программы.Вот ЩА и начну...
З.Ы. По совету мастеров,создал индекс на поле num.Запустил...ждал около 30мин. дальше было в лом ждать...не выполнился.Но,все равно спасибо.
← →
VID © (2004-07-30 01:38) [22]GanibalLector © (30.07.04 01:24) [21]
Что бы твоей прогой пользоваться, придётся заказывать машинное время в каком-нибудь суперкомпьютерном центре в силиконовой долине :)
← →
GanibalLector © (2004-07-30 02:27) [23]>Что бы твоей прогой пользоваться, придётся заказывать машинное время в каком-нибудь суперкомпьютерном центре в силиконовой долине
Зачем так???Просто когда приложение разрабатывалось,заказчик не уточнил некоторые детали,которые всплыли после года работы.
После переговоров с заказчиком,тот согласился с доп.оплатой и написанием новой,более продуктивной версии.
← →
Johnmen © (2004-07-30 09:28) [24]Кстати. Всю процедуру НУЛЬ2 можно заменить одним запросом.
select plu,MIN(num)
from part
where kol=0
group by plu
having count(plu)>1
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.031 c