Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

зависание приложения при выполнении запроса   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.031 c
14-1091606736
Igorek
2004-08-04 12:05
2004.08.22
Система реального времени


1-1091533364
начинающий
2004-08-03 15:42
2004.08.22
Есть ли CRC в TDecompressionStream?


14-1091007987
Gero
2004-07-28 13:46
2004.08.22
Электронные книги


1-1091599431
*Pavel
2004-08-04 10:03
2004.08.22
Печать TImage


3-1091005053
Manfred
2004-07-28 12:57
2004.08.22
TClientDataSet.Locate ничего не находит