Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что использовать вместо RELATION? / 5 сообщений из 5, страница 1 из 1
14.07.2004, 14:26
    #32603925
Pant
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что использовать вместо RELATION?
Суть задачи:
В одной DBF есть два поля t1.kod1 и t1.kod2. В зависимости от условия берется то или другое поле IIF(t1.kod1=s,t1.kod1,t1.kod2) и к нему по RELATION привязывается запись из другой таблицы t2.kod (один к одному).
Когда делаю так, и в грид засовываю t1 с записями из t2, то все бегает моментально.
Понадобилось все это с этими же условиями загнать в третью таблицу и потом в грид. Использую SCAN t1 сортированный по t1.kod1, SEEK t2.kod и по INSERT добавляю в t3.
Вопрос в том, что теперь это все работает раз в 10 медленнее.
Может быть я принципиально неправильно подхожу?
...
Рейтинг: 0 / 0
19.07.2004, 11:18
    #32610114
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что использовать вместо RELATION?
Для такого простого случая, для формирования временной таблицы надо использовать Select-SQL или Local View.

Но вообще-то, надо посмотреть на код формирования этой временной таблицы. Есть масса уловок позволяющих оптимизировать (читай "ускорить") выполннение.

Например, если SCAN выполняется по всей таблице, то желательно перед его выполнение сбросить главный индекс сканируемой таблицы:

select MyTab
SET ORDER TO 0
SCAN
...
ENDSCAN
...
Рейтинг: 0 / 0
27.07.2004, 12:25
    #32622943
Pant
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что использовать вместо RELATION?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE DOG FREE ()
SELECT  0 
USE t2.DBF SHARED 
SET ORDER TO kod
nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
SELECT  0 
USE t1.dbf SHARED
SET ORDER TO kod1
kk=t1.kod1
SCAN 
  IF kk<>t1.kod1
    kk=IIF(t1.kod1= 4466 ,t1.kod2,t1.kod1)
    SELECT t2
    IF SEEK(kk)
      nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
     ELSE
       STORE '' TO nn
    ENDIF
  ENDIF
  INSERT INTO DOG ()
  SELECT t1
ENDSCAN

А SELECT-SQL у меня еще медленнее работал, чем SCAN
...
Рейтинг: 0 / 0
27.07.2004, 15:02
    #32623480
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что использовать вместо RELATION?
1) В исходном варианте, когда ты связал таблицы по RELATION ты же не создавал никаких дополнительных таблиц. Отсюда и скорость отображения. Кроме того, в Grid (или BROWSE) закачиваются не сразу вся таблица, а только та часть, которая собственно отображается. Далее подкачка по необходимости

2) Можно использовать ту же связь по RELATION и для закачки информацию во временную таблицу

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE DOG FREE ()
SELECT  0 
	USE t2.DBF SHARED 
	SET ORDER TO kod
SELECT  0 
	USE t1.dbf SHARED
	SET ORDER TO  [b]0 [/b]
	SET RELATION TO IIF(t1.kod1= 4466 ,t1.kod2,t1.kod1) INTO t2
SCAN
	nn=ALLTRIM(t2.n1)+ALLTRIM(t2.n2)
	INSERT INTO DOG ()
ENDSCAN

Для оценки скорости, закомментируйте команду INSERT и посмотрите сколько времени уйдет на простое сканирование таблицы t1. Собственно, это и будет примерное время записи во временную таблицу
...
Рейтинг: 0 / 0
27.07.2004, 16:03
    #32623691
Pant
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что использовать вместо RELATION?
В этом варианте стало работать быстрей примерно на 1/5. А если Insert убрать, то работает быстрей примерно на столько же.
Базы огромные, и информация берется не с 2 баз, а из 6, так что любое убыстрение весьма ощутимо.
Спасибо, Владимир.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Что использовать вместо RELATION? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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