Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / клиент-SQL сервер Очень тяжелый запрос. / 16 сообщений из 16, страница 1 из 1
24.08.2007, 00:50
    #34749470
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Имеется тяжелый запрос, результирующая таблица маленькая, но обработка на сервере занимает значительное время. В это время соответственно фокс ждет ответа от SQL сервера, приложение приобретает вид "висяка".
Можно ли сделать так, чтобы небыло данного эффекта "висяка"? Пока нашел только один выход, отдельныйм приложением запускается анимация (класс на фокс клаб), проблему полностью не снимает, однако хоть что-то видно, что приложение работает. Асинхронный режим работы не подходит, т.к. смысла в нем нет, т.е. результирующая таблица мала, и по времени, что ждать запрос в синхронном режиме, что в асинхронном - ждать пока SQLEXEC() вернет 0, по времени практически одинаково, соответственно эфект "висяка" присутствует.
Т.е. смысл вопроса в том: оставить данную проблему, т.к. это практически не решаемо, либо решение находится где то рядом.
...
Рейтинг: 0 / 0
24.08.2007, 01:15
    #34749481
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Поток запусти. Не асинхронный запрос, а именно код в потоке.
...
Рейтинг: 0 / 0
24.08.2007, 08:54
    #34749644
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Я тут кое-какие заготовки для одного проекта делаю (кассовая прога), работать должна автономно с периодическим выходом на связь, причем во время связи основная работа прерываться не должна. Наиболее удобным вариантом, на мой взгляд, будет асинхронный запрос + таймер. Тестил на большой базе с долгими запросами - работает, но потестить на базе, где активно работают и есть блокировки - нет возможности.
В аттаче формочка, основной код в таймере, остальное должно быть и так понятно. Попробуй свой запрос, отпишись что получилось, а то может надо другой способ изобретать.
...
Рейтинг: 0 / 0
24.08.2007, 09:20
    #34749673
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Если сервер MSSQL, то приведите план запроса, возможно сам запрос можно "тюнинговать"
...
Рейтинг: 0 / 0
24.08.2007, 11:10
    #34750057
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Options
Optimization goal: First-row
ANSI update constraints: Cursors
Optimization level: 9
Select list
expr() varchar(20)
expr() numeric(30,2)
Estimates
EstRowCount: 1.5223e+005
EstRunTime: 1099.5
EstDiskReads: 9.8319e+005
EstDiskWrites: 3765
EstDiskReadTime: 495.13
EstDiskWriteTime: 1.8825
EstCpuTime: 602.51
Тут еще идет транспонирование таблицы :)

Dima T посмотрю.
...
Рейтинг: 0 / 0
24.08.2007, 11:22
    #34750122
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Посмотрел,
время выполнения: 57.78
Работа: 0.01 (~140 строк)
...
Рейтинг: 0 / 0
24.08.2007, 11:40
    #34750196
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Единственное, что пока нашел:
http://www.foxclub.ru/sol/index.php?act=view&id=357
...
Рейтинг: 0 / 0
24.08.2007, 11:50
    #34750237
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
GoshaSПосмотрел,
время выполнения: 57.78
Работа: 0.01 (~140 строк)
Я правильно понял что все записи "Работа:..." по 0.01 сек. ? Т.е. максимальное время разового прерывания 0.01 сек. Тогда "висяка" у тебя не должно быть, пользователь в это время может даже комфортно работать в другой форме, а в этой можешь в таймер какую-нибудь анимацию добавить, например писать "уже ждем ... сек.", по окончанию написать "нажмите кнопку для вывода результата", а по кнопке вывод в отчет или куда там тебе нужно.

И второе, это уже спортивное любопытство, при синхронном запросе на сколько быстрее запрос отрабатывает?
...
Рейтинг: 0 / 0
24.08.2007, 12:09
    #34750343
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Вермя выполнения 57, т.е. 57 секунд приложение висит, а то что 140 раз по 0,01сек, т.е. 1,5 секунды погоды не делают.
При синхронном пакетном режиме - фокс "оживает" на данные 1,5 секунды позже, согласитесь, что 1,5 секунды ничто, по сравнению с минутой :)
...
Рейтинг: 0 / 0
24.08.2007, 12:42
    #34750541
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
GoshaSВермя выполнения 57, т.е. 57 секунд приложение висит, а то что 140 раз по 0,01сек, т.е. 1,5 секунды погоды не делают.
При синхронном пакетном режиме - фокс "оживает" на данные 1,5 секунды позже, согласитесь, что 1,5 секунды ничто, по сравнению с минутой :)
Или я не так понимаю, или ты. Почему висит? У меня складывается впечатление что понимание происходящего у нас разное.
Принцип работы того что в моей форме:
Кнопка запускает таймер с интервалом 500 мс (в твоем случае можно 1-2 секунды поставить).
Таймер при первом срабатывании устанавливает соединение и передает серверу запрос, при последующих срабатываниях таймера проверка на завершение запроса, по завершению вывод в грид и остановка таймера. Между срабатываниями таймера - ожидание действий пользователя (в твоем случае 490 мс из 500 мс).
При каждом срабатывании фиксируется время сколько таймер затратил на выполнение своего кода 0.01 сек * 140 раз = 1.4 сек., т.е. за 57 сек. (странно, должно быть 70 = 140 раз * 500 мс) только 1.4 сек. ушло у фокса на ожидание запроса, остальные 55,6 сек. он ожидал действий пользователя. Если ты (как пользователь) в это время ничего не делал, то прога простаивала. Попробуй пока эта форма работает еще одну открыть. Это я к тому что если сделать немодальную форму с privatedatasession, то пользователь может форму свернуть и работать в проге дальше. А как запрос выполнится, вернуться в форму и сохранить результаты запроса.

т.е. своего рода эмуляция многопоточности получилась.
...
Рейтинг: 0 / 0
24.08.2007, 12:44
    #34750551
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
GoshaS
EstRowCount: 1.5223e+005
EstRunTime: 1099.5
EstDiskReads: 9.8319e+005
EstDiskWrites: 3765
Тут еще идет транспонирование таблицы :)


1. Текст самого запроса
2. Скрипт таблиц (что-то мне подсказывает, что с индексами на таблицах не густо)
3. Где оценосное время транспонирования или хотя бы размер курсора для транспонирования
...
Рейтинг: 0 / 0
24.08.2007, 14:43
    #34751054
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
2 Dima T
Не совсем правильно. Работа в асинхронном пакетном режиме.
Программа:
1-отсылает запрос на сервер
2-ожидает пока SQLEXEC() вернет 0, т.е. признак, что первая партия запроса готова, обычно 100 строк. В это время сервер упорно трудится над запросом. Пока SQLEXEC() не вернет 0, программа ожидает и появляется эффект "висяка". На моем запросе это время ~1 минута.
3-SQLEXEC() вернула 0. Программа оживает и начинает получать данные с сервера, пока SQLEXEC() не вернет 1. В зависимости от структуры запроса, запрос уже обработан полностью, либо продолжает обрабатываться на сервере. У вас это отмеченно как "работа", в моем случае, фактически получение остальных данных с сервера, что занимает 0.01 сек. за один цыкл. и 1,5 секунды в общем на данный этап.
4-SQLEXEC() вернула 1. Все данные с сервера получены.
Это как я понимаю структуру работы :)
2 PaulWist
SQL сервер - Sybase SQL ASA 8
сам запрос отсылать думаю не имеет смысла, т.к. без знания структуры базы это мало о чем скажет. Тем более без доп. пояснений. А вот этого я вам и не могу сказать.
Скажу только одно, что от разработчика ПО данный отчет обрабатывается около 5-и часов, у меня в общей сложности 2 с небольшим минуты.
...
Рейтинг: 0 / 0
24.08.2007, 15:00
    #34751144
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
по вашей форме.
Пока идет обработка на сервере, SQLEXEC не вернула 0, в течении минуты, я не могу ни свернуть форму, ни сдвинуть ее куда либо, на закрытие Windows кричит что приложение зависло, типа подождать или сразу прибить процесс?
...
Рейтинг: 0 / 0
24.08.2007, 15:25
    #34751249
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
GoshaS 2 Dima T
Не совсем правильно. Работа в асинхронном пакетном режиме.
Программа:
1-отсылает запрос на сервер
2-ожидает пока SQLEXEC() вернет 0, т.е. признак, что первая партия запроса готова, обычно 100 строк. В это время сервер упорно трудится над запросом. Пока SQLEXEC() не вернет 0, программа ожидает и появляется эффект "висяка". На моем запросе это время ~1 минута. ...
Как я понимаю в моей формочке записи о времени у тебя примерно такие:
Соединение: 0.50
Работа: 60.00
Работа: 0.01
Работа: 0.01
...

Так пишет? Если так, то это подвешивает драйвер Sybase, т.к. с MS-SQL 2000 такого не происходит.
Только-что запустил долгоиграющую хранимку (секунд 10 из них 8 работа сервера остальное возврат результата) никаких зависаний, форма сворачивается, другие запускаются.
...
Рейтинг: 0 / 0
24.08.2007, 15:39
    #34751309
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
GoshaS 2 PaulWist
SQL сервер - Sybase SQL ASA 8
сам запрос отсылать думаю не имеет смысла, т.к. без знания структуры базы это мало о чем скажет. Тем более без доп. пояснений. А вот этого я вам и не могу сказать.
Скажу только одно, что от разработчика ПО данный отчет обрабатывается около 5-и часов, у меня в общей сложности 2 с небольшим минуты.

Ну, как хотите, в принципе правила построения условий запросов в разных БД похожи.
...
Рейтинг: 0 / 0
24.08.2007, 15:42
    #34751323
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
клиент-SQL сервер Очень тяжелый запрос.
Недавно обсуждали : VFP+Postgre при CREATE REMOTE VIEW происходило выполнение запроса на серваке вместо проверки синтаксиса. Были подозрения на драйвер или взаимодействие фокса с драйвером, чем кончилось - автор не отписался.
Похоже все-таки заточка фокса под MS-SQL довольно серьезная.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / клиент-SQL сервер Очень тяжелый запрос. / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]