powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Долго выполняется SELECT
31 сообщений из 31, показаны все 2 страниц
Долго выполняется SELECT
    #36151873
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток.

Помогите, пожалуйста, решить проблему. В программе создается ODBC-соединение с удаленной базой Informix, на что тратится ~20 сек. Затем, используя дескриптор этого соединения, делается простой запрос на выборку типа: "SELECT * FROM ... ORDER BY ...". Так вот этот запрос тоже выполняется ~20 сек. Не могу понять почему. Такое впечатление, что подключение заново создается. Исходная таблица содержит всего 534 записи. Был некий опыт работы с Oracle, но там и при сотнях тысяч записей такие "грабли" не проявлялись.
Подскажите в чем может быть дело?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36151978
mvictor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сеть ? (стабильность, ping )
tracert ? - может вы к своему серверу через австралию ходите
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36151998
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, с сетью все Ok. Опять же основная надстройка (на Delphi писаная) работает нормально.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152007
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А delphi через тот же ODBC ходит? c точно такойже строкой соединения?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152009
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, пробовал всю процедуру повторить на C++Builder + ADO - все нормально, а вот Фокс "кашляет"
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152019
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АлексейОА delphi через тот же ODBC ходит? c точно такойже строкой соединения?

Delphi, похоже, ходит так же, только еще и через BDE
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152054
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю что "кашляет" не фокс а ODBC.
можно проверить/обновить ODBC драйвер, а можно сделать курсор адаптер на ADO соединении.
в случае с Ms SQL это было у меня быстрее.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152073
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АлексейОДумаю что "кашляет" не фокс а ODBC.
можно проверить/обновить ODBC драйвер, а можно сделать курсор адаптер на ADO соединении.
в случае с Ms SQL это было у меня быстрее.

А ничего, что в связи с отсутствием OLE DB провайдера для Informix придется пользоваться универсальным, т.е. ODBC-шным ?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152271
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А запрос случайно не параметрезированный ?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152278
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=-А запрос случайно не параметрезированный ?

Нет, самый простой запрос.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152881
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот у меня такое впечатление, что при запросе не используется созданное ранее соединение, а на его основе строится новое. Может быть нужно как-то указать чтобы использовалось ранее созданное?

По алгоритму программы соединение создается после вводе логина и пароля при входе в программу функцией SQLSTRINGCONNECT (или SQLCONNECT). Затем из меню главной формы вызываю новую, в INIT() которой делается запрос. Что не так?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152898
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код приведите. Как именно делаете запрос к серверу?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152910
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМКод приведите. Как именно делаете запрос к серверу?

вот так:

Код: plaintext
1.
2.
3.
lcConnString = "DSN=test;DB=pxbank;HOST=10.0.50.50;SERV=sqlexec;SRVR=ontest;PRO=olsoctcp;" + ;
		"UID=" + lcUserLog + ";PWD=" + lcUserPas
lnConnHandle = SQLSTRINGCONNECT(lcConnString)
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152918
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий Р.ВладимирМКод приведите. Как именно делаете запрос к серверу?

вот так:

Код: plaintext
1.
2.
3.
lcConnString = "DSN=test;DB=pxbank;HOST=10.0.50.50;SERV=sqlexec;SRVR=ontest;PRO=olsoctcp;" + ;
		"UID=" + lcUserLog + ";PWD=" + lcUserPas
lnConnHandle = SQLSTRINGCONNECT(lcConnString)


то есть это подключение, а запрос вот:

Код: plaintext
1.
2.
lcSQLText = "SELECT * FROM informix.bst_creddebtors ORDER by short_name"
lnCursorCount = SQLEXEC(gnConnHandle, lcSQLText, "CredDogList")
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152946
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnConnHandle = SQLSTRINGCONNECT(lcConnString)
lnCursorCount = SQLEXEC( gnConnHandle , lcSQLText, "CredDogList")

Это опечатка ?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152968
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=- lnConnHandle = SQLSTRINGCONNECT(lcConnString)
lnCursorCount = SQLEXEC( gnConnHandle , lcSQLText, "CredDogList")

Это опечатка ?

Нет. lnConnHandle возвращается функцией и присваивается глобальной gnConnHandle.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36152994
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мужыки то и не знают (С)

ну тогда у вас запрос выполняеться в открытом соединении.

если выполнить этот же запрос второй раз - скорость увеличиваеться ?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153008
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-=AlexiS=-а мужыки то и не знают (С)

ну тогда у вас запрос выполняеться в открытом соединении.

если выполнить этот же запрос второй раз - скорость увеличиваеться ?

Увы. При последующих аналогичных запросах та же картина маслом.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153156
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я спрашивал не про аналогичные , а про точно такой-же.
собственно тут фокс как-бы и не причем.
он всего-лишь "говорит" ODBC какой запрос выполнить и принимает ответ.

с информиксом не работал , но почему спрашивал про повторы- например в MS SQL при первом запуске запроса после долгого простоя или после запуска самого сервера могут быть долгими , а вот последующие - уже быстро проходят.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153173
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я тоже имел ввиду точно такой же.
Про MS SQL не знаю, не сталкивался.
Кстати, если подключение и запрос выполнять в одной процедуре, то затрачивается только ~20 сек., а если так, как у меня - в два раза дольше. Непонятно ...
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153661
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий Р.
Код: plaintext
1.
2.
3.
4.
5.
6.
lcConnString = "DSN=test;DB=pxbank;HOST=10.0.50.50;SERV=sqlexec;SRVR=ontest;PRO=olsoctcp;" + ;
		"UID=" + lcUserLog + ";PWD=" + lcUserPas
lnConnHandle = SQLSTRINGCONNECT(lcConnString)

lcSQLText = "SELECT * FROM informix.bst_creddebtors ORDER by short_name"
lnCursorCount = SQLEXEC(gnConnHandle, lcSQLText, "CredDogList")


мне кажется этот код вообще не должен работать. я бы написл так:

lcConnString = "DSN=test;DB=pxbank;HOST=10.0.50.50;SERV=sqlexec;SRVR=ontest;PRO=olsoctcp;" + ;
"UID=" + lcUserLog + ";PWD=" + lcUserPas
lnConnHandle = SQLSTRINGCONNECT(lcConnString)

lcSQLText = "SELECT * FROM informix.bst_creddebtors ORDER by short_name"
lnCursorCount = SQLEXEC( lnConnHandle , lcSQLText, "CredDogList")
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153866
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to АлексейО

Возможно Вы не совсем внимательно читали обсуждение, но я поясню подробней.

В головном модуле объявляется глобальная переменная gnConnHandle , которая по задумке будет содержать дескриптор моего соединения. Затем, в процессе регистрации пользователя (это естественно отдельная форма), с помощью функции генерации подключения ей присваивается конкретное значение, в зависимости от которого делается вывод об удачном/неудачном соединении с базой. Первые две строки взяты из функции генерации подключения и перемення lnConnHandle - это ее локальная переменная, передаваемая из функции. А две последние строки взяты из кода события INIT() отдельной формы, вызываемой при необходимости из меню пользователем.

Все работает ... но медленно, что, собственно, и не устраивает.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153899
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе выход есть. Он заключается в хранении результата запроса в таблице временной базы фокса. Эта таблица фактически представляет собой справочник, который обновляется ежедневно в начале работы, хотя возможно повторное обновление, но не часто. Однако кроме этого мне понадобятся регулярные запросы на обновление некоторых таблиц Informix (ввод платежек, например).
Поэтому беспокоит не будут ли и эти запросы так долго работать, что не допустимо.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36153931
pitermax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на самом серваке за сколько выполняется запрос?
Может все-таки канал?
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154009
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, если подключение и запрос выполнять в одной процедуре, то затрачивается только ~20 сек., а если так, как у меня - в два раза дольше. Непонятно ...
вот это точно непонятно.
по идее этого не должно быть .

еще раз :
если выполнить просто запрос 2 раза подряд

Код: plaintext
1.
2.
lcSQLText = "SELECT * FROM informix.bst_creddebtors ORDER by short_name"
lnCursorCount = SQLEXEC(lnConnHandle, lcSQLText, "CredDogList_1")
lnCursorCount = SQLEXEC(lnConnHandle, lcSQLText, "CredDogList_2")
второй запрос выполниться быстрее или так-же долго ?
т.е. не через некоторое время , а именно вот так - тупо один за другим .
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154011
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мы с сервером "сидим" в одной комнате. База представляет собой тестовый слепок основной базы. Есть приобретенный комплекс "Операционный день банка", писаный на Delphi. Если я со своего компа запускаю этот комплекс, то проверка логина и пароля, а значит и подключение, происходит за те же ~20 сек., но открытие форм с таблицами происходит мгновенно. Могу еще добавить, что сервер работает под Linux-ом, хотя по-моему это не имеет значения.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154305
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий Р.Возможно Вы не совсем внимательно читали обсуждение, но я поясню подробней.
ну возможно.
Юрий Р.В головном модуле объявляется глобальная переменная gnConnHandle
раз у вас все равно есть глобальная переменная , дак присойте значение прямо ей и её используйте везде.
ну... хотя бы ради проверки.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154394
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to -=AlexiS=-

Последовал Вашему совету и ... получил шок! Стыдно признаться, но как оказалось в задержке вообще виноват не запрос (установлено опытным путем). Но возник новый вопрос: а что же тогда задерживает визуализацию формы? На форме только три элемента: Shape, Label и ComboBox. Текст в теле события Init() привожу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
LOCAL lcSQLText as String, lnCursorCount as Number

lcSQLText = "SELECT * FROM informix.bst_creddebtors ORDER by short_name"

IF gnConnHandle >  0            && проверка наличия подключения к базе

   lnCursorCount = SQLEXEC(gnConnHandle, lcSQLText, "CredDogList")

   IF lnCursorCount <  0 
  
     = MESSAGEBOX("Данные списка кредитных договоров не получены.",  16 , "Ошибка")

      RETURN .F.
 
   ELSE
 
     * setup - свободная dbf-таблица

     IF creddoglist.workodb_day != setup.dtcurrcash

	  lcMessText = "Дата создания списка договоров" + DTOC(creddoglist.workodb_day) + CHR( 13 ) + ;
	 		"не совпадает с датой кассового дня " + DTOC(setup.dtcurrcash)

	 = MESSAGEBOX(lcMessText,  16 , "Ошибка")

	 USE IN creddoglist
	 RETURN .F.

      ELSE

         thisform.cboFindCred.ColumnCount =  3 
	 thisform.cboFindCred.RowSourceType =  2 
	 thisform.cboFindCred.RowSource = "creddoglist.short_name, adress, p_data"
	 thisform.cboFindCred.SetFocus

   ENDIF

ENDIF
	
ENDIF

Больше в этой форме никакого кода нет. Ситуация, на мой взгляд, еще больше запуталась.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154514
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что Вам сказать, коллеги? Создал я полный аналог "вредной" формы, даже старые контролы туда перенес, и никаких проблем, все летает. Отсюда делаю вывод, что каким-то образом были запорчены SCT/SCX - файлы, хотя никаких "аварийных" ситуаций не возникало. Вопрос: как в дальнейшем избежать таких "грабель"?

Огромное спасибо всем, кто пытался помочь. Спасибо и тем, кто просто читал. Ну и отдельная блогодарность -=AlexiS=- за особо ценный совет, иначе я бы еще долго бился головой о стену.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154698
Sea_Cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Юрий Р.,

Задержка с визуализацией формы случается, в частности, когда в SET PATH попадает ссылка на недоступный или отсутствующий сетевой ресурс - даже если все нужные файлы лежат в текущей папке. Видимо, при открытии файлов в DE Fox пытается просмотреть все возможные пути, а 20 секунд - это время таймаута. Посмотрите эту форму на предмет "висящих" ссылок.
...
Рейтинг: 0 / 0
Долго выполняется SELECT
    #36154823
Юрий Р.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Sea_Cat

Ну наконец-то! Просмотрел содержимое SCX и обнаружил в секции Data Environment остатки своих экспериментов, про которые я и забыл совсем. Там действительно присутствует процедура BeforOpenTable в которой создается подключение к базе на основе ADO - это я пробовал разные варианты, потом очистил, как мне казалось, Data Environment и забыл. Впредь буду осторожней. Большое спасибо! Разобрались.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Долго выполняется SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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